【问题标题】:Analyzing Time complexity of union-find Algorithm?分析联合查找算法的时间复杂度?
【发布时间】:2013-12-06 09:38:02
【问题描述】:

请给出一个简单的方法来分析联合查找算法的时间复杂度。在这两种情况下 1.标准方法 2.加权联合启发式方法

我知道在标准版本中它的时间复杂度是:O(n^2) 在加权联合启发式方法的情况下,它是:O(m + n logn)

但我不明白,它是怎么来的。 假设:假设有n个元素和链表数据结构,每个节点都指向链表的头部,m=make set操作。

【问题讨论】:

  • 查看 Robert Sedgewick/Kevin Wayne 关于算法的书(第 4 版)。第 1.5 节
  • @Abhishek Bansal,你提供的链接没有分析算法。

标签: algorithm complexity-theory union-find


【解决方案1】:

首先是一些定义:m是make-set操作的数量。 n 是联合/查找操作的总和。

标准版

假设join(a,b) 使b 成为a 的根。

如果有一个 0.5n 个调用序列,例如 joint(1,2)joint(2,3)joint(3,4),您可以使用 @987654327 创建一个 0.5n 个节点链@ 在底部。然后find(1) 将花费 0.5n 次,因此调用 0.5n 次,您的运行时间将是 0.25n^2=O(n^2)

正如我们必须做的 m makeset 操作,我们最终得到 O(m+n^2)。

加权联合

我假设权重是集合的大小(而不是排名)。

对于给定的集合,让 h 是代表它的树的高度,w 是它的大小。 find 在该集合中最多花费 h 时间。通过归纳我们可以证明 h.

对于具有 w=1h=0 的单个节点,该公式通常成立。

现在考虑两棵树 ab 之间的连接,其中 a 成为新的根。假设 h 对 ab 成立,我们将证明它对联合也成立。我们知道 wa>=wb => wab = wa+wb >= 2wb。如果 a 严格高于 b,我们有 hab = ha 。否则(当 hb >= ha)我们有 hab = 1+hb

这证明 h 成立。用较少的数学术语,我们已经证明任何集合的高度小于其大小的对数,因此查找最多需要 O(log(k)) 时间,其中 k 是设置。

j 为联合操作的数量。每个union 接触2 个元素,因此任何集合的最大大小都以2j 为界。

联合和查找的运行时间因此是O(j+k log(2j)) = O(n + n log(2n)) = O(n log(n))。我们必须再次执行 m makesets,所以总共得到 O(m + n log(n))

【讨论】:

  • 什么是make-set操作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
相关资源
最近更新 更多