并查集时间复杂度

news/2025/1/29 20:24:57/文章来源:https://www.cnblogs.com/weily09/p/18694815/dsu

大年初一奖励自己把这段分析啃下来。

并查集结构表示

  • 令集合 \(S\) 表示并查集中所有点;
  • 令集合 \(T\) 表示所有作为根的节点。

阿克曼函数

我们定义阿克曼函数 \(A_k\) 为:

\[A_k(j)= \begin{cases} j+1, & k=0 \\ A^{j+1}_{k-1}(j), & k\ge 1 \end{cases} \]

这里,\(f^i(x)\) 表示将 \(f\) 连续应用在 \(x\)\(i\) 次,即 \(f^0(x)=x,f^i(x)=f(f^{i-1}(x))\)

再定义反阿克曼函数 \(\alpha(n)\) 为使 \(A_{\alpha(n)}(1)\ge n\) 成立的最小整数值。

势能函数定义

令每个节点维护一个值 \(\mathtt{rank}\);每个节点的初始 \(\mathtt{rank}\) 定义为 \(0\)。在合并(union)时,若两个节点的 \(\mathtt{rank}\) 不同,将 \(\mathtt{rank}\) 较小的节点合并到 \(\mathtt{rank}\) 大的节点上;否则,任意将一个节点合并到另一个节点上,并令根节点(被合并的节点)的 \(\mathtt{rank}\) 值加一;查询(find)时不对 \(\mathtt{rank}\) 进行操作。这里 \(\mathtt{rank}\) 表示每个点作为根的子树深度的一个上界。记 \(x\) 节点的 \(\mathtt{rank}\)\(r(x)\),类似地,记 \(x\) 的父节点为 \(f(x)\);总有 \(r(x)+1\le r(fa(x))\)

为了定义势函数,先定义辅助函数 \(l(x)\)

\[l(x)=\max\left(k:r(f(x))\ge A_k(r(x))\right) \]

\(r(x)>1\) 时,再定义 \(i(x)\) 为:

\[i(x)=\max\left(i:r(f(x))\ge A^i_{l(x)}(r(x))\right) \]

这两个函数均满足 \(x\) 不是某个树的根且 \(r(x)\gt 0\),方便起见,若 \(x\) 是某个树的根或 \(r(x)=0\),定义 \(l(x)=i(x)=0\)

显然 \(l(x)\) 随操作的进行单调不降;同时,在 \(l(x)\) 不增的情况下,\(i(x)\) 单调不降。并且:

\[\begin{aligned} 0 & \le l(x) \lt \alpha(n) \\ 1 & \le i(x) \le r(x) \end{aligned} \]

以上内容由定义显然,不证。

定义一个点 \(x\) 的势能 \(\Phi(x)\) 为:

\[\Phi(x)=(\alpha(n)-l(x))\cdot r(x)-i(x) \]

定义整个并查集 \(S\) 的势能 \(\Phi(S)\) 定义为每个节点势能的和,即:

\[\Phi(S)=\sum_{x\in S}\Phi(x) \]

容易发现,势能非负且初始状态下势能为 \(0\)

下面证明均摊复杂度。

势能变化

