草庐IT

并查集 size 的优化

并查集size的优化按照上一小节的思路,我们把如下图所示的并查集,进行union(4,9)操作。合并操作后的结构为:可以发现,这个结构的树的层相对较高,若此时元素数量增多,这样产生的消耗就会相对较大。解决这个问题其实很简单,在进行具体指向操作的时候先进行判断,把元素少的集合根节点指向元素多的根节点,能更高概率的生成一个层数比较低的树。构造并查集的时候需要多一个参数,sz数组,sz[i]表示以i为根的集合中元素个数。//构造函数publicUnionFind3(intcount){  parent=newint[count];  sz=newint[count];  this.count=cou

并查集 size 的优化

并查集size的优化按照上一小节的思路,我们把如下图所示的并查集,进行union(4,9)操作。合并操作后的结构为:可以发现,这个结构的树的层相对较高,若此时元素数量增多,这样产生的消耗就会相对较大。解决这个问题其实很简单,在进行具体指向操作的时候先进行判断,把元素少的集合根节点指向元素多的根节点,能更高概率的生成一个层数比较低的树。构造并查集的时候需要多一个参数,sz数组,sz[i]表示以i为根的集合中元素个数。//构造函数publicUnionFind3(intcount){  parent=newint[count];  sz=newint[count];  this.count=cou

并查集快速合并

并查集快速合并对于一组数据,并查集主要支持两个动作:union(p,q)-将p和q两个元素连接起来。find(p)-查询p元素在哪个集合中。isConnected(p,q)-查看p和q两个元素是否相连接在一起。在上一小节中,我们用id数组的形式表示并查集,实际操作过程中查找的时间复杂度为O(1),但连接效率并不高。本小节,我们将用另外一种方式实现并查集。把每一个元素,看做是一个节点并且指向自己的父节点,根节点指向自己。如下图所示,节点3指向节点2,代表3和2是连接在一起的,节点2本身是根节点,所以指向自己。同样用数组表示并查集,但是下面一组元素用parent表示当前元素指向的父节点,每个元素指

并查集快速合并

并查集快速合并对于一组数据,并查集主要支持两个动作:union(p,q)-将p和q两个元素连接起来。find(p)-查询p元素在哪个集合中。isConnected(p,q)-查看p和q两个元素是否相连接在一起。在上一小节中,我们用id数组的形式表示并查集,实际操作过程中查找的时间复杂度为O(1),但连接效率并不高。本小节,我们将用另外一种方式实现并查集。把每一个元素,看做是一个节点并且指向自己的父节点,根节点指向自己。如下图所示,节点3指向节点2,代表3和2是连接在一起的,节点2本身是根节点,所以指向自己。同样用数组表示并查集,但是下面一组元素用parent表示当前元素指向的父节点,每个元素指

并查集快速查找

并查集快速查找本小节基于上一小节并查集的结构介绍基础操作,查询和合并和判断是否连接。查询元素所在的集合编号,直接返回id数组值,O(1)的时间复杂度。...privateintfind(intp){  assertp>=0&&pcount;  returnid[p];}...合并元素p和元素q所属的集合,合并过程需要遍历一遍所有元素,再将两个元素的所属集合编号合并,这个过程是O(n)复杂度。...publicvoidunionElements(intp,intq){  intpID=find(p);  intqID=find(q);  if(pID==qID)    return;  for(

并查集快速查找

并查集快速查找本小节基于上一小节并查集的结构介绍基础操作,查询和合并和判断是否连接。查询元素所在的集合编号,直接返回id数组值,O(1)的时间复杂度。...privateintfind(intp){  assertp>=0&&pcount;  returnid[p];}...合并元素p和元素q所属的集合,合并过程需要遍历一遍所有元素,再将两个元素的所属集合编号合并,这个过程是O(n)复杂度。...publicvoidunionElements(intp,intq){  intpID=find(p);  intqID=find(q);  if(pID==qID)    return;  for(

并查集基础

并查集基础一、概念及其介绍并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。二、适用说明并查集用在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这个过程看似并不复杂,但数据量极大,若用其他的数据结构来描述的话,往往在空间上过大,计算机无法承受,也无法在短时间内计算出结果,所以只能用并查集来处理。三、并查集的基本数据表示

并查集基础

并查集基础一、概念及其介绍并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。二、适用说明并查集用在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这个过程看似并不复杂,但数据量极大,若用其他的数据结构来描述的话,往往在空间上过大,计算机无法承受,也无法在短时间内计算出结果,所以只能用并查集来处理。三、并查集的基本数据表示

并查集总结

前言前几天看到并查集的题目,竟然只会最简单的并查集,看来带权并查集和扩展域并查集还要是好好写个笔记复习复习的。时间复杂度如果仅仅使用路径压缩的并查集,时间复杂度似乎并不是\(O(\alpha(n))\),详情见这里。扩展域并查集yxc给出了一种简单易懂的理解扩展域并查集的方式:将并查集中的元素看成一个个条件,两个元素在一个集合中的意义是:如果有一个条件,那么整个集合中的条件都成立。我来形式化一点:并查集中的每一个元素都是一个语句\(p\),每一个集合\(S\)都是一个命题:\(如果p(p\inS),那么q(q\inS,q\not=p)。\)这样就十分容易理解了。例如:P2024[NOI2001

并查集总结

前言前几天看到并查集的题目,竟然只会最简单的并查集,看来带权并查集和扩展域并查集还要是好好写个笔记复习复习的。时间复杂度如果仅仅使用路径压缩的并查集,时间复杂度似乎并不是\(O(\alpha(n))\),详情见这里。扩展域并查集yxc给出了一种简单易懂的理解扩展域并查集的方式:将并查集中的元素看成一个个条件,两个元素在一个集合中的意义是:如果有一个条件,那么整个集合中的条件都成立。我来形式化一点:并查集中的每一个元素都是一个语句\(p\),每一个集合\(S\)都是一个命题:\(如果p(p\inS),那么q(q\inS,q\not=p)。\)这样就十分容易理解了。例如:P2024[NOI2001