如果要对 n
个字符串进行排序,每个字符串都有 n
个字符,那么最坏情况下的时间复杂度是多少?它只会是平均情况下的 O(n log n)
的 n
倍吗?还是其他什么情况…?
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
,然后你将有O(N^2 log N)
M
来使其更清晰。他要求“最坏复杂度”,但给出了“平均”字符串大小……所以它仍然是 O(N),对吧? - Donald MinerO(n^2)
的时间复杂度? - KshitijO(n^2)
的时间。 - amit使用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非常相似。然而,在构建trie之后,我继续使用归并排序,而他则使用基数排序。