Распечатка узлов в структуре данных с непересекающимся набором за линейное время

Я пытаюсь выполнить это упражнение во Введении в алгоритмы Кормена и др., которое связано со структурой данных Disjoin Set:

Предположим, что мы хотим добавить операцию PRINT-SET(x), которая получает узел x и печатает все элементы набора x в любом порядке. Покажите, как мы можем добавить только один атрибут к каждому узлу в лесу с непересекающимися множествами, чтобы PRINT-SET(x) занимало время, линейное по количеству членов множества x, а асимптотическое время выполнения других операций равно без изменений. Предположим, что мы можем напечатать каждый элемент набора за время O(1).

Теперь я совершенно уверен, что необходимый атрибут — это хвостовой указатель, чтобы он мог отслеживать дочерние элементы.

Поскольку структура непересекающихся множеств уже имеет родительский атрибут, find-set(x) может легко распечатать узлы, идущие в одном направлении. Но теперь, имея хвостовой указатель, давайте пойдем и в другом направлении.

Однако я не уверен, как бы я написал алгоритм для этого. Если бы кто-нибудь мог помочь мне в псевдокоде, это было бы очень признательно.


person Community    schedule 08.04.2014    source источник
comment
Возможный дубликат Union-Find: эффективное извлечение всех членов набора   -  person nbro    schedule 03.01.2017


Ответы (1)


Каждый узел должен иметь указатель next на следующий узел в наборе, в котором он находится. Узлы в наборе должны образовывать круговой связанный список.

Когда одноэлементный набор создается впервые, указатель узла next указывает на самого себя.

Когда вы объединяете множество с узлом X и множество с узлом Y (и вы уже проверили, что эти множества различны путем нормализации до представителей множества), вы объединяете круговые связанные списки, что можно сделать, просто поменяв местами X.next и Y.next; так что это операция O(1).

Чтобы перечислить все элементы в наборе, содержащем узел X, пройдите круговой связанный список, начиная с X.

person Timothy Shields    schedule 08.04.2014