【问题标题】:Build a sorted list from a maximum heap in O(n * log(log(n)))?从 O(n * log(log(n))) 中的最大堆构建排序列表?
【发布时间】:2012-06-24 17:21:08
【问题描述】:

我有一个数组A 中表示的最大堆,我有以下问题:

Is it possible to build a sorted list , based on the maximum 
heap - A - in O(n*log(log(n))) ? 

我的回答:不,我们不能!我们总是可以在A 上运行并在O(n*log(n)) 中执行 MergeSort 或O(n*log(n)) 中的快速排序(最坏情况O(n^2))。

我还想也许可以基于 A 构建实际的堆,这需要 O(n) ,然后从那里提取 O(n*log(n)) 中的所有元素,但我在这里一无所获。

目前我看不到 O(n*log(log(n))) 的任何选项,有什么想法吗?

【问题讨论】:

  • O(n) 中的合并排序?这通常是不可能的。
  • 如果不为你做功课,我很难回答这个问题。 (太糟糕了,因为这是一个有趣的练习:)
  • @larsmans:创意答案+1 :)

标签: algorithm sorting heap


【解决方案1】:

我认为这是不可能的: 有一个算法可以在 o(n) 中构建一个最大堆(看这里Is there a O(n) algorithm to build a max-heap?) 因此,如果你可以在 o(n) 中创建一个堆,然后在 o(nlog(log(n)) 中对其进行排序, 你可以得到一个在 o(nlog(log(n)) 中工作的排序算法,如果你没有关于输入的初始信息,这是不可能的。

【讨论】:

  • 我要强调的是,当您只有一个比较运算符时,不可能比 O(Nlog(N)) 更快地排序。 O(Nlog(N)) 是比较排序的理论最低界限。
  • 这篇wikipedia 文章包含有关为什么会这样的更多信息。
【解决方案2】:

如果您有一个数组形式的最大堆,那么在该数组上使用诸如插入排序之类的东西应该会产生非常好的结果。数组形式的最大堆几乎已排序(降序),当数组几乎已排序时,插入的最佳情况是 O(n)。它仍然会有 O(n^2) 最坏的情况,但我认为你不会遇到最坏的情况。

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多