С помощью структуры данных vanilla union-find вы не можете перечислить фактический набор, так как многие из операций набора недоступны. Это потому, что в ванильной версии у вас есть только указатели в одном направлении - на рисунке ниже каждая диагональная линия соответствует стрелке вверх, а корни (верхняя линия) являются корневыми объектами для наборов:
o [set1] o [Set2]
/ \ \
o o o
/
o
Так что нет способа найти все объекты, скажем, множества 1; например, вы не можете отследить пути к ним от корневого узла. Вы также можете иметь указатели вниз, но это значительно усложняет структуру данных, потому что объект может иметь произвольное количество родителей в структуре данных.
Так что это действительно в основном для следующих операций:
- Ответ на вопрос: принадлежат ли мои объекты A и B одному и тому же набору или нет?
- Объединение наборов S1 и S2 так, чтобы все объекты в наборах теперь считались принадлежащими одному и тому же набору
Чтобы уточнить это, структура данных с объединенным набором имеет очень низкую временную сложность для операций, которые она поддерживает; и объединение наборов, и ответ на один и тот же набор запросов занимают амортизированное постоянное время (O (1)); из-за этой временной сложности вы не можете поддерживать все операции над множествами. Например, стандартное представление набора представляет собой [двоичное] дерево поиска, где большинство операций имеют по меньшей мере O (log n) сложностей.