Я рассматриваю непересекающиеся множества, которые поддерживают функцию Союза.Объединение непересекающихся множеств
Методика уменьшения высоты дерева:
Мы всегда сливаться меньшее дерево, тем больше один, то есть мы делаем корень меньшего дерева, чтобы указать на корень дерева больше.
Дерево больше другого, если оно имеет больше узлов.
Каждый узел представляет собой структуру с полями: некоторая информация для элемента, указатель «родительский» родительскому узлу и счетчик «счет», который используется только в том случае, если узел является корнем и содержит количество узлы в верхнем дереве.
Следующий алгоритм объединяет два вверх деревья:
pointer UpTreeUnion(pointer S,T) {
if (S == NULL OR P == NULL) return;
if (S->count >= T->count) {
S->count = S->count + T->count;
T->parent = S;
return S;
}
else {
T->count = T->count + S->count;
S->parent = T;
return T;
}
}
Рассмотрим реализацию непересекающихся множеств с соединением, где может быть в большинстве к непересекающихся множеств. Реализация использует хэш-таблицу A [0 .. max-1], в которой хранятся ключи, основанные на методе упорядоченного двойного хэширования. Пусть h1 и h2 - первичная и вторичная хеш-функции соответственно. A содержит ключи узлов всех вышеперечисленных деревьев, а также указатель на соответствующий узел для каждого из них. Я хочу написать алгоритм, который принимает в качестве параметров ключи двух узлов и объединяет вверх-деревья, к которым относятся узлы (узлы могут принадлежать любым up-tree, даже в том и в том случае, когда оно появляется соответствующим сообщением). При слиянии мы должны применять методы сжатия пути и уменьшения высоты.
Не могли бы вы дать мне подсказку, как мы можем это сделать?
Предположим, что у нас есть этот массив:
В начале узлы будут так:
Тогда, если k1 = 100, k2 = 5, после применяя алгоритм, получим ли мы это?
Тогда, если мы имеем k1 = 59, k2 = 5, то мы получим следующее:
Правильно? Тогда, применяя сжатие путь мы начинаем делать это:
tmp=B
while (B->parent!=B)
parent=B->parent;
tmp->parent=B;
tmp=parent;
}
Таким образом, мы будем иметь родителя = F, tmp-> Родитель = B, TMP = F.
Как мы продолжим?
После то k1 = 14, k2 = 59 мы получаем это:
MD-11 могли бы вы объяснить мне дальше, как работает сжатие путь? Итак, должен ли алгоритм выглядеть так: http://pastebin.com/HsT8fN7s? –
Да, это обычно выглядит хорошо для меня (у вас есть некоторые ошибки/опечатки в индексах). Я обновил свой ответ с измененным кодом - я изменил эти индексы и добавил сжатие пути. –
Ницца, спасибо !!! Должны ли мы объявлять поля A, т. Е. Что у него есть полевой ключ и полевой узел? Кроме того, не могли бы вы объяснить мне, что такое функция сжатия пути? –