#java #algorithm #counter #quick-union
#java #алгоритм #счетчик #быстрое соединение
Вопрос:
В настоящее время я зачислен на курс алгоритмов Принстона (часть 1), и в нем говорится об улучшении алгоритма быстрого объединения путем сохранения дополнительного массива sz [i] для подсчета количества объектов в дереве с корнем i, но не показано, как это сделать.
Где и как предполагается реализовать этот счетчик? Я пытался сделать это в корневом методе, но понял, что он не будет учитывать дочерние элементы данного объекта.
Это неизмененный код, приведенный в курсе:
public class QuickUnionUF {
private int[] id;
public QuickUnionUF(int N) {
id = new int[N];
for (int i = 0; i < N; i ) id[i] = i;
}
private int root(int i) {
while (i != id[i]) i = id[i];
return i;
}
public boolean connected(int p, int q) {
return root(p) == root(q);
}
public void union(int p, int q) {
int i = root(p);
int j = root(q);
id[i] = j;
}
}
Ответ №1:
Чтобы выполнить взвешенное объединение, вам нужно знать вес каждого дерева, поэтому создайте параллельный массив, wt[]
где wt[k]
содержится размер дерева с корнем k
. Начальные веса равны 1.
Приклейте меньшее дерево к корню большего дерева и обновите вес
public void union(int p, int q) {
int i = root(p);
int j = root(q);
if wt[i] < wt[j] {
id[i] = j;
wt[j] = wt[i]
}
else {similar for j->i}
}
Инициализация
public class QuickUnionUF {
private int[] id;
private int[] wt;
public QuickUnionUF(int N) {
id = new int[N];
wt = new int[N];
for (int i = 0; i < N; i ) {
id[i] = i;
wt[i] = 1;
}
}
Комментарии:
1. Хорошо! но теперь… как может быть реализован этот параллельный массив? Я просмотрел несколько видеороликов на YouTube, и ни одно из них не объясняет эту часть кода.
2. Аналогично id[]. Добавлен код.
3. Вау … это действительно было так просто … большое вам спасибо!!