您现在的位置是:热点 >>正文
并查集,不就一并和一查?
热点4379人已围观
简介...
什么是并查集
并查集这种数据结构,可能出现的频率不是那么高,但是还会经常性的见到,其理解学习起来非常容易,通过本文,一定能够轻轻松松搞定并查集!
对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题,常常在使用中以森林来表示。在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。
你可能还有点迷糊并查集能怎么玩,看完这篇然后回头看这两个问题(分别杭电1232和杭电1272)。
问题1:
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都并查可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
这个问题很容易,给定的关系看看需要合并多少次就知道最少的建设道路数量。
问题二:
小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。
这个问题也很容易了,根据关系集合进行合如果两个元素已经属于一个集合,那就说明不满足要求啦。
并查集解析
通过上面介绍,相信你已经清楚并查集就是解决集合中一些元素的合并和查询问题,现在就带你解析这个算法。
初始化
开始时候森林中每个元素没有任何操作,它们之间是相互独立的。我们通常会使用数组来表示这个森林(数组下标对应第几个元素),在初始化的时候数组中的各个值为-1,表示各自自己是一个集合(各自为王),你可能会问为啥是-1而不是一个其他的数,那是因为用负数可以代表这个元素是某个集合的根,然后它的权值表示集合中元素的个数。
并 union(int a,int b)
这里合并,并没有你想象的直接合并那么简单,这里合并集,是合并a所在的集合和b所在的集合,但在操作层面a,b可能并不是根节点,所以也要先判断一下。
为了便于理解,这里罗列一下最初操作可能的情况,初始时候各个元素都是独立的集合,那么直接a指向b(或者b指向a)即arr[a]=b,同时为了表示这个集合有多少个,原本-1的b再次-1.即arr[b]=-2.表示以b为父根的集合节点有|-2|个。例如进行union(1,4),union(5,7)操作之后如图所示:
正常情况的union(int a,int b),假设我们就是a合并到b上,把b当成父集合来看。a、b都可能是叶子节点,也可能是根节点。
此时你可以先分别找到a,b的父节点fa,fb(这个根可能是它自己),然后合并fa和fb两个节点,例如上面如果union(1,5)那么其实就是等价union(4,7)。
为什么不直接操作a,b而是要找到他们的父亲进行操作?
原因1是因为a,b可能是叶子节点,其值是正的表示已经有父亲了,如果直接操作会使其与原来的集合分离开。另外集合中的数量(负数)也不能有效叠加。
原因2是因为合并的时候如果合并如果a,b是非根节点操作,可能会造成这个树的深度太大,不利不就于集合a中的查询效率。
查 search(int a)
查询,其实就是查询这个节点的根节点是啥(也称代表元),这个过程也有点类似递归的过程,叶子节点值如果为正,那么就继续查找这个值得位置的结果,一直到值为负数的时候说明找到根节点,可以直接返回。
不过在查询的过程中可以顺便路径优化,这样在频繁查询能够大大降低时间复杂度。
优化
你以为上面的就是并查集的全部?不不不,并查集还有不少需要掌握嘞,估计细心的人可能也会发现一些问题。
你可能会有疑问:
如何查看a,b是否在同一个集合?
查看是否在一个集合,只需要查看节点根祖先的结果是否相同即可。因为只有根的数值是负的,而其他都是正数表示指向的元素。所以只需要一直寻找直到不为正数进行比较即可!
a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上?
这里会遇到两种情况,这个选择也是非常重要的。你要弄明白一点:树的高度+1的化那么整个元素查询的效率都会降低!
所以我们通常是:小树指向大树(或者低树指向高树),这个使得查询效率能够增加!
当然,在高度和数量的选择上,还需要你自己选择和考虑。
查找途中能不能路径压缩
每次查询,自下向上。当我们调用递归一并的时候,可以顺便压缩路径(将当前数组的值等于递归返回的根节点的值),我们查找一个元素只需要直接找到它的祖先,所以当它距离祖先近那么下次查询就很快。并且压缩路径的代价并不大!
试想一下,如果一个分支的深度为1000,不压缩路径那么这个分支每个节点平均查找次数为500,压缩一次下次再查找就是1次。
学会路径压缩,你基本可以秒杀大部分并查集的题。
代码实现
并查集实现起来较为简单,直接贴代码!代码很久前写的,如果有纰漏还请指出。
import java.util.Scanner; public class DisjointSet { static int tree[]=new int[100000];//假设有500个值 public DisjointSet() {set(this.tree);}  和一; public DisjointSet(int tree[]) { this.tree=tree; set(this.tree); } //初始化所有都是-1 有两个好处,这样他们指向-1说明是自己, //第二,-1代表当前森林有-(-1)个 public void set(int a[]) { &nb查?sp; int l=a.length; for(int i=0;i<l;i++) { a[i]=-1; } } public int search(int a)//返回头节点的数值 { &nb并查sp; if(tree[a]>0)//说明是子节点 { return tree[a]=search(tree[a]);//路径压缩 } else return a; } &n集,bsp; public int value(int a)//返回a所在树的大小(个数) { if(tree[a]>0) { return value(tree[a]); } else &不就nbsp; return -tree[a]; } public void union(int a,int b)//表示 a,b所在的树合并 { int a1=search(a);//a根 int b1=search(b);//b根 if(a1==b1) {System.out.println(a+"和一并"+b+"已经在一棵树上");} else { if(tree[a1]<tree[b1])//这个是负数,为了简单减少计算,不在调用value函数 { tree[a1]+=tree[b1];//个数相加 注意是负数相加 tree[b1]=a1; &n和一bsp; //b树成为a的子树,直接指向a; } else { tree[b1]+=tree[a1];//个数相加 注意是负数相加 tree[a1]=b1; //b树成为a的子树,直接指向a; &nbs查?p; } } } public static void main(String[] args) { DisjointSet d=new DisjointSet(); d.union(1,2); 并查 d.union(3,4); d.union(5,6); d.union(1,6); d.union(22,24); d.union(3,26); d.union(36,24); System.out.println(d.search(6)); //ͷ集, System.out.println(d.value(6)); //大小 System.out.println(d.search(22)); //ͷ System.out.println(d.value(22)); //大小 } } 结语
并查集属于简单但是很高效率的数据结构。在集合中经常会遇到。如果不采用并查集而传统暴力效率太低,而不被采纳。
Tags:
上一篇:标签: 水滴公司 看病保 保小慧 ClawSquare
下一篇:标签: 高德云图
相关文章
vivo 蓝心3B 端侧大模型震撼发布:集成五大核心能力,性能超越所有8B 模型
热点在今日举行的 2025vivo 开发者大会上,vivo 宣布其在端侧人工智能领域取得重大突破,正式推出经过持续一年训练优化的 蓝心3B 端侧多模态推理大模型。 这款3B(30亿参数)量级的端侧大模型,...
【热点】
阅读更多标签: 字节跳动 Seeduplex 豆包 桃子音色
热点云梦级4月9日云梦级消息,节跳动今日宣布推出原生全双工语音大模型 Seeduplex。据介绍,相比于上一代半双工豆包端到端语音模型,Seeduplex 基于“边听边说”的全新框架设计,交互体验的自然感...
【热点】
阅读更多大数据“引爆”算力需求 国产AI芯片能否乘风起航?
热点集微网报道,数据、算力、算法是人工智能发展的三要素,也被誉为数字经济时代发展的三驾马车。这其中,数据是生产资料,海量优质数据是驱动算法持续演进的基础养料;算法是生产关系,是处理数据信息的规则与方式;算...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://www.sweat.com/collections/vendors?q=谷歌搜索留痕【tg:seogoogle987】,xJv
- https://www.nonsolocap.it/cap?action=SEARCH&k=谷歌搜索留痕【tg:seogoogle987】,lts
- https://www.livehindustan.com/tags/谷歌搜索留痕【tg:seogoogle987】,srs
- https://www.flickr.com/photos/tags/谷歌搜索留痕【tg:seogoogle987】RpN
- https://www.skicheck.at/en/?action=CHECK&s=谷歌搜索留痕【tg:seogoogle987】,byt
- https://www.roberthalf.com/us/en/jobs/all/谷歌搜索留痕【tg:seogoogle987】0oM
- https://www.theaerogroup.net/?cat=28&s=谷歌搜索留痕【tg:seogoogle987】,2MH
- https://www.smics.com/tc/site/search?token=谷歌搜索留痕【tg:seogoogle987】,se1
- https://www.whirlpool.com.hk/chinese/catalogsearch/result?cat=30&q=谷歌搜索留痕【tg:seogoogle987】,ggq
- https://www.kores.com/?s=谷歌搜索留痕【tg:seogoogle987】,Umz
- https://www.pixiv.net/tags/谷歌搜索留痕【tg:seogoogle987】,89o
- https://www.parl.ca/legisinfo/fr/projets-de-loi?parlsession=all&view=list&keywords=谷歌搜索留痕【tg:seogoogle987】,fSq
- https://www.pierreherme.com/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,DBo
- https://www.goodreads.com/quotes/tag/谷歌搜索留痕【tg:seogoogle987】bdW
- https://www.sic-info.org/vi/?s=谷歌搜索留痕【tg:seogoogle987】,N5j
- https://www.mynextmove.org/find/search?s=谷歌搜索留痕【tg:seogoogle987】,0Eq
- https://www.londontheatredirect.com/search/谷歌搜索留痕【tg:seogoogle987】,3wE
- https://www.youtube.com/results?search_query=谷歌搜索留痕【tg:seogoogle987】,b4c
- https://www2.ual.es/ProyectoLates/?s=谷歌搜索留痕【tg:seogoogle987】,OJk
- https://xehay.vn/tim-kiem/=谷歌搜索留痕【tg:seogoogle987】,24B
- https://www.seforall.org/search?keywords=谷歌搜索留痕【tg:seogoogle987】,stX
- https://www.yr.no/en/search?q=谷歌搜索留痕【tg:seogoogle987】,XgU
- https://www.lyrics.com/lyrics/谷歌搜索留痕【tg:seogoogle987】,Hbt
- https://www.silentiumpc.com/en/search/谷歌搜索留痕【tg:seogoogle987】,8uW
- https://www.kaskus.co.id/search?q=谷歌搜索留痕【tg:seogoogle987】,dS8
- https://www.supersauna.de/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,B7h
- https://www.youthforum.org/search-results?cx=4f5236218ab5e8ef9&ie=UTF-8&q=谷歌搜索留痕【tg:seogoogle987】,W1w
- https://www.sbaad.no/?s=谷歌搜索留痕【tg:seogoogle987】,QAr
- https://www.scivee.tv/?s=谷歌搜索留痕【tg:seogoogle987】,pHy
- https://www.rotherham.gov.uk/site-search/results/?q=谷歌搜索留痕【tg:seogoogle987】,WE4
- https://www.sensorshop24.de/catalogsearch/result/index/?type=132&q=谷歌搜索留痕【tg:seogoogle987】,Nt5
- https://www.oikos-tecnics.com/?s=谷歌搜索留痕【tg:seogoogle987】,yWM
- https://www.teamlab.art/ko/?submit=谷歌搜索留痕【tg:seogoogle987】,VGl
- https://www.lindseymedicalsupply.com/search/谷歌搜索留痕【tg:seogoogle987】,0zY
- https://www.randjleather.co.uk/index.php?route=product/search&tag=谷歌搜索留痕【tg:seogoogle987】,gxw
- https://www.kawainter.com/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,tpp
- https://www.ntv.co.jp/3min/search/?action=QUERY&q=谷歌搜索留痕【tg:seogoogle987】,k1x
- https://www.simcoemuskokahealth.org/SearchResults.aspx?SearchQuery=谷歌搜索留痕【tg:seogoogle987】,9SE
- https://www.tombow.com/search/谷歌搜索留痕【tg:seogoogle987】,EBk
- https://www.youm7.com/Home/Search?allwords=谷歌搜索留痕【tg:seogoogle987】,aa4
- https://www.paxnet.co.kr/search/jongmok?kwd=谷歌搜索留痕【tg:seogoogle987】udo
- https://www.sonepar.ch/fr/search?q=谷歌搜索留痕【tg:seogoogle987】,wS6
- https://www.vietnamconsulate-sf.org/?action=CHECK&s=谷歌搜索留痕【tg:seogoogle987】,6Ij
- https://www.selfsufficientish.com/main/?s=谷歌搜索留痕【tg:seogoogle987】,enJ
- https://www.tcv.org.uk/search/谷歌搜索留痕【tg:seogoogle987】,y5c
- https://www.mingwai.edu.hk/?langzh-hant&s=谷歌搜索留痕【tg:seogoogle987】,ef9
- https://www.krisinformation.se/en/search?q=谷歌搜索留痕【tg:seogoogle987】,sjg
- https://www.varian.com/en-au/search?cat=113&search=谷歌搜索留痕【tg:seogoogle987】,XIQ
- https://dict.naver.com/dict.search?dicQuery&query=谷歌搜索留痕【tg:seogoogle987】Zum
- https://www.nyif.com/catalogsearch/result/?q=谷歌搜索留痕【tg:seogoogle987】,1QB