, . . , :
1 2 3 4 5 8 10
, (1,2), 1 2 - . ( ), - node:
1 2 3 4 5 8 10
\/
12
(1,3), 1 (12) 3 (3) :
1 2 3 4 5 8 10
\/ |
12 /
\/
123
(2,4) (5,8) (8,10):
1 2 3 4 5 8 10
\/ | | \/ |
12 / | 58 /
\/ / \/
123 / 5810
\/
1234
" ", .
, , , , . a node:
class Merge:
def __init__(self,value=None,parent=None,subs=()):
self.value = value
self.parent = parent
self.subs = subs
def get_ancestor(self):
cur = self
while cur.parent is not None:
cur = cur.parent
return cur
def __iter__(self):
if self.value is not None:
yield self.value
elif self.subs:
for sub in self.subs:
for val in sub:
yield val
:
vals = set(x for tup in array for x in tup)
vals, Merge:
dic = {val:Merge(val) for val in vals}
merge_heads:
merge_heads = set(dic.values())
Merge, , Merge, merge_head Merge :
for frm,to in array:
mra = dic[frm].get_ancestor()
mrb = dic[to].get_ancestor()
mr = Merge(subs=(mra,mrb))
mra.parent = mr
mrb.parent = mr
merge_heads.remove(mra)
merge_heads.remove(mrb)
merge_heads.add(mr)
, , , a set Merge merge_heads:
resulting_sets = [set(merge) for merge in merge_heads]
resulting_sets ( ):
[{1, 2, 3, 4}, {8, 10, 5}]
( class):
vals = set(x for tup in array for x in tup)
dic = {val:Merge(val) for val in vals}
merge_heads = set(dic.values())
for frm,to in array:
mra = dic[frm].get_ancestor()
mrb = dic[to].get_ancestor()
mr = Merge(subs=(mra,mrb))
mra.parent = mr
mrb.parent = mr
merge_heads.remove(mra)
merge_heads.remove(mrb)
merge_heads.add(mr)
resulting_sets = [set(merge) for merge in merge_heads]
, O (n 2), , O (log n), O (n log n), , , .