【问题标题】:Finding the 7th smallest element in Min heap在最小堆中找到第 7 个最小的元素
【发布时间】:2018-11-29 03:51:38
【问题描述】:

在一个有n个元素的min-heap中,最小的元素在根,可以及时找到第7个最小的元素-

a) Θ(nlogn)
b) Θ(n)
c) Θ(logn)
d) Θ(1)

================================================ =============================

我对选项 cd 感到很困惑。我们是否需要进行提取Min 7 times 或只是在根级别进行比较 - 0 比较,在第 1 级别 - 根与 LC 和 RC 之间的 3 比较等等。

【问题讨论】:

  • 如何,请分享您的见解。
  • @JimMischel 请分享您的知识! :)
  • 您需要 6 次提取操作才能找到第 7 个元素。二进制堆中的提取操作具有O(log(n)) 的复杂性。总体复杂度为O(6 * log(n)) = O(log(n))
  • @DAle 我们可以应用堆排序吗?如果不能,为什么?

标签: algorithm data-structures time-complexity heap


【解决方案1】:

我会说这个问题是模棱两可的。

如果我们必须使用堆接口,我们最好提取最少 6 次,然后查看第 7 次最小值。每次除了最后一次,我们都可以花费从1(最好的情况)到log n(最坏的情况)的任何操作,所以它是O(log n)而不是Theta。第 7 次操作是Theta(1)

如果我们可以利用堆的内部结构,正如 Yves Daoust 已经指出的那样,我们可以确定堆在其前 7 个级别中包含其最小元素,最多 1+2 +4+8+16+32+64=127 个元素。在存储堆的数组的前 127 个数字中找到最小值是 Theta(1),因为无论多么大,127 仍然是一个常数,并且不依赖于 n

看到选项(c) 在第一种情况下并不是一个真正的正确答案(如果使用O() 而不是Theta()),我会选择(d)

【讨论】:

  • 关于堆接口限制的有趣评论。
  • @YvesDaoust 我所说的Theta() 对第一部分没有意义,只有O() 才有意义。在最好的情况下(第一次迭代后筛选退出),提取最小值需要1 操作。在最坏的情况下(筛选一直到底部),它需要log n 操作。所以 sift-down 不属于任何Theta() 复杂度类。 O() 中的紧密绑定是 O(log n)。我知道O(log n)O(n) 等的一个子集,但Theta() 并不如此。对吧?..
  • 这个问题不够明确。你说得对,在堆操作的情况下,原始运行时间没有 Θ 类。但是最坏情况的运行时间确实是Θ(Log n)。 [原始运行时间不是 n 的明确函数。最坏情况、最好情况和平均情况是。] 当我们将自己限制在前 7 个级别时,我们当然有 O(1)=Θ(1)。
  • @YvesDaoust 嗯,我明白了,谢谢!因此,如果问题是关于最坏情况下的性能,选项(c) 将是一个正确的答案,并且它提到我们必须坚持使用界面。这对我来说似乎有太多未提及的默认值,所以我会坚持使用(d)
  • @Gassa 请以简化的方式解释这一行 - 因为无论多大,127 仍然是一个常数并且不依赖于“n”
【解决方案2】:

在最小堆中元素不像二叉搜索树那样存储(即左侧小于根,右侧大​​于根)。较小的元素可以出现在任何子节点上,因此我们不能像在二叉搜索树中那样搜索元素。

所以,我们首先需要从堆中弹出前 6 个元素并将它们存储在数组中,现在第 7 个元素在根上,因此我们将其弹出并存储。现在我们将之前弹出的所有 6 个元素推入堆中。

时间复杂度:- 7 次弹出操作和 6 次推送操作,因此总共 7 + 6 = 13 次操作。并且每次操作都会花费 logn 时间。 因此,时间复杂度变为 13*logn 或简单地 O(logn)

【讨论】:

  • 我们可以应用Heapsort吗?如果不是,为什么?
  • 可以,但是效率非常低,时间复杂度为 O(nlogn) 而当前算法的时间复杂度为 O(logn)
  • 不,你必须在有限数量的元素中搜索,因此 O(1),即使是排序。
【解决方案3】:

在最坏的情况下,第 7 个元素将在堆的 7 个第一层中找到,其中最多包含 127 个元素。您可以通过对这些元素进行排序来找到它,这需要 O(1)。

注意:这并不是一个有效的过程,它只是一个简单的理论论证,证明问题可以在恒定时间内解决。

一个可能更好的过程是在 127 个元素的堆上执行堆排序的选择阶段,这将像 lg 127 + lg 126 + lg 125 + lg 124 + lg 123 + lg 122 + lg 121 操作(非常粗略估计,但没关系,它是 O(1))。

【讨论】:

  • 在看到估计中的缺陷后更新。
  • 那么,最终答案是O(1)还是O(logn)?
  • @MicroLegions:Gassa 解释了它。在问题的受限版本中,答案可能是 Θ(Log N)。按照正常的解释,正如我在回答中明确指出的那样,Θ(1)。
【解决方案4】:

答案将是 O(n)。这里的每个人都假设您将有一个常数范围,您可以在该范围内找到答案,因此 O(1) 将是答案,但他们错过了最小堆可以具有的点重复。假设第 6 个最小的元素有 100 万个重复项,那么当它甚至没有给定重复项的数量时,你将如何计算范围,最重要的是,假设最后一个元素是第 7 个最小的元素,你将不得不搜索整个数组。因此答案是n。

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 2015-01-15
    • 2014-05-07
    • 2012-10-22
    • 2020-05-08
    • 2018-06-02
    • 2021-10-31
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多