对每个n
个字符的n
字符串进行排序的最复杂程度是什么?它的平均值是n
倍吗?案例O(n log n)
或其他什么......?
答案 0 :(得分:7)
当您使用不同长度的两件事谈论O
符号时,通常您希望使用不同的变量,例如M
和N
。
因此,如果您的合并排序为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包含变体。
最简单的方法[在我看来] - 是
答案 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。