8元二元堆需要多少次比较?

时间:2011-12-24 21:48:25

标签: algorithm data-structures heap binary-heap

这是一个家庭作业问题,我被要求证明8元素二元堆需要进行8次比较。

但是当我使用一个例子时:1 2 3 4 5 6 7 8 我不确定我是应该自下而上还是自上而下。 但无论如何,我都试过了。

自上而下: 我已经完成了8个步骤但是当我计算比较次数时,我得到13:S

在底部: 我已经完成了7个步骤,但是当我计算比较次数时,我得到10:S

在尝试算法之后,我得到了比较:

  1. H [L] = 8> H [i] = 4
  2. H [L] = 8> H [i] = 2,H [r] = 5> H [最大] = 8
  3. H [L] = 4> H [I] = 2
  4. H [L] = 6> H [i] = 3,H [r] = 7> H [最大] = 6
  5. H [L] = 8> H [i] = 1,H [r] = 7 <1。 H [最大] = 8
  6. H [L] = 4> H [i] = 1,H [r] = 5> H [最大] = 4
  7. 嗯,关于如何计算比较次数的任何帮助,我可以向他们展示8? 我应该使用什么方法(自下而上或自上而下)?

1 个答案:

答案 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次比较。对于确切的界限,请查看教科书。