MSD 与 LSD 基数排序

Posted

技术标签:

【中文标题】MSD 与 LSD 基数排序【英文标题】:MSD vs LSD radix sort 【发布时间】:2014-01-12 14:46:38 【问题描述】:

我不确定为什么要使用 LSD 基数排序。

默沙东的优势:

    它可以处理可变长度的字符串 它并不总是需要扫描整个字符串(它可以更快地决定顺序) 可以使用插入排序来规避计数排序的缺点。

【问题讨论】:

考虑按数字顺序对整数进行排序,而不是按字典顺序对字符串进行排序。如需更详细的回复,您可能应该尝试cstheory.stackexchange.com @beaker- cstheory.stackexchange.com 用于研究级 CS 问题。我认为这在那儿不合适。 @templatetypedef 糟糕的剪切和粘贴工作,抱歉。我要去cs.stackexchange.com,由于某种原因,它没有出现在页面底部的方便列表中。 【参考方案1】:

LSD 基数排序优于 MSD 基数排序的一个优点是 LSD 基数排序是一种稳定的排序 - 如果有多个元素要使用相同的键进行排序,那么当您运行 LSD 基数排序,但如果您运行 MSD 基数排序,则可能不会。如果要对键是字符串或整数的键/值对进行排序,并且希望保留原始的相对顺序,则 LSD 基数排序优于 MSD 基数排序。

希望这会有所帮助!

【讨论】:

为什么 MSD radix 不是一个稳定的排序算法?即使在这里,我们也使用计数排序(这是稳定的)对数字进行排序,但从 MSB 对吗? @Zephyr MSD 基数排序的一些实现——尤其是二进制 MSD 基数排序——使用不稳定的分区策略,就像快速排序所做的那样。您可以稳定地执行此操作,但这不是必需的。查找“二进制快速排序”以了解更多信息。 是的,如果我们使用快速排序,那么它会不稳定。但是你能告诉我为什么我们不能使用计数排序来对桶内MSB相同的元素进行排序吗? IIRC 计数排序如果在 MSD 基数排序中使用它确实会改变时间复杂度,因为随着递归的进行,扫描每个桶的成本开始越来越多地被考虑在内(每个递归分支都会产生桶扫描的成本)。 您需要包含一个“+ b”项来说明迭代所有存储桶的成本。 +b 项将改变此递归解决的内容。此外,您不能假设每个子问题的大小为 n / b,因为您不能假设每个数字都具有相同的表示。可能是某些数字比其他数字更常见。此外,这种重复需要考虑到您的数字中的 base-b 数字的数量,因为经过这么多次迭代后,算法肯定会终止。【参考方案2】:

@templatetypedef 总结得很漂亮。 MSD 基数排序可用于对 lexicographic order 中的键进行排序。 查看wikipedia 以获取工作示例和更清晰的信息。

【讨论】:

谢谢。好吧,整数的字典顺序是自然顺序。我认为这两种基数排序变体试图实现的目标没有区别。 @user1377000 是的,如果从相同的方向开始,基本上两者都对整数和字符串执行类似的操作。一般字典序是从左到右实现的,非降序排序是从右到左。【参考方案3】:

对我来说,LSD 基数排序的最大优势是速度,因为它是无分支算法。对于相对较短的固定长度键,它使 LSD 基数排序成为可能的最快排序算法。 LSD的稳定性也是一个不错的特点。

【讨论】:

以上是关于MSD 与 LSD 基数排序的主要内容,如果未能解决你的问题,请参考以下文章

排序6:基数排序

数据结构里面的“基数排序”到底是啥

PHP常见排序算法12——基数排序

桶排序和基数排序有啥区别?

字符串算法—字符串排序(下篇)

排序算法——基数排序