首页 > 其他分享 >【数据结构-树】并查集的基本操作(待整理)

【数据结构-树】并查集的基本操作(待整理)

时间:2022-11-11 18:11:32浏览次数:51  
标签:结点 int Root1 查集 基本操作 数据结构 root Root2

目录

1 数据结构定义

#define MAX 50
int UFSets[MAX]; // 并查集

2 初始化

// 参数:并查集 S
void Init (int S[]){
    int i;
    for (i = 0; i < MAX; i++)
        S[i] = -1;
}

【注】根结点可用来保存该子集合的元素个数(负数表示)。

3 查找操作

  • 寻找包含 x 的树根:
// 参数:并查集 S,索引/下标 x
int Find (int S[], int x){
    while (S[x] >= 0)
        x = S[x];
    return x;
}

image

  • 压缩路径:先找到根结点,再将查找路径上所有结点都挂在根结点上
// 参数:并查集 S,索引/下标 x
int Find (int S[], int x){
    int root = x;
    
    // 寻根
    while (S[root] >= 0)
        root = S[root];
        
    // 压缩路径
    while (x != root){ 
        int t = S[x]; // t 暂时保存 x 的双亲结点(不一定是根结点!)
        S[x] = root; // x 直接挂在根结点下
        x = t; // x 更新为双亲结点
    }
    
    return root;
}
  • 压缩路径:一边查找一边压缩路径,将查找路径上所有结点都挂在根结点上(递归写法)
// 参数:并查集 S,索引/下标 x
int Find (int S[], int x){
    if (S[x] < 0) // 如果就是根结点
        return x;
    else{ // 如果不是根结点,一边查找一边压缩路径
        S[x] = Find(S[x]); // 找到其根结点,将双亲结点更新为其根结点
        return S[x];
    }
}

4 并操作

  • 把集合 S 中的子集合 Root2 并入子集合 Root1:
void Union (int S[], int Root1, int Root2){
    if (Root2 != Root1) // Root2 和 Root1 必须是不同的两个集合
        S[Root2] = Root1;
}
  • 把集合 S 中,包含元素 y 的子集合 Root2 并入包含元素 x 的子集合 Root1:
void Union (int S[], int x, int y){
    S[Find(y)] = Find(x);
}

标签:结点,int,Root1,查集,基本操作,数据结构,root,Root2
From: https://www.cnblogs.com/Mount256/p/16881346.html

相关文章

  • table数据结构
    依赖guava中的table数据结构使用Table<Long,String,Set<Metric>>table=Tables.synchronizedTable(HashBasedTable.create());#table的三段结构rowKey,columnKey,v......
  • Scala数据结构
    1 数据结构特点Scala同时支持可变集合和不可变集合,不可变集合从不可变,可以安全的并发访问。两个主要的包:不可变集合:scala.collection.immutable可变集合: scala.collecti......
  • 20221111_T1B_线段树优化建图/并查集
    题意给定一个字符串,其中只有a和b,现在一个字符能够跳到与之中间a的个数范围在\([l,r]\)的东西。题解赛时得分:100/100对于一个东西,显然如果将能相互到达连边,那么......
  • 第一章 数据结构绪论
    本文章作为学习笔记,大量参考了《大话数据结构》这本书,因为没有用于商业活动,而且也算是为作者做了一个小小的宣传,作者应该不会告我侵权,哈。 数据结构的概念:是相互之间存在的......
  • 数据结构(B树和B+树)
    9.2、B树了解B树之前,先来了解一下m叉查找树可以类比二叉查找树(排序树)的来了解m叉查找树;我们这里以5叉查找树为例子二叉查找树有一个关键字和2个孩子,左孩子<根结点<......
  • 【数据结构与算法】ip转int
    思路比较简单,但是有一些坑。classErrorextendsException{/****/privatestaticfinallongserialVersionUID=1L;Stringmsg;Error(Stringmsg){th......
  • Go实现栈与队列基本操作
    @目录一前言二实现栈与队列基本操作2.1栈基本操作2.2队列基本操作三用栈实现队列3.1理论3.2算法题3.3思路3.4代码部分四用队列实现栈4.1理论4.2算法题4.3思路......
  • 奇怪的数据结构题(Trie树合并)
    奇怪而又不算难的数据结构题题面:题目描述有一个集合\(a\),初始为空。你需要写一个数据结构,支持:0x表示将\(x\)加入该集合,其中\(x\)为一数字串。保证不在集合中......
  • 数据结构篇——链表
    数据结构篇——链表本次我们介绍基础算法中的区间合并,我们会从下面几个角度来介绍:单链表双链表单链表我们会在这里介绍单链表单链表简介我们首先来简单介绍一下单......
  • 【数据结构-树】树及森林的定义
    目录1双亲表示法2孩子表示法2.1孩子表示法2.2双亲孩子表示法3孩子兄弟表示法1双亲表示法dataparent存储某个结点的数据信息存储该结点的双亲所在数组中......