`

常用类之四---并查集(Union-Find Sets)

阅读更多
并查集为解决等价类问题提供了一个高效快速的数据结构,在许多涉及到等价类的算法中,他都扮演着
改进算法中使用的数据机构的角色,他对提高算法的效率是可见一斑,例如在带有限期的作业问题中,在求最小生成树Kruskal算法都可以使用并查集高效的实现.
const int DefaultSize = 20;

class UFSets{
public:
 UFSets(int s = DefaultSize);
 ~UFSets();
 void Union(int root1,int root2);
 void WeightUnion(int root1,int root2);//基于加权规则的合并操作
                                       //使合并树保持较小的深度
                                       //减小Find的时间
 int Find(int x);//查找x元素的集合,并返回集合的名
 int  CollapsingFind(int x);//查找的过程中基于折叠规则进行路径压缩
private:
 int *parent;
 int size;
};
UFSets::UFSets(int s){
 size = s;
 parents = new int[size+1];
 for(int i= 0; i<= size; i++)
  parent[i] = -1;
}

int UFSets::Find(int x){
 if(parent[x] < 0) 
  return x;
 else 
  return Find(parent[x]);
}

void UFSets::Union(int root1,int root2){
 parent[root2] = root1;
}

void UFSets::WeightUnion(int root1,int root2){
 int weight = parent[root1] + parent[root2];
 if(parent[root1] < parent[root2]){
   parent[root1] = root2;
   parent[root2] = temp;
 }
 else{
   parent[root2] = root1;
   parent[root1] = temp;
 }
}

int UFSets::CollapsingFind(int x){
   int temp;
   for(int j = x; parent[j] >= 0; j = parent[j]);//查找x的根
   while(x != j){//把x所在的一支的节点依次连到根节点,使得树的深度
     temp = parent[x];//保持很小
  parent[x] = j;
  x = temp;
   }
}
分享到:
评论

相关推荐

    数据结构--并查集(Union-Find Sets)

    并查集(Union-Find Sets)是数据结构中一种用于管理元素集合的高效算法,它主要处理两个操作:连接(union)与查找(find)。在并查集中,元素被分到不同的集合中,每个集合代表一个独立的组件。连接操作将两个元素...

    Union-Find: A Data Structure for Disjoint Set Operations

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

    Disjoint-Sets-using-Union-Find:使用联合查找和树进行路径压缩的不相交集

    这种数据结构在并查集、图算法、社交网络分析等场景中都有广泛应用。 总的来说,这个Java实现的不相交集使用了联合查找和路径压缩策略,提高了操作的效率,使得在大规模数据处理时仍能保持良好的性能。通过阅读和...

    并查集详细介绍 真的好东西

    并查集是一种在计算机科学中用于管理不相交集合(disjoint sets)的数据结构,它主要支持三个操作:创建集合、查询元素所属集合以及合并两个集合。这种数据结构在处理分组或连接问题时非常有用,比如在图论中的连通...

    Java使用HashMap实现并查集

    2. 然后,定义一个UnionFind类,用于实现并查集的功能。UnionFind类中包含两个HashMap:fatherMap和sizeMap。fatherMap用于存放每个节点的头节点,sizeMap用于保存每个集合的大小。 3. 在UnionFind类中,使用makeSet...

    python 并查集代码

    并查集类 def __init__(self, n): 长度为n的并查集 self.uf = [-1 for i in range(n + 1)] # 列表0位置空出 self.sets_count = n # 判断并查集里集合的数量 def find(self, p): 查找p的根结点(祖先) r = p ...

    ACM 程序设计:并查集 -1.pdf

    并查集是一种在图论和数据结构中用于处理不相交集合(disjoint sets)的高效算法,常用于解决寻找连通性的问题。在ACM程序设计中,它被广泛应用于处理亲戚关系或其他类似的问题,例如判断两个节点(在这个场景中是人...

    C++利用map实现并查集

    C++中的并查集(Union-Find)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。并查集存在两个操作:(1)Union 联合和(2)find deputy 查找代表结点),以及一个需要解答的问题:...

    NOIP 树形数据结构 复习课件

    并查集(Disjoint Sets Union, DSU)是一种重要的数据结构,主要用于处理一些不交集(Disjoint Sets)的合并及查询问题。 - **并查集基本概念**: - 并查集是一种树型的数据结构,它能够高效地维护一系列不相交...

    Boost.orgdisjoint_sets模块.zip

    这个模块主要设计用于高效地执行并查集操作,如“查找”(Find)和“联合”(Union),它们在图论、数据连接和优化问题等领域有着广泛应用。 不相交集合数据结构是一种用于维护一组互不相交集合的数据结构,它支持...

    理学数据结构PPTPPT学习教案.pptx

    在这个PPT中,重点介绍了“并查集”(Union-Find Sets)这一数据结构及其相关操作。 并查集是一种用于处理集合操作的数据结构,特别适合于解决“连接”和“查询”两个元素是否属于同一集合的问题。它主要支持三个...

    -高级数据结构

    #### 二、并查集(Union-Find Sets) **定义**:并查集是一种用于处理不相交集合(Disjoint Sets)的合并和查询问题的数据结构。它通常用森林的形式表示,其中每个集合代表一棵树。 **核心操作**: - **合并两个...

    kruscal算法C++

    在C++中,可以实现一个简单的并查集类,包含`make_set`(初始化每个顶点为独立集合)、`find_set`(查找顶点所在的集合代表)和`union_sets`(合并两个集合)等方法。 4. **遍历排序后的边**:按照排序后的顺序遍历...

    数据结构实验代码

    其次,`UFSets`(Union-Find Sets)涉及到并查集数据结构,这是处理集合操作的一种高效方法。并查集的主要操作包括: 1. 并集(Union):将两个不同的集合合并为一个集合。 2. 查找(Find):确定一个元素属于哪个...

    C++不相交集实现.zip

    这些操作在解决各种问题时非常有用,如寻找图中的连通分量、检测并查集等。本教程将详细讲解如何用C++实现不相交集类。 首先,我们需要理解不相交集的核心思想。每个集合由一个代表元素,通常选择为集合中最早加入...

    Competitive Programming 3 The New Lower Bound of Programming Contests

    并查集可以高效处理不相交集合的合并与查询;线段树和树状数组则擅长处理静态区间查询问题。 在解决问题的范式方面,书中介绍了“Complete Search”(完全搜索)、“Divide and Conquer”(分治法)、“Greedy”...

    斯坦福大学数据结构

    5. 并查集(Union-Find)结构:这是一种数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题,常用于网络连接或图结构的问题中。 6. 二叉搜索树(Binary Search Tree, BST):是每个节点最多有两个...

Global site tag (gtag.js) - Google Analytics