【问题标题】: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)。