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

 

posted @ 2018-08-28 17:24  katachi  阅读(429)  评论(0编辑  收藏  举报