使用Merge Sort进行字符串排序

时间:2012-02-26 00:29:47

标签: string algorithm sorting mergesort

对每个n个字符的n字符串进行排序的最复杂程度是什么?它的平均值是n倍吗?案例O(n log n)或其他什么......?

3 个答案:

答案 0 :(得分:7)

当您使用不同长度的两件事谈论O符号时,通常您希望使用不同的变量,例如MN

因此,如果您的合并排序为O(N log N),其中N是字符串数...并且比较两个字符串O(M)其中M与长度成比例字符串,然后你会留下:

O(N log N) * O(M)

O(M N log N)

其中M是字符串长度,N是字符串数。你想使用不同的标签,因为它们并不意味着相同的东西。

在奇怪的情况下,平均字符串长度与字符串数量成比例,如果你有一个存储在字符串中的矩阵或类似的东西,你可以争辩M = N,然后你就有{ {1}}

答案 1 :(得分:3)

作为@orangeoctopus,对大小为n的{​​{1}}字符串集合使用标准排名算法将导致n计算。

但是 - 请注意,可以O(n^2 * logn)中执行,radix sort包含变体。

最简单的方法[在我看来] - 是

  1. 构建一个trie,并用所有字符串填充它。进入 每个字符串为O(n^2),您执行O(n)次 - 总共n
  2. 在trie上执行DFS,每次遇到字符串结束标记时 - 将其添加到已排序的集合中。以这种方式添加的字符串的顺序是按字典顺序排列的,因此当您完成后,您的列表将按字典顺序排序。
  3. 很容易看到你不能比O(n^2)做得更好,因为只读取数据是O(n^2),因此这个解决方案在时间复杂度的大O表示法方面是最佳的。

答案 2 :(得分:0)

使用MergeSort对n个项目进行排序需要进行O(N LogN)次比较。如果比较两个项目的时间为O(1),那么总运行时间将为O(N logN)。但是,比较两个长度为N的字符串需要O(N)时间,因此天真的实现可能会遇到O(N*N logN)时间。

这似乎很浪费,因为我们没有利用只有N字符串来进行比较的事实。我们可能以某种方式预处理字符串,以便比较平均花费更少的时间。

这是一个想法。创建Trie结构并在其中放置N个字符串。该trie将具有O(N*N)个节点,并且需要O(N*N)时间来构建。遍历树并将整数“排名”放到树的每个节点上;如果R(N1)< R(N2)则与Node1相关联的字符串在字典中与Node2相关联的字符串之前。

现在继续使用Mergesort,通过查找Trie在O(1)时间进行比较。总运行时间为O(N*N + N*logN) = O(N*N)

编辑:我的回答与@amit非常相似。但是我继续进行mergesort,然后在trie构建步骤之后继续使用radixsort。