1. Dynamic Connectivity Problem :
a) Union command : connect two objects
b) Find/connected query: is there a path connecting the two objects?
2. Quick-find
a) Integer array id[] of size N
b) Interpretation: p and q are connected iff they have the same id.
c) Find: Check if p and q have the same id.
d) Union : To merge components containing p and q, change all entries whose id equals id[p] to id[q].
Find is quick which only takes 2 array access. Union is expensive , it cost N array access and N union will cost N^2
3. Quick-union
a) Integer array id[] of size N.
b) Interpretation: id[i] is parent of i.
c) Root of i is id[id[id[...id[i]...]]].
d) Find: Check if p and q have the same root.
e) Union: To merge components containing p and q, set the id of p's root to the id of q's root.
Both Union and Find can be expensive in worst case.
4. Quick-find defect:
a) Union too expensive (N array accesses).
b) Trees are flat, but too expensive to keep them flat.
Quick-union defect.
a) Trees can get tall.
b) Find too expensive (could be N array accesses).
5. Weighted quick-union.
a) Modify quick-union to avoid tall trees.
b) Keep track of size of each tree (number of objects).
c) Balance by linking root of smaller tree to root of larger tree.
Proposition: Depth of any node x is at most lg N.
Pf. When does depth of x increase?
Increases by 1 when tree T1 containing x is merged into another tree T2.
1) The size of the tree containing x at least doubles since | T 2 | ≥ | T 1 |.
2) Size of tree containing x can double at most lg N times. (the total # of nodes is at most N)
6. Quick union with path compression: Just after computing the root of p, set the id of each examined node to point to that root.
Two-pass implementation: add second loop to root() to set the id[] of each examined node to the root.
Simpler one-pass variant: Make every other node in path point to its grandparent (thereby halving path length).
分享到:
相关推荐
- `class UnionFind`:自定义的并查集类,包括 `find()`(查找顶点所属集合的根节点)和 `unionSet()`(合并两个集合)等方法。 - `void kruskalMST()`:Kruskal算法的主要函数,进行上述步骤。 在代码设计和变量...
### Union-Find: 数据结构与不交集操作 #### 一、引言 在计算机科学领域,特别是数据结构的研究中,**Union-Find**(并查集)是一种用于处理一些不交集(Disjoint Sets)合并及查询问题的重要数据结构。这种数据...
利用Union-find算法实现路径压缩最小生成树,使用c编写
联合查找 这是 Node.js 中 union-find 数据结构的一个实现。 在做个人项目时,我没有找到适合我需求的 NPM 模块并创建了它。 如果有人对此模块感兴趣,或者想要... 使用 UnionFind#inSameGroup 确定两个节点是否在同一
并查集(Union-Find)是一种在图论和算法设计中常见的数据结构,主要用于处理一些不相交集合的合并与查询问题。它在前端开发面试中也是一个重要的考察点,因为并查集可以解决许多实际场景中的问题,如网络连接、社交...
并查集(Union-Find)是一种用于处理连接关系的数据结构,它在计算机科学中有着广泛的应用,尤其是在图论、算法设计以及数据结构的学习中。这个数据结构的主要目标是高效地解决“查找”和“合并”两个操作,常用于...
并查集(Union-Find Sets)是数据结构中一种用于管理元素集合的高效算法,它主要处理两个操作:连接(union)与查找(find)。在并查集中,元素被分到不同的集合中,每个集合代表一个独立的组件。连接操作将两个元素...
data.union-find 使用 Tarjan 的联合查找算法的持久不相交集森林的 Clojure 实现。 可通过在莱宁根: [org.jordanlewis/data.union-find "0.1.0"] 用法 创建一个新的 union-find 数据结构,包含其作为单例集的...
Union-Find数据结构 Union-Find数据结构是一种特殊的数据结构,用于管理一组不相交的集合(Disjoint-sets),支持三个基本操作:MAKE-SET、FIND和UNION。这种数据结构广泛应用于解决动态连通性问题,例如图形算法、...
1. **合并-查找(Union-Find)数据结构**:这是解决渗透问题的关键。在这个问题中,我们有一个n*n的网格,每个点可以是Open或Closed状态。当最底部的点与最顶端的点连通时,我们认为系统是渗透的。使用并查集可以...
数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 ...
这是UNION-FIND数据结构的小型独立C ++ 11实现,具有按等级压缩和按路径合并以及一些附加功能。它支持并发find() , same()和unite()调用,如本文所述 联合发现问题的免等待并行算法,作者:Richard J. Anderson和...
在这个实现中,`Disjoint-Sets-using-Union-Find-main`可能是主程序文件,它包含了测试用例,用于验证DisjointSet类的正确性和性能。可能包括一些示例,比如模拟图中的边连接,然后使用不相交集来检测图中是否存在...