【问题标题】:Radix sort: LSD versus MSD versions基数排序:LSD 与 MSD 版本
【发布时间】:2012-08-09 23:57:33
【问题描述】:

"Introduction to Algorithms" 这本书提到了基数排序的 LSD(最低有效位)版本。但是,正如其他人在 stackoverflow 中指出的那样,还存在 MSD(最高有效位)版本。所以我想知道这些的利弊。我的猜测是 LSD 版本比 MSD 版本有一些好处,但我不确定。因此问题。

【问题讨论】:

  • 这是一个无效的问题,因为两种变体都存在,但属性略有不同。
  • 好的,但这不会改变问题。你应该把它放在'MSD和LSD之间有什么区别,优点和缺点'等方面
  • 好吧,现在我相信这个问题是个好问题。
  • 优点/缺点可能在很大程度上取决于您的问题域和预期用途。例如,使用 LSD 版本对 1000 到 3000 之间的整数列表进行基数排序可能会更好,因为 LSD 具有更大的可能值集,允许将问题分解为更多平均大小更小的子问题而不是 MSD 方法。
  • @twalberg 据我了解基数排序,每次传递都是 O(n),因此每个子问题的大小无关紧要。你能扩展一下吗?

标签: algorithm radix-sort sorting


【解决方案1】:

取自链接,可能有用:http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_sorting.aspx(在最底部)

LSD 基数排序的最大问题是它从差异最小的数字开始。如果我们可以从最重要的数字开始,那么第一遍将大大有助于对整个范围进行排序,之后的每一遍都会简单地处理细节。 MSD基数排序的思想是将所有具有相等值的数字划分到自己的桶中,然后对所有桶做同样的事情,直到数组被排序。自然地,这暗示了一种递归算法,但这也意味着我们现在可以对可变长度的项目进行排序,并且我们不必触及所有数字来获得排序后的数组。这使得 MSD 基数排序更快更有用。

【讨论】:

    【解决方案2】:

    正如Algorithms 一书中所述,LSD 和 MSD 都是字符串数组排序算法,基于所谓的键索引计数而不是比较。 因此,LSD 和 MSD 的运行时间与传统的快速排序或归并排序不同。

    正如 Dzhabarov 所提到的,LSD 和 MSD 之间的最大区别在于 MSD 首先考虑最高有效数字或字符,它本质上对字符串进行排序,而不遍历字符串中的所有数字。这是一个优势。但是,MSD 的递归实现比 LSD 使用更多的空间。

    下表说明了快速排序、LSD 和 MSD 之间的部分区别。

    algorithm    running time              extra space
    quicksort    N(lgN)^2                  1
    LSD          NW                        N
    MSD          between N and NW          N + WR
    

    其中N是数组的长度,W是字符串的长度,R是基数的大小。

    PS:正如书中提到的,Java系统排序使用的是通用的排序算法,字符串比较快,不是LSD或MSD。

    【讨论】:

    • 快速排序将 lg(n) 额外空间用于递归堆栈(或等价物)。 MSD 基数排序可以只使用递归堆栈(或等效的)额外空间,因为它不需要为了正确性而保持稳定,因此它可以使用比 LSD 基数排序更少的空间。
    【解决方案3】:

    当有固定长度时,LSD 比 MSD 快。 MSD 对于小文件来说太慢了,而且它需要对小文件进行大量的递归调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2015-08-25
      相关资源
      最近更新 更多