Union-Find (DSU)
Множества с быстрым «в одном ли?» и слиянием за ~O(1).
1class UnionFind {2 private parent: Map<string, string> = new Map()3 4 find(x: string): string {5 let root = this.parent.get(x) ?? x6 while (root !== (this.parent.get(root) ?? root)) {7 root = this.parent.get(root) ?? root8 }9 // сжатие пути10 while (x !== root) {11 const next = this.parent.get(x) ?? x12 this.parent.set(x, root)13 x = next14 }15 return root16 }17 18 union(a: string, b: string): void {19 const ra = this.find(a)20 const rb = this.find(b)21 if (ra !== rb) this.parent.set(ra, rb)22 }23 24 connected(a: string, b: string): boolean {25 return this.find(a) === this.find(b)26 }27}Проблема
Множества с быстрым «в одном ли?» и слиянием за ~O(1).
Что вы видите
Массив корней: union перенаправляет корень одного множества в другое.
Как это работает
find идёт по parent до корня; сжатие пути прижимает цепочку. Амортизированно почти O(1). Ядро Краскала и сетевых соединений.
Пошаговый разбор
- 01
find
По parent до корня.
- 02
union
Корень одного → под другой.
- 03
Сжатие пути
Цепочка прижимается к корню.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
««В одном ли мы множестве?» — почти бесплатно»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.