我参加了基础comp 250课程,这是我给出的一个问题。没有人能够解决这个问题。可能的答案位于底部。给出最小堆H,对名为find3Min的方法的时间复杂度给出一个紧密的O()限制,该方法找到但不删除H中的三个最小键。
假设该方法创建并返回三个最小元素的列表。要回答这个问题,您需要考虑如何实施这样的方法。
1- O(n log(n))
2- O(log(n))
3-O(3 log(n))
4- O(1)
截至目前,我倾向于4
答案 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)。