排序 n 个大小为 n 的字符串?

Posted

技术标签:

【中文标题】排序 n 个大小为 n 的字符串?【英文标题】:Sorting n strings of size n? 【发布时间】:2014-06-26 15:33:34 【问题描述】:

我想对O(n^2) 中每个长度为 n 的 n 个字符串进行排序?除了基于基数的排序或基于特里的排序之外,他们还有其他解决方案吗?

【问题讨论】:

为什么不适合你的问题?不可能有比这更简单的了。 因为构造字符串的字母没有固定数量。 也许你可以解释一下。你拥有的任何东西都可以表示为n个符号组,不同组中相同位置的符号可以相互比较。您在寻找就地算法吗?快速排序? 如果您没有“有限”或足够低的字母数,那么您无法通过标准编程方式在 O(n^2) 中解决此问题。你能做的最好的事情是 O((n^2)*log(n))。当标准手段还不够时,通常会使用神经网络,但通过神经网络方法创建正确的排序可能会很麻烦 您还想要最好的复杂性或运行时间吗?因为它们是非常不同的东西......为此,您应该添加目标平台、资源和数据规范,例如使用的 n 范围、字母和字符串数据集的统计属性...... 【参考方案1】:

假设您尝试使用基于比较的排序。在最坏的情况下,比较两个长度为 n 的字符串需要时间 O(n)。因此,在最坏的情况下,您只需进行 O(n) 比较即可对字符串进行排序。但是,这是不可能的,因为基于比较的排序算法平均需要 Ω(n log n) 次比较。这种最坏的情况是可以实现的;从数组 x1, x2, ..., xn 开始,可以形成字符串 an-1 x1, an-1x2, ..., an-1 xn,每次比较需要 Θ(n) 时间。

这排除了比较排序,它留下了利用字符串实际属性的方法。您列出的方法 - 基于 trie 的方法和基数排序 - 构成了大多数算法的基础(事实上,据我所知,所有字符串排序算法都是这些主题的变体)。这些算法有很好的优化实现。例如,burstsort 是一种优化的基数排序,旨在实现缓存友好,因此比朴素算法具有更好的性能。

您需要牢记的一个细节是,从中提取字符串的字母的大小确实会对运行时产生影响。对长度为 n 的字符串进行基数排序更恰当地花费时间 O(n2 + n|Σ|),其中 |Σ|是可以组成字符串的不同字符的数量。因此,如果您的字母表中有超过 n 个字符,则不一定要使用基数排序在 O(n2) 时间内对长度为 n 的 n 个字符串进行排序。

【讨论】:

以上是关于排序 n 个大小为 n 的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

P3809 模板后缀排序

python面试题-输入一个由n个大小写字母组成的字符,按Ascii码值从小到大排序,查找字符串中第k个最小Ascii码值的字母

后缀排序(codevs 1500)

HJ11 数字颠倒

华为机试:字串的连接最长路径查找

NYOJ 1233 差值(字符串排序+大数减法)