先考虑任意一个 \(x\not\in T\)\(r(x)>0\),设操作前势能为 \(\Phi(c)\),操作后的势能为 \(\Phi(c')\),只有三种情况:

  1. \(i(c)\)\(l(c)\) 不变。显然 \(\Phi(c)=\Phi(c')\)
  2. \(l(c)\) 不变,\(i(c)\) 增加。由于 \(i(c)\) 至少增加 \(1\),有 \(\Phi(c')\le \Phi(c)-1\)
  3. \(l(c)\) 增加,此时 \(i(c)\) 可能减少,但显然最多减少 \(r(c)-1\),而 \(l(c)\) 至少增加 \(1\),由定义可得 \(\Phi(c')\le \Phi(c)-1\)

总之,对于任意 \(x\not\in T\)\(r(x)>0\),在单次操作后势能单调不增;更强地,若节点 \(x\)\(i(c)\)\(l(c)\) 有变化,则操作后势能至少减 \(1\)

union(x,y) 操作

方便起见,这里假设 \(x,y\in T\)

显然所需时间为 \(\Theta(1)\),考虑其引起的势能变化。

这里假设 \(y\) 是新的根节点,即 \(r(x)\le r(y)\)

显然只有三种点的势能可能变化:

  1. 节点 \(x\)(由树根变为非树根);
  2. 节点 \(y\)\(\mathtt{rank}\) 可能增加);
  3. 操作前 \(y\) 的子节点(父节点的 \(\mathtt{rank}\) 可能增加)。

其中第三类节点在上文已经讨论过。

节点 \(x\) 由树根变为非树根,\(l(x)\)\(i(x)\) 都不会减少,故 \(\Phi(x')\le \Phi(x)\)

节点 \(y\)\(\mathtt{rank}\) 至多加一,而 \(\Phi(y)=\alpha(n)\cdot r(y)\),故 \(y\) 的势能最多增加 \(\alpha(n)\)

综上,进行 \(\mathtt{union}\) 操作后,总的势能最多增加 \(\alpha(n)\),故均摊复杂度为 \(\Theta(\alpha(n))\)

find(a) 操作

若查找路径包含 \(s\) 个节点,显然查找的时间复杂度为 \(\Theta(s)\)。只需证明总势能至少减 \(s-\alpha(n)\),即可证明均摊复杂度为 \(\Theta(\alpha(n))\)

显然任意 \(x\in T\) 的势能不变,而其他节点的势能不增,故没有节点的势能增加。

只需证明有 \(s-\alpha(n)\) 个节点的 \(l(x)\)\(i(x)\) 有改变。

\(t(x)\)\(x\) 所处的树的根节点,只需证 \(r(t(x))\ge A^{i(x)+1}_{l(x)}(r(x))\) 即可。

即:

\[r(t(x))\ge A_{l(x)}\left(A^{i(x)}_{l(x)}(r(x))\right) \]

显然只需要找到一个 \(y\)\(x\) 的祖先(且不是树根),满足 \(l(y)=l(x)\) 即可。

显然存在一些 \(x\) 不满足要求,但由于不同的 \(l(x)\) 只有 \(\alpha(n)\) 个,最多只有 \(\alpha(n)\) 个节点不满足要求。

也就是说,至少有 \(s-\alpha(n)\) 个节点的势能会改变,也即总势能至少减 \(s-\alpha(n)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876890.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男生如何自己简单理发

快过年了,给自己理个发。 从24年10月份开始,目前已经给自己理发两次,都是短发寸头,给我爸和我三叔各理发一次,算是有点经验了,我准备过年前给自己再稍微修理头发一下。自己动手实践,且效果还不错的情况下,真的非常有成就感,如果有人指导情况下,其实自己理发难度不高,…

测序中的GC偏好

001、 测序中的GC偏好指的是基因组上GC含量在50%左右的区域更容易被测到,产生的reads更多,这些区域的覆盖度更高,在高GC或者低GC区域,不容易被测到,产生较少的reads,这些区域的覆盖度更少。用基因组单位长度的bin中的GC含量作为横坐标,覆盖度作为纵坐标作图,可以明显的…

人工智能(AI)简史:推动新时代的科技力量

人工智能(AI,Artificial Intelligence)是计算机科学的一个分支,旨在研究和开发可以模拟、扩展或增强人类智能的**系统**。它涉及多种技术和方法,包括机器学习、深度学习、自然语言处理(NLP)、计算机视觉、专家系统等。一、人工智能简介 人工智能(AI,Artificial Intell…

03. vim编辑器的使用

一、vim编辑器的使用vim 是 Unix 和 类 Unix 操作系统中常用的文本编辑器。如果 Ubuntu 系统默认没有安装 vim,我们可以使用 apt 工具安装 vim 编辑器。sudo apt install vim安装好 vim 之后,我们可以如下命令编辑一个文件。 vim 文件用 vim 打开一个文件就直接进入了 一般模…

“简单”学英语

本文总结了本人作为英语学渣的较为无痛的学习英语方法,无痛当然学习时间长一些,但相对简单一些,实操性强。 前言 最近和人聊天时对方说,感觉没什么可以学,但又想学点什么,我回答:”学英语啊“。有人迷茫,不知道怎么发展时,我回答:“先学点英语啊”。有人在犹豫要不要…

路飞学城5-celery

Celery Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。 文档:http://docs.jinkan.org/docs/celery/getting-started/index…

Linux 安装并使用 EasyConnect

x86_64-linux-gnu下载: 如果你下载之后要登入 https://yzftxdy.com 的话,你就先在浏览器里面输入这个网址,网站会弹出来给你下载的机会如果你的浏览器无法下载,你可以让别人帮你下载 .deb 文件。糖下载完了就 dpkg -i balabala.deb,于是你打开 "show apps"会找到…

[Jest] 测试快照

在对组件进行测试的时候,往往需要从两个方面进行测试:交互:确保组件在进行交互时功能正常 渲染:确保组件渲染输出正确(比如不会多一个或者少一个 DOM 元素)针对渲染方面的测试,我们就可以使用快照来进行测试。 所谓快照,就是给渲染出来的 DOM 元素拍一张“照片”(将最…

[React Jest] 测试 Hook

在进行 React 开发的时候,还有一个非常重要的功能模块,那就是 Hook,自定义 Hook 作为一块公共逻辑的抽离,也会像组件一样被用到多个地方,因此对 Hook 的测试也是非常有必要的。 Hook 没有办法像普通函数一样直接进行测试,因为在 React 中规中,Hook 必须要在组件里面使用…

07_LaTeX之绘图功能

除了排版文字,$\LaTeX{}$ 也支持用代码表示图形。不同的扩展已极大丰富了 $\LaTeX{}$ 的图形功能,`TikZ` 就是其中之一。本章将带你了解一些基本的绘图功能。07_\(\LaTeX{}\) 之绘图功能 目录07_\(\LaTeX{}\) 之绘图功能绘图语言简介\(\textrm{TikZ}\) 绘图语言\(\textrm{Tik…

《计算机网络》笔记——第四章 网络层

目录第4章 网络层网络层提供的两种服务网际协议IP虚拟互连网络分类的IP地址IP地址与硬件地址地址解析协议ARPIP数据报的格式IP层转发分组的流程划分子网和构造超网划分子网无分类编址CIDR(构造超网)最长前缀匹配网际控制报文协议ICMPICMP的应用互联网的路由选择协议 第4章 网络…

《计算机网络》笔记——第三章 数据链路层

计算机网络(第7版)谢希仁目录第3章 数据链路层使用点对点信道的数据链路层三个基本问题(1) 封装成帧(2) 透明传输(3) 差错检测点对点协议PPPPPP协议特点PPP协议的组成PPP协议的帧格式PPP协议的工作状态使用广播信道的数据链路层CSMA/CD协议使用集线器的星形拓扑以太网的信道利…