СНМ (наивные реализации) — различия между версиями
(оформление) |
|||
| Строка 1: | Строка 1: | ||
| + | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;" | ||
| + | |+ | ||
| + | |-align="center" | ||
| + | |'''НЕТ ВОЙНЕ''' | ||
| + | |-style="font-size: 16px;" | ||
| + | | | ||
| + | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. | ||
| + | |||
| + | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. | ||
| + | |||
| + | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. | ||
| + | |||
| + | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. | ||
| + | |||
| + | ''Антивоенный комитет России'' | ||
| + | |-style="font-size: 16px;" | ||
| + | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. | ||
| + | |-style="font-size: 16px;" | ||
| + | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки]. | ||
| + | |} | ||
| + | |||
'''Система (лес, объединение) непересекающихся множеств''' (СНМ, disjoint set forest, DSF, disjoint set union, DSU) {{---}} иерархическая структура данных, позволяющая эффективно работать с множествами. | '''Система (лес, объединение) непересекающихся множеств''' (СНМ, disjoint set forest, DSF, disjoint set union, DSU) {{---}} иерархическая структура данных, позволяющая эффективно работать с множествами. | ||
__TOC__ | __TOC__ | ||
Версия 07:43, 1 сентября 2022
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Система (лес, объединение) непересекающихся множеств (СНМ, disjoint set forest, DSF, disjoint set union, DSU) — иерархическая структура данных, позволяющая эффективно работать с множествами.
Содержание
Описание
Структура хранит набор объектов (например, чисел от до ) в виде непересекающихся множеств. У каждого множества есть конкретный представитель.
Определены две операции:
- — объединяет множества, содержащие и
- — возвращает представителя множества, в котором находится
Для любого элемента множества представитель всегда одинаковый. Поэтому чтобы проверить принадлежность элементов и одному множеству достаточно сравнить и .
Реализации
С помощью массива
Пусть в массиве s хранятся номера множеств, в будет храниться номер множества, к которому принадлежит . Этот номер отождествляет множество, возвращает именно его. Тогда , очевидно, будет работать за .
Чтобы объединить множества и , надо изменить все , равные номеру множества , на номер . Тогда работает за .
int s[n]
func init():
for i = 0 to n - 1
s[i] = i // сначала каждый элемент лежит в своем множестве
int find(k):
return s[k]
func union(x, y):
if s[x] == s[y]
return
else
t = s[y]
for i = 0 to n - 1
if s[i] == t
s[i] = s[x]
С помощью списка
Будем хранить множество в виде списка. Для каждого элемента списка храним ссылку на следующий элемент и указатель на , который является представителем. Для того чтобы найти представителя, нужно перейти по ссылке на . Значит работает за .
Для объединения множеств потребуется объединить два списка и обновить ссылки на . Таким образом, работает за . Чтобы объединить два списка, нужно хранить ссылку на . Ее можно хранить в голове списка.
struct SetItem
int data
SetItem head
SetItem next
SetItem tail
SetItem s[n]
func init():
for i = 0 to n - 1
s[i].data = i
s[i].head = s[i]
s[i].tail = s[i]
s[i].next = null
int find(SetItem x): // подразумевается, что — ссылка на один из элементов
return x.head.data
func union(SetItem x, SetItem y): // и — элементы множеств x = x.head y = y.head if x == y return x.tail.next = y // соединим списки x.tail = y.tail // сделаем корректную ссылку на в while y null // скорректируем ссылки на у элементов множества y.head = x y = y.next
Другие реализации
Источники информации
- Википедия — Система непересекающихся множеств
- Система непересекающихся множеств и её применения
- Т. Кормен - Алгоритмы, построение и анализ. Второе издание. Часть V. Глава 21.
