如何在Omega(nt + nlogn)中对长度为t的n个字符串进行排序?

时间:2015-02-15 11:44:10

标签: algorithm sorting

您可以访问O(1)中的每个字符。 你只能要求比较两个结果为1,-1,0的字符。 含义,a<b, a>b, a=b

显然,排序数组受Omega(nlogn)的限制。因为对于两个字符串,我们需要在最坏的情况下比较t字符不应该是Omega(t*nlogn)

1 个答案:

答案 0 :(得分:3)

认为你需要比较字符串对的每个字符以对列表进行排序是错误的(因为如果字符串在一个地方不同,你不需要在以后的地方比较它们)。唯一的技巧是弄清楚如何有效地做到这一点。这是一种方式。

首先,在O(nt)中构建一个无序的trie(也就是说,每个节点都存储一个子节点,而不是列表)。

超过1个直接子节点不能超过n个节点,并且这些节点中的子节点总数不能超过2n(对于每个高于1的子节点,至少添加一个字符串对于特里)。因此,对所有节点的所有直接子节点进行排序最差O(n log n)(因为如果有k_1,k_2,...,k_m与sum(k_i)= 2n,则sum(k_i log k_i) )&lt; = 2n log(2n)。

对每个节点进行排序后,您可以遍历trie并在时间O(nt)内构建字符串的排序列表。