数据结构(5.5_2)——并查集

逻辑结构------数据元素之间的逻辑关系

并查集:

并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作:

用双亲表示存储并查集

首先将所有根节点数组值设为-1,其他结点数组值对应其父节点的数组下标

查找(Find)

确定某个元素处于哪个子集,它可以用来确定两个元素是否属于同一个子集。

如何"查"到一个元素到底属于哪一个集合?

---从指定元素出发,一路向上,找到根结点---

如何判断两个元素到底是否属于同一个集合?

---分别查到两个元素的根,判断节点是否相同即可---

合并(Union)

将两个子集合并成一个集合。

把两个集合"并"为一个集合

---让一棵树成为另一棵树的子树即可---

树的存储------双亲表示法(回忆)

并查集的代码实现

初始化

先将所有结点数组值设为-1

cpp 复制代码
#define SIZE 13
int UFSetes[SIZE]; //集合元素数组

//初始化并查集
void Initial(int S[]) {
    for (int i = 0; i < SIZE; i++) {
        S[i] = -1;
    }
}

并、查

查操作:

cpp 复制代码
//Find "查"操作,找x所属集合(返回x所属根结点)
int Find(int S[], int x) {
    while (S[x] >= 0)//循环寻找x的根
        x = S[x];
    return x;//根的S[]小于0
}

并操作:

cpp 复制代码
//Union "并操作",将两个集合合并为一个
void Union(int S[], int Root1, int Root2) {
    //要求Root1和Root2是不同的集合
    if (Root1 == Root2)
        return;
    //将根Root2连接到另一根Root1下面
    S[Root2] = Root1;
}

时间复杂度分析

Union的优化操作

优化思路:在每次Union操作构建树的时候,尽可能让树不长高

  1. 用根节点的绝对值表示树的结点总数
  2. Union操作,让小树合并到大树

代码:

cs 复制代码
//Union "并操作",小树合并到大树
void Union(int S[], int Root1, int Root2) {
    if (Root1 == Root2)
        return;
    if (S[Root2] > S[Root1]) {//Root2结点数更少
        S[Root1] += S[Root2];//累加结点总数
        S[Root2] = Root1;//小树合并到大树
    }
    else {
        S[Root2] += S[Root1];//累加结点总数
        S[Root1] = Root2;//小树合并到大树
    }
}

总结:

相关推荐
想唱rap几秒前
Linux下进程的状态和优先级
linux·运维·服务器·开发语言·数据结构·算法
Croa-vo35 分钟前
逆袭Akuna Quant!美硕秋招亲历,从网申到拿offer全攻略
数据结构·经验分享·算法·面试·职场和发展
vir022 小时前
交换瓶子(贪心)
数据结构·算法
952363 小时前
数据结构-二叉树
java·数据结构·学习
HUTAC4 小时前
重要排序算法(更新ing)
数据结构·算法
冉佳驹4 小时前
数据结构 ——— 八大排序算法的思想及其实现
c语言·数据结构·排序算法·归并排序·希尔排序·快速排序·计数排序
Hello_Embed5 小时前
FreeRTOS 入门(四):堆的核心原理
数据结构·笔记·学习·链表·freertos·
烧冻鸡翅QAQ5 小时前
考研408笔记——数据结构
数据结构·笔记·考研
异步的告白6 小时前
C语言-数据结构-2-单链表程序-增删改查
c语言·开发语言·数据结构
Gorgous—l7 小时前
数据结构算法学习:LeetCode热题100-图论篇(岛屿数量、腐烂的橘子、课程表、实现 Trie (前缀树))
数据结构·学习·算法