disjoint-sets - 使用路径压缩证明联合查找的时间复杂度
问题描述
维基百科页面:维基百科页面指出
如果对 n 个元素应用 m 个操作(Union 或 Find),则总运行时间为 O(m log*n)。
得出这个结果的详细分析是:
我的问题是:
- 总和不应该
(m+n)log*n
代替mlog*n
吗? - 1000 次 Find 操作的平均时间复杂度是否与每个 Find 操作的时间复杂度相同?
解决方案
免责声明:我仍在尝试自己理解这些证明,所以不要声称自己是专家!我想我可能有一些见解。
1)我认为他们假设m = O(n),从而使O((m + n)lg *(n))变为O(mlg *(n))。在 Tarjan 的原始证明(逆阿克曼函数界)(可在此处找到:https ://dl.acm.org/doi/pdf/10.1145/321879.321884?download=true )中,他假设 FIND 操作的数量 m 超过 n。在算法简介(CLRS - ch.21)中,他们证明的界限是 m 操作,其中 n 是 MAKE-SET。人们似乎在假设 m 将渐近大于或等于 n。
2) 他们证明的是每次操作的摊销成本。这是一种分析技术,它将一系列操作所花费的时间限制在一个常数因子内,您可以从中轻松计算每个操作的平均时间。有几种不同的方法可以解决它(我相信这是聚合分析的一个例子?)。值得研究!
推荐阅读
- javascript - Service Worker 缓存了所有文件,无法更新
- java - 关于java线程中等待通知的问题
- flutter - Flutter ListView.builder() 小部件的交叉轴占据了整个屏幕高度
- excel - 如何引用指定帐户中的文件夹?
- php - Laravel WebSockets 几个小时后停止工作
- r - 如何将数据帧转换为时间序列并在 R 中检测周期?
- swiftui - 如果在 ScrollView 中显示,SwiftUI 控件不会响应 Catalyst 中的输入(点击)
- arrays - MongoDB:返回在数组上有交集的对象
- python - 尝试安装 PIL 但 pip install PIL 失败
- r - 多个 if else 语句对 R 中新列中的现有值进行分类