69
правок
Изменения
→С помощью списка
|}-->
Будем хранить множество в виде списка. Для каждого элемента списка храним ссылку на следующий элемент и указатель на <tex> head</tex>, который является представителем. Для того чтобы найти представителя, нужно перейти по ссылке на <tex> head</tex>. Значит <math> \mathrm{find } </math> работает за <tex> O(1) </tex>.
Для объединения множеств потребуется объединить два списка и обновить ссылки на <tex> head</tex>. Таким образом, <math> \mathrm{union } </math> работает за <tex> O(n) </tex>.Чтобы объединить два списка, нужно хранить ссылку на <tex> tail</tex>. Ее можно хранить в голове списка.
<code> '''int''' s[n] '''func''' init(): '''for ''' i = 0 '''to ''' n - 1:
s[i].data = i
s[i].next = null
s[i].head = s[i]
x = x.head
y = y.head
'''if ''' x == y: '''return''' <font color=green> // соединим списки</font>
x.tail.next = y
<font color=green> // сделаем корректную ссылку на <tex> tail </tex> в <tex> head</tex></font>
x.tail = y.tail
<font color=green> // скорректируем ссылки на <tex> head </tex> у элементов множества "<tex> y"</tex> </font> '''while ''' y != <tex> \neq </tex> null:
y.head = x
y = y.next
</code>
[[Файл:DSU_list_example.png|800px|left|thumb|Пример объединения двух множеств (union)]]
<br clear="all"/>