这是一个家庭作业问题,我被要求证明8元素二元堆需要进行8次比较。
但是当我使用一个例子时:1 2 3 4 5 6 7 8 我不确定我是应该自下而上还是自上而下。 但无论如何,我都试过了。
自上而下: 我已经完成了8个步骤但是当我计算比较次数时,我得到13:S
在底部: 我已经完成了7个步骤,但是当我计算比较次数时,我得到10:S
在尝试算法之后,我得到了比较:
答案 0 :(得分:2)
自下而上构建堆是线性的,自上而下(或递增)为O(n log n)
。
尝试遵循实际算法,不要只绘制树。我已经看到,在太多的考试中,人们绘制漂亮的树木但不遵循算法,这通常会导致不正确的结果,效率低下等等。树只是'想法',而不是'方法'。这里的方法实际上使用了一个数组。
编辑:自下而上从堆大小的一半开始。所以在元素4和7的比较中:
Level 3: 4 < 8
Level 2: 3 < 7, 3 < 6
2 < 5, 2 < 4
Level 1: 1 < 3, 1 < 2
Edit2:最大堆:
Level 3: 4 < 8 -> Swap 4-8.
Level 2: 3 < 7, 3 < 6 -> Swap 3-7, fix heap down (no-op)
2 < 5, 2 < 8 -> Swap 2-8, fix heap down:
2 < 4 -> Swap 2-4, fix heap down (no-op)
Level 1: 1 < 7, 1 < 8 -> Swap 1-8, fix heap down
1 < 4, 1 < 5 -> Swap 1-5, fix heap down (no-op)
Resulting heap:
8
5 7
4 1 6 3
2
进行10次比较。因此,我认为您的作业问题有错误,或者您错误地报告了问题。自下而上构建堆O(n)
并不意味着它需要进行n
次比较。对于确切的界限,请查看教科书。