`
wq294948004
  • 浏览: 31566 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Disjoint Set

阅读更多
Disjoint Set,不相交集,也叫并查集

Union/Find算法:
Find:它返回包含给定元素的集合。
Union:合并两个集合。

用数组来模拟树。
初始化时,数组元素为0。正数的表示父亲是谁,如图:


Union优化:每个根的数组元素包含它的树的高度的负值,按树的高度合并,这样任何节点的深度均不会超过 logN。
第一个数组图是按大小合并,第二个数组图是按高度合并。

按树高度合并代码
typedef int DisjSet[128];
typedef int SetType;
typedef int ElementType;

void SetUnion(DisjSet S, SetType Root1, SetType Root2)
{
	if (S[Root2] < S[Root1]) /* Root2 is deeper set */
		S[Root1] = Root2;	/* Make Root2 new root */
	else
	{
		if (S[Root1] == S[Root2])  /* Same height, */
			S[Root1]--;           /* so update */
		S[Root2] = Root1;
	}
}

Find优化:路径压缩,每执行一次Find操作,从X到根的路径上的每一个节点都使它的父节点变成根。
路径压缩与按大小合并完全兼容,但不完全与按高度合并兼容,此时,可用估计的高度(秩)。
SetType Find(ElementType X, DisjSet S)
{
	if (S[X] <= 0)
		return X;
	else
		return S[X] = Find(S[X], S); // 与普通Find不同在于多了:"S[X] = "
}

来自《数据结构与算法分析》
分享到:
评论

相关推荐

    ACM disjoint set

    ACM disjoint set

    disjoint-set:Python的DisjointSet数据结构实现

    不相交 于Python的 (又称联合查找数据结构或合并查找集)实现。 先决条件 唯一的要求是安装Python 3,您可以通过运行以下命令进行验证: $ python --version Python 3.7.2 ...&gt;&gt; &gt; ds = DisjointSet ()

    Linked-List Implementation of Disjoint Set

    在计算机科学中,**离散集合(Disjoint Set)** 是一种用于管理元素分组的数据结构。它支持两种主要操作:`union` 和 `find`。`union` 操作用于合并两个集合,而 `find` 操作用于确定元素属于哪个集合。离散集合数据...

    ACM并查集(Disjoint Set).pptx(共27页)

    ### ACM并查集(Disjoint Set)知识点梳理 #### 导引问题 - **问题背景**:在一个城市中,有n个人,这些人之间要么是朋友关系,要么是敌人关系。根据两条规则:“我朋友的朋友是我的朋友”、“我敌人的敌人也是我的...

    DisjointSet:我对不相交集的实现

    var unionFind = new DisjointSet ( nodes ); // check intersections between scopes of given objects unionFind . Find ( Node1 , Node2 ) // union scopes unionFind . Union ( Node1 , Node2 ) 执照

    克鲁斯卡尔matlab算法

    3. **并查集**:为了确保生成的树不包含环路,我们需要使用并查集(Disjoint Set)数据结构。在MATLAB中,可以实现一个简单的并查集,包括“找父”(Find Parent)和“联合”(Union)操作。每次添加边时,我们都要...

    前端开源库-ml-disjoint-set

    const DisjointSet = require('ml-disjoint-set'); let ds = new DisjointSet(); ds.add('a'); ds.add('b'); ds.union('a', 'b'); // 合并'a'和'b'到同一集合 console.log(ds.connected('a', 'b')); // 输出:true...

    disjoint-set:Java Disjoint Set 数据结构实现

    不相交集 Java 数据结构实现 用法 org.nnsoft.trudeau.collections.disjointset.DisjointSet是一个泛型友好的数据结构,它提供E find( E e )和void union( E e1, E e2 ) 。

    Union-Find: A Data Structure for Disjoint Set Operations

    在计算机科学领域,特别是数据结构的研究中,**Union-Find**(并查集)是一种用于处理一些不交集(Disjoint Sets)合并及查询问题的重要数据结构。这种数据结构能够高效地支持两种基本操作:查找(Find)和合并...

    disjointset:不相交集的实现(具有路径压缩和排名启发式)

    var DisjointSet = require ( 'disjointset' ) ; var edges = [ { v : 0 , u : 1 , w : 7 } , { v : 0 , u : 3 , w : 5 } , { v : 1 , u : 2 , w : 8 } , { v : 1 , u : 3 , w : 9 } , { v : 1 , u : 4 , w : 7...

    并查集初步 Disjoint Sets

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并问题。 并查集的主要操作有 1-合并两个不相交集合 2-判断两个元素是否属于同一个集合 3-路径压缩

    C#实现最小生成树之克鲁斯卡尔算法(Kurskal)

    DisjointSet disjointSet = new DisjointSet(vertices); // 按权重排序边 edges.Sort(); // 求解最小生成树 foreach (Edge edge in edges) { int uRoot = disjointSet.Find(edge.From); int vRoot = ...

    北大ACM培训课ppt1

    【标题】"北大ACM培训课ppt1"揭示了这是一份来自北京大学的关于ACM竞赛编程培训的课程资料,主要包含两部分:gw_dfa.ppt和gw_Disjoint Set.pptx。ACM(国际大学生程序设计竞赛,International Collegiate ...

    用Kruskal算法实现若干个城市之间的最短路径.最大城市数目为7个.zip

    ds = new DisjointSet(edges.Select(e =&gt; e.From).Union(edges.Select(e =&gt; e.To)).Count()); } public List&lt;Edge&gt; GetMinimumSpanningTree() { var mst = new List(); foreach (var edge in edges) { if (!...

    最小生成树Kruskal和Prim算法讨论.pdf

    3. 从最小的边开始遍历,如果这条边连接的两个顶点不在同一个连通分量中,就将其加入最小生成树,并更新Disjoint Set。 4. 继续检查下一条边,直到连通了所有顶点为止。 Prim算法则有所不同,它从一个初始顶点开始...

    JavaScript算法源代码(例如:二叉搜索树、笛卡尔乘积、线性搜索、存储桶排序、DFS、 Kruskal算法、欧几里,等等)

    - 最大和最小堆、优先队列、Trie、树、二叉搜索树、AVL树、红黑树、区段树 - 包含最小/最大/总和范围查询示例、Fenwick Tree(二叉索引树)、图形(有向和无向)、 Disjoint Set - 并集-查找数据结构或合并-查找集、...

    kruskal_graph_kruskal_

    DisjointSet ds = new DisjointSet(); // 将所有边添加到优先队列,并设置边的起始顶点和结束顶点 for (int i = 0; i ; i++) { for (int j = i + 1; j [i].length; j++) { if (graph[i][j] != 0) { pq.offer...

    dsu插件,打卡机

    Disjoint Set Union是一种用于管理一组不相交集合的数据结构,它提供了两种基本操作:Find(查找元素所属的集合)和Union(合并两个集合)。这个数据结构在处理并查集问题时非常有效,例如在网络连接、图论问题或...

    代码 最小生成树kruskal算法离散型优化问题代码.rar

    - 并查集类(DisjointSet):实现并查集数据结构,提供合并和查找操作。 通过分析这个代码,你可以深入理解Kruskal算法的细节,以及如何将其应用于实际的离散型优化问题。这将有助于你在解决涉及网络连接、成本最小...

    ACM基础题型训练与代码

    首先,我们要理解【描述】中提到的"群星璀璨(12):白植科、唐斌斌、夏可鑫",这可能是参赛者的名字,暗示了ACM竞赛的团队性质,而"第十三讲并查集(Disjoint Set)"则揭示了本次训练的重点是学习并查集这一数据...

Global site tag (gtag.js) - Google Analytics