Weighted Quick Union
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的更多相关文章
- Weighted Quick Union with Path Compression (WQUPC)
在WQU基础上,添加一步路径压缩. 前面的优化都是在union,路径压缩是在find上面做文章. 这里的路径压缩我还没完全搞明白,之后不断再来的,不管是理解还是博文编排素材之类的. 说是加一步压缩是确 ...
- Union-Find(并查集): Quick union improvements
Quick union improvements1: weighting 为了防止生成高的树,将smaller tree放在larger tree的下面(smaller 和larger是指number ...
- Quick Union
Quick Union quick union就是快速连接 和quick find相同,也是构建一个数组id[],不过存的值换一种理解: 每个数组内的元素看做一个结点,结点内的值即id[i]看做i的前 ...
- Search Quick Union Find(图的存储结构)
Quick Find:适用于search频繁的情况 每个节点有一个id值,id相同表示两个节点相连通.在union时要将等于某一个id值都改成另一个id值 Quick Union: 适用于union频 ...
- Union-Find(并查集): Quick union算法
Quick union算法 Quick union: Java implementation Quick union 性能分析 在最坏的情况下,quick-union的find root操作cost( ...
- Algorithm partI 第2节课 Union−Find
发展一个有效算法的具体(一般)过程: union-find用来解决dynamic connectivity,下面主要讲quick find和quick union及其应用和改进. 基本操作:find/ ...
- Union Find
并查集 前言 来自知乎,Coursera 上普林斯顿大学的算法公开课,稍微来博客上写写记记. 课程资源:1. Algorithms, Part I 2. Algorithms, Part II 3. ...
- Leetcode总结之Union Find
package UnionFind; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; p ...
- 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 ...
随机推荐
- 使用ionic2开发一个二维码扫描功能
界面添加一个按钮: <button ion-button block color="secondary" class="Scan-button" (cli ...
- Java 中的泛型
泛型的一般意义: 泛型,又叫 参数多态或者类型参数多态.在强类型的编程语言中普遍作用是:加强编译时的类型安全(类型检查),以及减少类型转换的次数. Java 中的 泛型: 编译时进行 类型擦除 生成与 ...
- 利用docker搭建ubuntu+nginx+PHP容器
环境:操作系统(Ubuntu 16.04 64位); php7.1; nginx/1.14.0 基础环境准备: 整体思路:docker pull一个ubuntu镜像,然后在容器中安装ngi ...
- 剑指offer——python【第34题】第一个只出现一次的字符
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写) 思路 遍历字符串,找到那个第 ...
- js运用5
js数据类型具体分析 1.基础类型:string number boolean null undefined 2.引用类型:object==> json array ...
- 关于maven的CoreException: Could not get the value for parameter compilerId for plugin 。。的错误
在Eclipse中使用 Alt+F5 快捷键,在弹出的Update Maven Project对话框中选择报错的Maven工程,勾选下图中的 Force Update of Snapshots/Rel ...
- [No0000197]Windows用户都应该知道的运行命令
通过"运行"命令,运行Windows丰富工具的方法.如果您知道工具或任务的相应"运行"命令,那么您就知道访问所述工具或任务的最快方法. 以下是我们最喜欢的Run ...
- vue-property-decorator 提供 OO 的风格 Vue Component 方便类型声明
@Prop 父子组件之间传值 Install: npm install --save vue-property-decorator Child: <template> <div&g ...
- docker+elasticsearch的安装
查询镜像 [root@ elasticsearch]# docker search elasticsearch INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMA ...
- 【Java】NO.84.Project.1.OCEA.1.001-【Dreamcar】-
1.0.0 Summary Tittle:[Java]NO.84.Project.1.OCEA.1.001-[Dreamcar]- Style:Project Series:Java Since:20 ...