算法分析的一个约定

MAKE-SET的次数为n

MAKE-SET、FIND-SET、UNION的总次数为m

不相交数据集合的链表实现

链表表示一个集合,结点表示一个元素。每个结点都有指向头节点的指针,头结点指向集合的代表元。

MAKE-SET(x):创建一个只有一个结点的链表【O(1)】

FIND-SET(x):元素的结点指向头节点,再指向代表元 【O(1)】

UNION(x,y):较短链表合并至较长链表,短链表的每个结点需要重新指向头结点。【Ω(n)】

时间分析:O(m+nlgn),对于每个结点,最多合并O(lgn)次,总合并次数O(nlgn)。

朴素的并查集

每棵树代表一个集合,根结点为代表元。约定根节点的祖先为本身。

MAKE-SET(x):创建一个只有一个结点的树【O(1)】

FIND-SET(x):重复查找祖先直到根节点 【O(n)】

UNION(x,y):根指向另一个根【O(1)】

时间分析:FIND-SET(x)太慢了!!

路径压缩(Path Compression)

FIND-SET(x):查找根节点时,顺便把路径上的结点直接指向根节点,将树高变为O(1)

int Find(int x)
{if(x == L[x]) return x;int root = Find(L[x]);L[x] = root;return root;
}int Find(int x) {return x == L[x] ? x : L[x] = Find(L[x]);
}

按秩合并(Union by rank)

UNION(x,y):这里的秩(rank)指的是结点的高度,就是合并两个树的时候,把秩更小的根结点指向秩更大的根节点。就是降低树高,理论上可以加快find-set操作

并查集的时间分析

使用这两种优化后,并查集在最坏的情况下O(m*α(n)) ,α(n) ≤ 4

算法导论第21章:并查集相关推荐

  1. 算法导论第21章思考题

    脱机最小值(off-line minimum problem) 输入 给定一个操作序列,包括INSERT(x)和EXTRACT-MIN,操作数x∈[1,n] 样例输入 4,8,E,3,E,9,2,E, ...

  2. 位向量(bit vector)(算法导论第十一章11.1-2)

    位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少得多.说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的 ...

  3. 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)

    假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...

  4. 「图论」第1章 并查集课堂过关

    文章目录 A. [例题1][模板]并查集 题目 代码 B. [例题2]程序自动分析 题目 代码 C. [例题3]银河英雄传说 题目 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 思 ...

  5. 算法导论第2章(3) 二分查找 binary search

    二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...

  6. 算法导论 第7章 快速排序 —— 练习还没做,记得补锅

    今天来学习第七章--快速排序. 作为占据一章的排序,快速排序可谓是重量级选手. 实际排序中最好的选择,因为 (1) 其平均性能非常好,期望实践复杂度为 O(n lgn); (2) 可进行原址排序; ( ...

  7. 重读《算法导论》第一章

    重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...

  8. 算法导论第十三章 红黑树

    写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这 ...

  9. 普林斯顿算法(1.3)并查集(union-find算法)——本质就是一个数 下面的子树代表了连在一起的点...

    转自:https://libhappy.com/2016/03/algs-1.3/ 假设在互联网中有两台计算机需要互相通信,那么该怎么确定它们之间是否已经连接起来还是需要架设新的线路连接这两台计算机. ...

最新文章

  1. C语言中的CONST使用
  2. Linux下uniq筛选
  3. Tomcat 相关配置
  4. 科大星云诗社动态20210208
  5. ubuntu12下subversion 1.6升级为1.8版本
  6. 真正理解红黑树,真正的
  7. 中国人工智能学会通讯——基于视频的行为识别技术 1.7 视频的深度分段网络...
  8. 什么是光纤通道交换机(FC SWITCH)
  9. delphi 停电文本数据丢失_NLP中的文本分析和特征工程
  10. Vim高级使用 - CentOS下使用VIM打造C/C++开发环境
  11. 搜狐视频如何开启青少年模式
  12. Android Studio 使用笔记:快捷键
  13. 的稳定性 linux_Linux系统KDE桌面,打造最接近Windows的界面环境!不用才后悔
  14. (一)PyQt5系列教程:使用PyQt5创建一个简单的demo
  15. PhoneGap——Accelerometer【加速计】
  16. 忘记 Apple ID 密码?重设 Apple ID 密码的 3 种方法
  17. 爱荷华州立大学计算机科学,2020年爱荷华州立大学排名TFE Times美国最佳计算机科学硕士专业排名第63...
  18. 可视化导论 - 第三章 数据- 学习笔记
  19. 计算机动态评估英语阅读,【计算机教育论文】谈计算机动态评价模式同伴反馈有效性(共4305字)...
  20. 这16道题都能答上来?恭喜你,90%的面试都能通过!

热门文章

  1. kindeditor上传图片配置upload_json.jsp文件出现500错误
  2. linux下安装transmission下载种子
  3. WIN10 无法连接 WIN7 共享的打印机的方法
  4. echarts python 教程_Echarts入门(零基础小白教程)
  5. Android打开相册并上传图片至服务器
  6. 我的世界hmcl启动器登录教程
  7. 【Camera】Camera理论知识和基本原理
  8. 自然语言处理—初始自然语言处理技术—走进自然语言处理
  9. 计算机联锁知识,6502电路动作顺序(计算机联锁基础知识)
  10. PS学习(一)文档的新建,分辨率的设置