路径压缩优化并查集大家一定很熟练了,那么它的复杂度是多少呢?O(mα(n))O(m\alpha(n))O(mα(n))?

的确,很多人都是这么说的,但是事实上它的复杂度是O(mlog⁡1+m/nn)O(m\log_{1+m/n}n)O(mlog1+m/n​n)的,并且能找到一种方法卡到这样的复杂度。

要卡并查集,首先要构造一种树——二项树。这种二项树还与普通的不太一样。

定义:在给定jjj的情况下,二项树TkT_kTk​定义如下:

  • 若k≤jk\leq jk≤j,TkT_kTk​是一个点。
  • 若k>jk>jk>j,TkT_kTk​是Tk−1T_{k-1}Tk−1​的根结点增加一棵Tk−jT_{k-j}Tk−j​的子树。

这棵树非常有意思,我们可以展开Tk−jT_{k-j}Tk−j​,接着展开Tk−2jT_{k-2j}Tk−2j​……

另外,也可以展开Tk−1T_{k-1}Tk−1​,接着展开Tk−2T_{k-2}Tk−2​……

容易发现,图5看起来像图4的路径压缩之后的结果,但是不完全一样。

如果首先按照图5的方式展开jjj棵子树,再按图4展开,可以得到

此时,如果在根节点上再加一个点,jjj次访问T1T_1T1​到TjT_jTj​,那么路径压缩后可以得到图5外加一个点作为根的儿子。

也就是说,这棵二项树路径压缩后约等于没有路径压缩……只是将原来作为根结点父亲的那个点变成了儿子。

至于TkT_kTk​的点数,通过数学归纳法可以发现不会超过(j+1)k/j−1(j+1)^{k/j-1}(j+1)k/j−1个。

假设m≥nm\geq nm≥n,令j=mn,i=log⁡j+1n2+1,k=ijj=\frac{m}{n},i=\log_{j+1}\frac{n}{2}+1,k=ijj=nm​,i=logj+1​2n​+1,k=ij,那么TkT_kTk​的点数不超过n2\frac{n}{2}2n​。接下来做n2\frac{n}{2}2n​组操作,每次加入一个点作为根结点的父亲,然后对T1T_1T1​到TjT_jTj​逐个查询,每次查询的长度是i+1i+1i+1,同时查询的次数显然不超过mmm。因此总操作次数为n2j(i+1)\frac{n}{2}j(i+1)2n​j(i+1),即O(mlog⁡1+m/nn)O(m\log_{1+m/n}n)O(mlog1+m/n​n)。

图片取自康复计划#4 快速构造支配树的Lengauer-Tarjan算法。

转载于:https://www.cnblogs.com/Canopus-wym/p/10376053.html

路径压缩优化并查集的时间复杂度相关推荐

  1. 并查集路径压缩_并查集(UnionFind)技巧总结

    什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...

  2. SDU_week6_B - 戴好口罩!(路径压缩的并查集)

    题目描述 新型冠状病毒肺炎(Corona Virus Disease 2019,COVID-19),简称"新冠肺炎",是指2019新型冠状病毒感染导致的肺炎. 如果一个感染者走入一 ...

  3. 数据结构之并查集:路径压缩继续优化并查集——20

    路径压缩继续优化并查集 在实现的并查集中,在合并操作merge(item1, item2)时,会不管两个元素所在的分组大小,总是将item 1的分组合并到item2的分组,这样可能会导致树的深度无必要 ...

  4. 数据结构之并查集:UF-Tree优化并查集——19

    并查集的优化 在上一节了解到并查集的快速查询,合并,判断归属组等操作,虽然这些操作都非常方便,但是在数据量较大的情况下,并查集的效率并不算高: 上一节中实现代码中使用的合并方法(merge,API设计 ...

  5. 【LeetCode每日一题:1697. 检查边长度限制的路径是否存在~~~并查集+数组排序+排序记录下标位置】

    题目描述 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边.请注意,两 ...

  6. 1584.连接所有点的最小费用(Kruskal算法) | 1697. 检查边长度限制的路径是否存在(并查集)

    给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] . 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi ...

  7. 二分图的时间戳优化+并查集变型

    P1640 [SCOI2010]连续攻击游戏 用used数组记录now(now++),不需要每一轮都是用memset判别. #include <bits/stdc++.h>using na ...

  8. 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化 Quick Find Quick Union 基于size的优化 基于rank的优化 路径压缩优化 并查集的时间复杂度 并查集的 ...

  9. POJ 1703 Find them, Catch them(路径压缩并查集)

    POJ 1703 Find them, Catch them(路径压缩并查集) 2014年03月11日 20:13:54 阅读数:881 POJ 1703 Find them, Catch them( ...

最新文章

  1. lsa五类_OSPF外部路由4类5类LSA
  2. SqlServer 2014还原数据库时提示:无法在已有的上还原文件,请重新发出RESTORE语句,用WITH REPLACE来覆盖原先存在的文件
  3. Android 如何有效的解决内存泄漏的问题
  4. Spark _17 _SparkShuffle、HashShuffleManager、SortShuffleManager
  5. Error: Another program is already listening on a port that one of our HTTP servers is configured to
  6. jzoj3860-地壳运动(mst)【最小生成树,三分】
  7. jquery radio取值,checkbox取值,select取值,radio选中,
  8. elasticsearch 报表统计_螺丝ERP销售管理系统,螺丝企业专业管理统计
  9. MyBatis入门到精通——Mybatis入门篇
  10. soapUI(groovy脚本作用2)请不要问为什么系列2
  11. vue全局组件中再创建多个组件
  12. LCN根据官网改造本项目失败案例
  13. 香港科技大学工学院理学硕士土木基建工程及管理(MSc CIEM)2022Fall宣讲会(线上)
  14. Android打开系统文件管理器
  15. Python RPM包制作
  16. 通过路由远程计算机重启,路由器如何重启 三种重启路由器的方法【步骤教程】...
  17. Python3:批量读取excel百度分享链接保存到百度网盘
  18. 编写数码管c语言程序,跪求单片机0~99数码管显示用C语言编写的程序
  19. 棋牌游戏开发之地主算法判断牌型
  20. 12306 APP 同一乘客、同列火车候补订单与硬座的处理规则!

热门文章

  1. autopilot 源代码
  2. google map的配置(Android版)
  3. MVT和MVC的区别
  4. 计算机基础知识 JAVA基础知识
  5. [ZT]精彩的国外育儿教育读本,图文并茂
  6. 美标C70600(BFe10-1-1)无缝管
  7. 阿里开源支持10万亿模型的自研分布式训练框架EPL
  8. KVG制作-【Arduino指纹解锁 智能家居系列-01】DIY自制的智能门禁,AS608指纹解锁+红外线遥控解锁。附演示视频。
  9. 2009消费者最喜爱网站TOP100
  10. 全球最大的Spark+AI峰会发放优惠码SAIS20TRAIN,培训费优惠20%!