从左到右基数排序

Posted

技术标签:

【中文标题】从左到右基数排序【英文标题】:left to right radix sort 【发布时间】:2011-04-11 16:49:17 【问题描述】:

基数排序从租用有效位到最高有效位对数字进行排序。 我有以下情况:

我的字母是英文字母,因此我的“数字”是英文字符串。这些字符串的字符从左到右一次显示一个。也就是说,首先显示所有字符串的最高有效数字,依此类推。在任何阶段,我都会有一组经过排序的 k 个字符的长字符串。此时,每个字符串都会显示一个字符。我想对新的字符串集进行排序。我如何在不从头开始的情况下有效地做到这一点?

例如,如果我有以下排序集 for, for, sta, sto, sto

在每个字符再显示一个字符后,集合是 form, fore, star, stop, stoc

新的排序集应该是 fore, form, star, stoc, stop

我希望在添加每个新字符后复杂度为 O(n),其中 n 是集合的大小。

【问题讨论】:

这听起来完全等同于 MSD 基数排序 (en.wikipedia.org/wiki/…)。 @Alexey 不同之处在于后面可以显示更多的数字,所以它是一种在线算法,而对于 MSD 基数排序,应该事先提供完整的数字 对。就好像你总是多一个数字要排序,所以我同意“完全等价”并不完全正确。 【参考方案1】:

如果您想在 O(n) 中执行此操作,您必须以某种方式跟踪“组”:

for, for | sta | sto, sto

在此组中,您可以根据字符串的最后一个字符对字符串进行排序,从而保持集合的排序。

可以通过多种方式存储组。乍一看,我会推荐某种记忆组开始/结束的偏移量。但是,这会消耗额外的内存。

另一种可能是将字符串存储在某种prefix-tree 中,这很自然地对应于“一个接一个地添加一个字符”,但我不知道这是否适合您的应用程序。

【讨论】:

我一直在玩弄小组的想法,但我似乎不能比 min ( O(bn) , O(nlgn)) 做得更好,其中 b 是字母表的大小。我怀疑是否有使用前缀树的自然解决方案,它允许动态构造和在线性时间内按排序顺序访问叶子 @AnkurVj 您可以尝试在前缀树的“下方”添加一个链表,这样您就可以使用前缀树来导航元素并使用列表来检索所有元素。另一方面,包含这个链表意味着在从前缀树中插入/删除元素时需要做更多的工作。

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

桶排序基数排序

桶排序基数排序

从上到下,从左到右对页面(2D 平面)上的框进行排序。 (Python)

Tensorflow - 通过跟踪边界框并输出它们从左到右显示排序的预测

如何在从左到右和从上到下排序的二维数组中搜索数字?

在一个二维数组中,每一行都按照从左到右递增的顺序排序