字符串的线性时间排序算法?

时间:2012-06-12 19:36:55

标签: java algorithm sorting complexity-theory big-o

我有一个字符串数组,每个字符串都有不同的长度。 e.g:

s[0] = "sSWXk"
s[1] = "qCk"
s[2] = "sOQQXPbk"
.
.
.
s[x] = "KVfdQk";

我也得到了

n = s[0].length() + s[1].length() + ... + s[x].length()

我需要一个时间复杂度为O(n)的排序算法,用于按字典顺序对这些字符串进行排序,以便(例如)

a < ab < b < bbc < c < ca

有什么建议吗?时间复杂度是算法的基本要求。

3 个答案:

答案 0 :(得分:10)

有一种称为 trie 的数据结构,最适合这种情况。如果您将所有单词插入到trie中,然后在trie上执行DFS,您将按排序顺序返回单词。这样做也需要时间O(n),其中n是所有字符串中的字符总数。

由于我认为这是家庭作业,我将留下如何实施trie作为练习的细节。 : - )

希望这有帮助!

答案 1 :(得分:1)

我有一个类似的测试问题,我猜错了,但此后一直困扰着我。因此,我一直在研究它,并且我认为还有另外两种方法可能会在线性时间内产生结果。一种是将字符串视为以26为底的整数序列,并在将字符串填充为等长后在数组上使用基数排序(以某种方式-可能有一种巧妙的方法来这样做,而不会大幅增加存储空间,但我还没有弄清楚细节)。我尚未构建示例或对其进行测试,因此无法确定这是否可行,但是它的原理似乎很合理。另一种方法是存储桶排序-使用26个元素数组,其中包含指向26个列表(存储桶)的指针。将每个字符串排序到相应的存储桶链接列表(以“ a”开头的字符串进入第一个数组元素所指向的列表等),然后使用标准O(n log n)方法对每个列表进行排序。我并不完全理解数学,但是根据科门(Cormen)的教科书“算法简介”,以这种方式使用存储桶排序最终会具有线性时间复杂度。但是,只要可以满足右填充要求而无需实际为其分配存储空间,该空间似乎将比Radix样式的方法大。

答案 2 :(得分:0)

因为这是一个家庭作业问题,所以我只能给出一个提示。 提示:使用计数排序的修改版本。如果我们假设char是8位,那就很实用。