Как правильно реализовать операцию объединения в структуре данных с несвязными множествами?

Существует множество различных описаний и примеров структуры несвязных множеств, доступных в режиме онлайн.

В некоторых случаях для каждого набора хранится "ранг". Когда набор объединяется в другой набор, ранг первого увеличивается на 1, если они имеют одинаковый ранг.

В других случаях для каждого набора хранится его размер. Когда набор объединяется с другим, их размеры добавляются.

Здесь он хранит ряды.

В статье в Википедии хранятся ранги.

В записках лекций Корнелльского университета хранятся звания.

В примере из "Алгоритмов" Седжвика и Уэйна он хранит размеры.

Здесь также хранятся размеры ( основной сайт).

Cormen et al. записывать:

Очевидный подход заключается в том, чтобы корень дерева с меньшим количеством узлов указывал на корень дерева с большим количеством узлов. Вместо того, чтобы явно отслеживать размер поддерева, укорененного в каждом узле, мы будем использовать подход, который облегчает анализ. Для каждого узла мы поддерживаем ранг, который является верхней границей высоты узла. При объединении по рангу корень с меньшим рангом указывает на корень с большим рангом во время операции UNION.

Что лучше / правильнее?

1 ответ

Весь анализ (есть?) Показывает, что оба метода обеспечивают оптимальную O(альфа) сложность в сочетании с техникой коллапса дерева.

Тогда единственное отличие, зависящее от реализации, заключается в размере, который принимают переменные размера или ранга. Размер может быть до size_t но ранг может быть закодирован всегда в трех битах.

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

Другие вопросы по тегам