给定最小堆H,在时间复杂度上给出紧密的O()约束

时间:2018-03-13 02:36:39

标签: methods time-complexity heap

我参加了基础comp 250课程,这是我给出的一个问题。没有人能够解决这个问题。可能的答案位于底部。给出最小堆H,对名为find3Min的方法的时间复杂度给出一个紧密的O()限制,该方法找到但不删除H中的三个最小键。

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

1- O(n log(n))

2- O(log(n))

3-O(3 log(n))

4- O(1)

截至目前,我倾向于4

1 个答案:

答案 0 :(得分: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)。