【问题标题】:Given a minimum-heap H, give a tight O() bound on the time complexity给定一个最小堆 H,在时间复杂度上给出一个严格的 O() 界限
【发布时间】:2018-08-21 04:39:32
【问题描述】:

我正在参加基本的 comp 250 课程,这是我被问到的一个问题。没有人能够弄清楚这个问题。可能的答案在底部。给定一个最小堆 H,给出一个名为 find3Min 的方法的时间复杂度的严格 O() 界限,该方法找到但不删除 H 中的三个最小键。

假设该方法创建并返回三个最小元素的列表。要回答这个问题,您需要考虑如何实现这种方法。

1- O(n log(n))

2- O(log(n))

3- O(3 log(n))

4-O(1)

目前我倾向于 4

【问题讨论】:

  • 我们应该假设一个二进制最小堆吗?

标签: methods time-complexity heap


【解决方案1】:

下面的讨论假设一个二进制最小堆。将堆与其他非传统堆类型配对的解决方案大不相同。

在最小堆中,两个最小的项是根项及其子项中较小的项。第三小的要么是根的孩子,要么是第二小的孩子。考虑这两个堆:

      A                   A
   B     C             B     D
  D E   F G           C G   F E

在第一个中,第三小的是根的两个孩子中较大的一个。在第二个堆中,第三项是第二小的项的子项。不管你如何安排堆,第三个元素要么是根的孩子,要么是第二小的孩子。

因此,无论堆的大小如何,您都可以在恒定时间内找到这三个项目。这使它成为 O(1)。

伪代码:

s1 = root // smallest item
s2 = root.left
s3 = root.right
if (s2 > s3)
    swap(s2, s3)

// s2 now holds the second smallest item

// next smallest is either s3 (other child of root),
// or the smallest of s2's children
if (s3 > s2.left)
    s3 = s2.left
if (s3 > s2.right)
    s3 = s2.right

注意

上面的讨论假设堆中的所有项都是唯一的(或者“第二小”意味着“小于或等于最小”)。如果堆可以有重复项,并且您想要第二小的唯一值,那么复杂度是 O(n)。

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 2018-09-29
    • 2017-06-30
    • 2021-12-07
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多