【问题标题】:Why does BUILD-MAX-HEAP take time O(n) while HEAP-SORT takes O(nlgn) time?为什么 BUILD-MAX-HEAP 需要时间 On) 而 HEAP-SORT 需要 O(log n) 时间?
【发布时间】:2013-07-17 00:17:57
【问题描述】:

在阅读“算法简介”时,我想知道为什么 HEAPSORT 需要时间 O(nlgn),而 BUILD-MAX-HEAP 需要时间 O(n)。

HEAPSORT 从 A.length 开始它的 for 循环直到 2,调用 MAX-HEAPIFY

BUILD-MAX-HEAP 在 A.length/2 到 1 的底部开始其 for 循环,调用 MAX-HEAPIFY

MAX-HEAPIFY 需要时间 O(lgn)。我想知道是什么导致BUILD-MAX-HEAPHEAPSORT 更快。

【问题讨论】:

  • 请参阅Wikipedia 以证明为什么堆化是 O(n)。
  • Heapsort 基本上以 MAX-HEAPIFY yes 开头(尽管有时表述方式可能略有不同),但是,heapsort 然后继续从堆中删除每个元素。正是这个额外的步骤使它成为 O(n log n) 而不仅仅是 O(n)。

标签: performance algorithm sorting time heap


【解决方案1】:

在构建堆时,我们总是从底部开始“HEAPIFY”元素,但在排序时,我们总是“HEAPIFY”最顶部的元素。在这两种情况下,高度都是不同的,但需要注意:

*在构建堆时,我们堆化的最大元素位于底部,它们堆化的高度非常小,因此 O(n),但在排序时,我们总是堆化最顶部的元素。即使高度在降低,它也没有之前的情况那么有利。 *

我希望你明白我想说什么。

【讨论】:

    【解决方案2】:

    在堆排序算法中,您总是担心“堆条件”,即不应将任何元素放在堆中大于更大元素的上方,如果有这样的元素违反堆条件,则修复它。修复堆条件需要多少努力取决于需要修复的元素在底部上方的高度。

    在构建堆的初始阶段,后半部分元素不会违反堆条件,因为下面没有任何内容。四分之一的元素违反了堆条件,但仅比堆底部高一排,因此只需一步即可修复堆条件。那么八分之一的元素违反了堆条件,但是刚好在堆底的上方两行,所以只需要两步。

    如果将所需的步数相加,则得到 n/4 * 1 + n/8 * 2 + n/16 * 3 + n/32 * 4 ... 加起来小于 n。但是,当您通过重复将具有最大数字的第一个元素放在数组末尾进行排序时,堆的顶部总是违反了堆条件,底部上方有 (log n) 行,因此需要 log n 个步骤来修复堆条件。

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 2023-02-23
      • 2018-04-15
      • 1970-01-01
      • 2018-01-14
      • 2014-05-29
      • 2012-08-07
      • 1970-01-01
      • 2019-12-03
      相关资源
      最近更新 更多