学习内容:
Dynamic Connectivity 动态连接
Quick Find 快速查找
Quick Union 快速连接
Quick Find 快速查找
对于要查找在一个图中几个小项是否连通,可以开辟一个数组,每个项都有其对应的ID,每一对连通的项都有相同的ID,这样就很好发现两个项是否连通了。但是要用这种方法将两个连通的区域连通,如果每个区域都有较多的连通项,那么实行起来就必定会耗费很大的时间,时间复杂度为O(n²),就不太可行。
Quick Union 快速连接
这个方法是利用树。当两个项连通时,就将其连起来,其中一个项的ID改为它的与它相连也就是它的父子节点的ID,以此类推,如果两个点是连通的,就将他们两个的节点连起来,然后将ID改为与它相连也就是它父子节点的ID。(我好像这块的表达能力不太行)这个方法比前面那种合并起来要快一点。想知道两个项是否相连,只要查找其最顶端的那个祖先节点是否相等,相等就说明连通。但是当一棵树非常高的时候,其实要看两个项是否连通就比较耗时。
[为解决上述“如果树太高,岂不是查找起来非常耗费时间内存”的问题即用如下解决方法]
快速查找和排序带权算法。
就是在每一次合并两个节点的时候,先比较这两个节点所在的树的大小,哪个小就把小的那个树插到树大的节点所在的树的根节点上,这样,树就会变得“矮”很多,查找起来效率就很高了。时间复杂度是O(logn)。这里我就想不明白,为什么是这个时间复杂度,然后,老师是这么说的↓
“当x所在的树,即图中的T1,与另一棵树,即图中的T2,合并的时候x的深度加1
好,之前我们说过只有在T2的大小
T2的大小大于等于T1的大小时才会发生这种情况 所以当x深度增加时
树的大小至少翻倍。这很关键,因为这意味着
包含x的树的大小最多可以翻N次倍因为如果从1开始
翻倍lg N次,就会得到N,而最后树中总共只有N个节点
这就是任意节点x的深度最多是N以2为底的对数的粗略证明”
反正红字部分是死活没办法理解。
至于上述快速查找和合并带权算法,应用到物理模型中就是渗滤。可以是水管连通,电路连通还有网络连通等等。