Weighted Quick Union即:

在Quick Union的基础上对结点加权(weighted),在parent[i]基础上增加一个size[i].

用来存储该结点(site)的所有子结点数目.(size[i] == number of sites in subtree rooted at i)

具体操作步骤:

仅仅在union() operation改变,在改变parent前,增加一个步骤:

比较两个结点的size,谁更轻谁就在下面,

具体看代码:

 class WeightedQuickUnion():
__count = int() #number of components
__parent = list() #__parent[i] parent of i
__size = list() #size[i] number of sites in subtree rooted at i
#Each site is initially in its own component
def __init__(self,N):
self.__count = N
for i in range(0,self.__count):
self.__parent.append(i)
self.__size.append(1)
#Return the component identifier for the component containing site
def find(self,p):
self.validate(p)
while (p != self.__parent[p]):
p = self.__parent[p]
return p
def connected(self,p,q):
return self.find(p) == self.find(q)
#Merges the component containig site p with
#the component containing site q
def union(self,p,q):
rootP=self.find(p)
rootQ=self.find(q)
if (rootP == rootQ):
return
if (self.__size[rootP] < self.__size[rootQ]):
self.__parent[rootP] = rootQ
self.__size[rootQ] += self.__size[rootP]
else:
self.__parent[rootQ] = rootP
self.__size[rootP] += self.__size[rootQ]
self.__count-=1
def validate(self, p):
n = len(self.__parent)
if (p < 0 or p >= n):
raise ValueError("index", p, "is not between 0 and", (n - 1))
def traversal(self):
for i in self.__parent:
print(i,end=' ')
WQU = WeightedQuickUnion(8)
WQU.union(0,1)
WQU.union(2,1)
WQU.union(2,4)
WQU.union(3,7)
print(WQU.connected(0,4))
WQU.traversal()

实例同上一文Quick Find一样,

连接0-1-2-4 3-7,并调用connected()方法验证0-4是否连接

最后遍历

输出:

True
0 0 0 3 0 5 6 3

根据输出可以反应出树形图:

      0    3  5  6

    /  |  \  |

  1   2  4     7

程序中:union()方法里,把size的比较分为两种情况,小于以及大于+等于.

union(0,1)的时候0是p,1是q,他们的size都是1,所以会执行

             self.__parent[rootQ] = rootP
self.__size[rootP] += self.__size[rootQ]

也就是q(1)会成为p(0)的子节点.

union(3,7)同理.

其它情况由于size不同,会按照程序写的那样,把轻的作重的子节点

Weighted Quick Union的更多相关文章

  1. Weighted Quick Union with Path Compression (WQUPC)

    在WQU基础上,添加一步路径压缩. 前面的优化都是在union,路径压缩是在find上面做文章. 这里的路径压缩我还没完全搞明白,之后不断再来的,不管是理解还是博文编排素材之类的. 说是加一步压缩是确 ...

  2. Union-Find(并查集): Quick union improvements

    Quick union improvements1: weighting 为了防止生成高的树,将smaller tree放在larger tree的下面(smaller 和larger是指number ...

  3. Quick Union

    Quick Union quick union就是快速连接 和quick find相同,也是构建一个数组id[],不过存的值换一种理解: 每个数组内的元素看做一个结点,结点内的值即id[i]看做i的前 ...

  4. Search Quick Union Find(图的存储结构)

    Quick Find:适用于search频繁的情况 每个节点有一个id值,id相同表示两个节点相连通.在union时要将等于某一个id值都改成另一个id值 Quick Union: 适用于union频 ...

  5. Union-Find(并查集): Quick union算法

    Quick union算法 Quick union: Java implementation Quick union 性能分析 在最坏的情况下,quick-union的find root操作cost( ...

  6. Algorithm partI 第2节课 Union−Find

    发展一个有效算法的具体(一般)过程: union-find用来解决dynamic connectivity,下面主要讲quick find和quick union及其应用和改进. 基本操作:find/ ...

  7. Union Find

    并查集 前言 来自知乎,Coursera 上普林斯顿大学的算法公开课,稍微来博客上写写记记. 课程资源:1. Algorithms, Part I 2. Algorithms, Part II 3. ...

  8. Leetcode总结之Union Find

    package UnionFind; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; p ...

  9. 261. Graph Valid Tree

    题目: Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nod ...

随机推荐

  1. 扁平数组构建DOM树

    interface IOrganizationNode { id: string; code: string; name: string; localName: string; localNameLo ...

  2. Dart 语言简易教程系列

    google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...

  3. opencv3 图像处理(一)图像缩放( python与c++ 实现)

    opencv3 图像处理 之 图像缩放( python与c++实现 ) 一. 主要函数介绍 1) 图像大小变换 Resize () 原型: void Resize(const CvArr* src,C ...

  4. 【CF434E】Furukawa Nagisa's Tree 点分治

    [CF434E]Furukawa Nagisa's Tree 题意:一棵n个点的树,点有点权.定义$G(a,b)$表示:我们将树上从a走到b经过的点都拿出来,设这些点的点权分别为$z_0,z_1... ...

  5. 使用nginx运行thinkphp的nginx配置

    location / { index index.php; #如果文件不存在则尝试TP解析 if (!-e $request_filename) { rewrite ^(.*)$ /index.php ...

  6. axios+post方法提交formdata步骤详解

    遇到的问题 :怎么看自己发送的格式和后台发送的格式 参考 http://www.php.cn/js-tutorial-396014.html https://blog.csdn.net/qq73705 ...

  7. redis(四)--简单实现Redis缓存中的排序功能

    在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发的应 ...

  8. Msf的一些常用操作

    payload的几个常用生成 生成windows下的反弹木马 msfvenom -p windows/meterpreter/reverse_tcp LHOST=60.205.212.140 LPOR ...

  9. juqery 给本身的class加上一个class 或也可以实现关注商品,取消关注商品

    $("#goods1").on("click",".ICON-fen-LOVE",function(){ var $this = $(thi ...

  10. Python学习之旅(二十八)

    Python基础知识(27):常用内建模块(Ⅲ) 1.urlblib urllib提供了一系列用于操作URL的功能 url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...