1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

# конспект · шаг 6 из 6

Конспект: непересекающиеся множества

выжимка - её можно унести в заметки

Понятия

Система непересекающихся множеств (union-find) - три операции: make_set, find (представитель группы), union. Проверка «в одной ли группе» - это find(a) == find(b).

Лес представителей - parent[x] указывает на родителя, у корня parent[x] == x, корень и есть представитель группы. Списков членов группы структура не хранит и разъединять не умеет.

Объединение по рангу (размеру) - меньшее дерево подвешивают к большему; при равных рангах ранг нового корня растёт на единицу. Ранг - ВЕРХНЯЯ оценка высоты, после сжатия не пересчитывается.

Сжатие пути - find на обратном ходу перевешивает каждый узел пути прямо на корень. Есть однопроходный вариант (перевешивание на деда) с той же оценкой и меньшими константами.

α(n) - обратная функция Аккермана, растёт медленнее log*; α(n) <= 4 для любого записываемого n. «Почти константа», но не константа: нижняя граница Ω(m·α(n)) доказана.

Что унести

реализация find union
массив меток O(1) O(n) - перекрасить всю группу
наивный лес до O(n) O(1)
+ объединение по рангу O(log n) в худшем случае O(log n)
+ сжатие пути амортизированно O(α(n)) амортизированно O(α(n))
доказательство логарифма в одну строку:
ранг растёт только при слиянии РАВНЫХ → дерево ранга r держит ≥ 2^r узлов → r ≤ log₂ n

Обе оптимизации нужны вместе: каждая по отдельности даёт только O(log n).

Обнаружение «уже в одной группе» - не побочный эффект, а полезный ответ: в алгоритме Крускала именно он отбрасывает ребро, которое замкнуло бы цикл.

Принцип, общий у этой главы с предыдущей: не делай работу, которую можно отложить, и прибирайся там, куда всё равно пришёл. Массив меток обновляет представителя у всей группы сразу; лес переписывает одну ссылку и пересчитывает лениво, при следующем find, попутно сжимая путь. Тот же принцип - в ленивом удалении из очереди, в уплотнении кучи Фибоначчи, в удвоении динамического массива.

Где нельзя: связи должны только ДОБАВЛЯТЬСЯ. Удаление связей решают обращением времени или структурами динамической связности.

Куда это ведёт

Крускал (минимальное остовное дерево), компоненты связности, перколяция, разметка областей на изображении, унификация типов, оффлайновый поиск наименьшего общего предка. В Крускале union-find перестаёт быть узким местом вовсе: O(E·log E) там - это цена сортировки рёбер.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.