从左到右基数排序
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)