Quick Union
Quick Union
quick union就是快速连接
和quick find相同,也是构建一个数组id[],不过存的值换一种理解:
每个数组内的元素看做一个结点,结点内的值即id[i]看做i的前驱结点.
初始化时将每个元素的前驱结点赋值为其下标,即id[]={0,1,2,3...,N-1}.
认为前驱结点和本身相同的结点为根结点,所以以上初始化就是将每个元素的根节点初始化为自己
对于某个结点,迭代的寻找其前驱结点,最终当某一结点找到的前驱结点和自身相同时,该结点即为以根结点,
某对结点,若他们的根相同,即认为相连(connnected)
1 class QuickUnion(): 2 #pre define a array 3 __id = [] 4 def __init__(self,N): 5 for i in range(0,N): 6 #initial the list: 7 #the __id[i] save i's root 8 #so, default to itself 9 self.__id.append(i) 10 #locate i's root 11 def root(self,i): 12 #locate from bottom to top 13 while i != self.__id[i]: 14 i = self.__id[i] 15 return i 16 def connected(self,p,q): 17 return self.root(p) == self.root(q) 18 def union(self,p,q): 19 i = self.root(p) 20 j = self.root(q) 21 self.__id[i] = j 22 def traversal(self): 23 for i in self.__id: 24 print(i,end=' ') 25 26 Qu = QuickUnion(8) 27 Qu.union(0,1) 28 Qu.union(2,1) 29 Qu.union(2,4) 30 Qu.union(3,7) 31 print(Qu.connected(0,4)) 32 Qu.traversal()
实例连接了0-1-2-4 3-7,并调用connected()方法验证0-4是否连接,
最后遍历一遍,查询所有元素的前驱结点
以下为输出:
True
1 4 1 7 4 5 6 7
根据输出可汇出树状图表示:
4 5 6 7
| |
1 3
/ \
0 2
路漫漫其修远兮,吾将上下而求索