【问题标题】:Where is Bottom Up merge sort useful?自下而上合并排序在哪里有用?
【发布时间】:2013-06-29 08:47:12
【问题描述】:

我一直在阅读 Sedgewick & Wayne 的“算法,第 4 版”。本书介绍了两种使用归并排序的方法。使用标准的自顶向下递归合并排序或自底向上合并排序。

是否存在自下而上的归并排序优于自上而下的情况?

【问题讨论】:

  • @MitchWheat 该问题讨论了对两个排序例程的分析。不是应用程序。
  • 您根据复杂性分析选择应用程序!大声笑!
  • 两者的复杂度相同(O(nlogn))。这就是为什么问这个问题。自下而上是否更适合的具体情况有哪些?

标签: algorithm sorting language-agnostic merge mergesort


【解决方案1】:

自下而上的归并排序几乎可以在没有内存的情况下工作,被排序的数据保存在外部设备(例如磁带)上。我认为它在 50 年代和 60 年代曾经是这样工作的,我们在老电影中看到的那些高大的磁带机。

换句话说,自底向上合并是一种在线算法。它可以在根本没有随机访问的情况下工作。

我们首先处理输入磁带,并在读取输入磁带时分别写出 2 个元素的排序块,写入两个磁带,在两者之间交替写入。然后我们从刚刚写入的两个磁带中读取 2 个块,并写出合并的 4 个块,同时在输出磁带之间交替。然后我们再次切换输入和输出,并以 8 块为单位进行,等等。在最后一次运行中,只有一个磁带被写入 - 这就是结果。

这可以在只有 O(1) 额外内存的现代 RAM 硬件上进行模拟,并在原地完成合并。为了处理“短悬尾”问题(对于像2^n+k 这样的长度,对于小的k),可以沿输入序列交替地向前或向后扫描。

【讨论】:

    【解决方案2】:

    递归合并排序需要O(log n) 空间用于递归堆栈,但自下而上的版本可以让您做得更好(没有递归堆栈,只有几个整数跟踪您在输入中的位置)。

    如果您遇到一些不支持递归的语言并且只为您提供有限的堆栈内存(可能是嵌入式系统?),那么自下而上的版本将是您唯一的选择。

    Here's 一个自下而上的版本,说明了我的意思。

    【讨论】:

    • 不太... O(1) 空间。可以(实际上更精确,但也更麻烦)改为使用“对数成本”模型,其中空间以实际位而不是足够大的整数来衡量,在这种情况下,自底向上的归并排序需要 O(log n) 空间(就像 any 算法使用数组访问读取其完整输入一样!),但在此模型中,递归归并排序需要 O(log^2 n) 空间。
    • @j_random_hacker:对不起,你完全正确......出于某种原因,我认为跟踪输入位置需要 O(log log N) 位,我的错;感谢您指出。
    【解决方案3】:

    具有相同的复杂性,只有很小的差异,例如它进行合并的顺序。递归的从左到右,自下而上的水平。递归也使它有点slower sometimes,我认为不太直观。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多