1.1 集合运算:交、并、补、差,判断一个元素是否属于一个集合。 1.2 并查集:集合并、查某元素属于什么集合。 1.3 并查集问题中集合存储的实现:用树结构表示集合,树的每一个结点代表一个元素 2.对并查集的操作 2.1 查询:为了查询两个结点是否属于同一集合,我们需要沿着树向上走,来查询包含这个元素的树的根是谁。如果两个结点走到了同
int parent[MAXN]; // 记录每个元素所在集合的代表元素 // 初始化并查集void init(int n){ for (int i = 1; i <= n; i++) { parent[i] = i; }} // 查找元素所在集合的代表元素int find(int x){ if (x != parent[x]) { parent[x] = find(parent[x]); // 路径压缩 } return pare...
2.2.1 初步优化(并操作优化) 引入思考: 我们希望并查集的树是越宽越好,因为越深我们查找起来越慢,所以说,在并操作这个步骤,有可以改进的地方。我们应该确定两颗树,到底谁应该是谁的孩子,我们的核心目的是让更多的结点在树中的位置离根结点更近,所以,通过结点的个数确定两颗树的关系,结点少的做结点多的孩子,即...
算法分析与设计C++ 并查集 并查集学习笔记 并查集(union-find set)是一抽象数据类型。它所处理的是“集合”之间的关系,即动态地维护和处理集合元素之间复杂的关系, 当给出两个元素的一个无序对(a,b)时,需要快速“合并”a和b分别所在的集合,这其间需要反复“查找”某元素所在的集合。“并”、“查”和“集”三...
什么是 “并查集” ? 并查集,是一种可以使用代表元来表示不相交集的数据结构,在一些只需要查询两个元素是否属于同一个集合的情况下它很有用。比如给定一个无向图,判断两个顶点是否属于同一个连通分量。 在很多算法里面都会用到它,比如Kruskal最小生成树算法。
⑶、下面有一种优化的方法:并查集的路径压缩此种做法就是将元素的父亲结点指来指去地指,当这棵树是链的时候,可见判断两个元素是否属于同一集合需要O(n)的时间,于是路径压缩产生了作用。路径压缩实际上是在找完根结点之后,在递归回来的时候顺便把路径上元素的父亲指针都指向根结点。这就是说,我们在“合并5和...
并查集的复杂度 加入这两个优化之后,并查集的效率就非常高。对n个元素的并查集操作一次的复杂度是: O(α(n))。这里,α(n)是阿克曼(Ackermann)函数的反函数。效率要高于O(log n)。 不过这里O(α(n))是平均复杂度。也就是说,多次操作之后平均复杂度为O(α(n)),换而言之,并不是每一次操作都满足O(α(n...
并查集的基本思想intmain()11并查集的基本思想⑶、下面有一种优化的方法:并查集的路径压缩此种做法就是将元素的父亲结点指来指去地指,当这棵树是链的时候,可见判断两个元素是否属于同一集合需要O(n)的时间,于是路径压缩产生了作用。路径压缩实际上是在找完根结点之后,在递归回来的时候顺便把路径上元素的父亲指针都...
初始化:创建一个并查集,并将每个元素都作为一个独立的集合。合并:将两个集合合并为一个集合。查询:...
assign(n,-1);} bool unionSet(int x,int y){ x=root(x); y=root(y); if(x!=y){ //if(data[y] < data[x]) swap(x,y);//使用带权并查集时注释掉 data[x]+=data[y]; data[y]=x; } return x != y; } bool same(int x,int y) {return root(x)==root(y);} int root(...