Я пытаюсь выполнить это упражнение во Введении в алгоритмы Кормена и др., которое связано со структурой данных Disjoin Set:
Предположим, что мы хотим добавить операцию
PRINT-SET(x)
, которая получает узелx
и печатает все элементы набораx
в любом порядке. Покажите, как мы можем добавить только один атрибут к каждому узлу в лесу с непересекающимися множествами, чтобыPRINT-SET(x)
занимало время, линейное по количеству членов множестваx
, а асимптотическое время выполнения других операций равно без изменений. Предположим, что мы можем напечатать каждый элемент набора за время O(1).
Теперь я совершенно уверен, что необходимый атрибут — это хвостовой указатель, чтобы он мог отслеживать дочерние элементы.
Поскольку структура непересекающихся множеств уже имеет родительский атрибут, find-set(x)
может легко распечатать узлы, идущие в одном направлении. Но теперь, имея хвостовой указатель, давайте пойдем и в другом направлении.
Однако я не уверен, как бы я написал алгоритм для этого. Если бы кто-нибудь мог помочь мне в псевдокоде, это было бы очень признательно.