Weighted Quick Union with Path Compression (WQUPC)
在WQU基础上,添加一步路径压缩.
前面的优化都是在union,路径压缩是在find上面做文章.
这里的路径压缩我还没完全搞明白,之后不断再来的,不管是理解还是博文编排素材之类的.
说是加一步压缩是确实只在find里增加了一个步骤,而这里ALGS4官方又有两个版本,由于我现在没有把问题规模化,只是简单的实例化增加几个连接,
还不能很好的理解两者优劣,就都贴上来吧.
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)
root = p
#find root identifier
while (root != self.__parent[root]):
root = self.__parent[root]
#merge the component containing site
#***question:the loop ?
while (p != root):
newp = self.__parent[p]
self.__parent[p] = root
p = newp
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(12)
WQU.union(0, 1)
WQU.union(1, 2)
WQU.union(3, 4)
WQU.union(4, 5)
WQU.union(5, 2)
WQU.union(6, 7)
WQU.union(7, 8)
WQU.union(9, 10)
WQU.union(10, 11)
WQU.union(11, 8)
WQU.union(11, 2)
print(WQU.connected(2, 8))
WQU.traversal()
def find(self,p):
self.validate(p)
while p != self.__parent[p]:
self.__parent[p] = self.__parent[__self.parent[p]]
p = self.__parent[p]
return p
上面单独给出了另一种写法,就是网课里面那么写的,课程可能是以前录制好的,多次播放.然后他们的程序不断更新了.
先出现的那种写法:
root = p
#find root identifier
while (root != self.__parent[root]):
root = self.__parent[root]
先找到根节点,
while (p != root):
newp = self.__parent[p]
self.__parent[p] = root
p = newp
return p
(假设p不等于root)
然后先取出p的parent,然后把p的parent移接到根结点上,最后p赋值为p原先的parent也就是刚刚接到根结点的那个结点.
下一次迭代的时候p!=root,取出p的parent,这里已经取出root了,然后进行一次root赋值root冗余操作,最后p赋值为root,
再下一次迭代p==root,循环退出,返回p的root.
整个过程会移动p的parent位置,且一次性移动到根节点,循环会执行两次,第二次只是为了移动p的值,以便退出循环.
所查结点和其parent以及其grandparent会形成三层结构,(不考虑以当前结点为parent的结点,实际上这些结点会跟着移动位置的)
之后那种方法:
(也假设p!=root)
第一次p!=root,将p的panrent移动到p的grandparent,(当前循环次数的),p赋值为原p的grandparent.
假设第二次p!=root,(树很高:>)那么还会进行一次前面的操作,进一步压缩路径,可以看出中间会跳过一个结点
假设第三次p成为了root的直接后继,那么parent[p]和parent[parent[p]]都是取root的值,可以退出循环了.(下一次编辑一定会加上图的2333)
这个同上一种方法不同的是可能会移动很多次结点,如果树很高的话.
但是不用先迭代来寻找root.这两种方法都会修改结点位置,但是都已经破坏了其size,如不维护size,那么再union的时候就会出问题了.
还有不明白这个find会调用多少次?如果调用多次显然新版的程序更好,
之后肯定要写每次课程的作业,
记得视频中用蒙特卡洛方法计算percolation的概率,不去实现真的存在很多问题,现在
Weighted Quick Union with Path Compression (WQUPC)的更多相关文章
- Weighted Quick Union
Weighted Quick Union即: 在Quick Union的基础上对结点加权(weighted),在parent[i]基础上增加一个size[i]. 用来存储该结点(site)的所有子结点 ...
- Geeks Union-Find Algorithm Union By Rank and Path Compression 图环算法
相同是查找一个图是否有环的算法,可是这个算法非常牛逼,构造树的时候能够达到O(lgn)时间效率.n代表顶点数 原因是依据须要缩减了树的高度,也叫压缩路径(Path compression),名字非常高 ...
- 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( ...
- Union-find 并查集
解决问题 给一系列对点0~N-1的连接,判断某两个点p与q是否相连. private int[] id; // 判断p和q是否属于同一个连通分量 public boolean connected(in ...
- 32. Longest Valid Parentheses
题目: Given a string containing just the characters '(' and ')', find the length of the longest valid ...
- 132.1.001 Union-Find | 并查集
@(132 - ACM | 算法) Algorithm | Coursera - by Robert Sedgewick > Tip: Focus on WHAT is really impor ...
随机推荐
- Windows下安装配置Yaf框架的方法及创建典型合理的Demo目录结构
Yaf是一个C语言编写的PHP框架,由鸟哥Laruence开发的高性能框架: Yaf官方文档:http://www.laruence.com/manual/index.html 第一步:安装PHP扩展 ...
- 11.17 flask (1)
2018-11-17 18:38:42 开始学习进行玩前面项目 开始进军flask flask是一个小型的web框架,,但是有很多第三方组件 最后组装组装就和django一样啦!!!!!!! pyt ...
- create database link
如果本地的tnsnames.ora中未建立数据库连接,那么就是用1,否则就是用2 1:create database link geelyin96 connect to geelyin identif ...
- rails 杂记 - model 中的exists?
1. exists? 用法 有一段代码 参考 def generate_token(column) begin self[column] = SecureRandom.urlsafe_base64 e ...
- archlinux 下使用 aria2+uget 作为下载工具
1.创建配置文件 sudo vim /etc/aria2/aria2.conf ## /etc/aria2/aria2.conf### '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ...
- js获取当前日期方法(YYYY-MM-DD格式)
var myDate = new Date(); var time = myDate.toLocaleDateString().split('/').join('-');将1970/08/08转化 ...
- ERP项目实施记录09
今天报价软件测试版本出来了,可看上去不怎么像是一款报价的软件,整个界面上都没有"报价"相关的字眼: 软件标题就不说了,反正影响不大,就当没看见,可左边这一大片菜单里也找不到和报价有 ...
- ubuntu16.04安装libzip库
sudo apt install libzip-dev
- 洛谷P4324 扭动的回文串 [JSOI2016] manacher+哈希
正解:manacher+哈希 解题报告: 传送门 要不要先解释下题意,,,我开始看了半天来着QAQ 大概就,要求一个最长的回文串 这个回文串有两种构成可能 一种是单从一个串中拿出来的连续一段 另一种是 ...
- mac系统上mysql开启外网访问
1.首先本地连到数据库在"mysql"库下把user表里User=root的那一行,把Hosts从"locahost"改成"%" 2.然后在 ...