String 使用合并排序的字符串排序

String 使用合并排序的字符串排序,string,algorithm,sorting,mergesort,String,Algorithm,Sorting,Mergesort,排序n字符串(每个字符串包含n个字符)的最复杂程度是什么?它只是n乘以它的平均大小写O(n log n)还是其他什么…?当你谈论两个长度不同的事物的O符号时,通常你想要使用不同的变量,比如M和n 因此,如果您的合并排序是O(N log N),其中N是字符串数。。。比较两个字符串是O(M),其中M随着字符串的长度进行缩放,然后剩下: O(N log N) * O(M) 或 其中,M是字符串长度,N是字符串数。您希望使用不同的标签,因为它们的含义不同 在一个奇怪的情况下,平均字符串长度随着字符串的

排序
n
字符串(每个字符串包含
n
个字符)的最复杂程度是什么?它只是
n
乘以它的平均大小写
O(n log n)
还是其他什么…?

当你谈论两个长度不同的事物的
O
符号时,通常你想要使用不同的变量,比如
M
n

因此,如果您的合并排序是
O(N log N)
,其中
N
是字符串数。。。比较两个字符串是
O(M)
,其中
M
随着字符串的长度进行缩放,然后剩下:

O(N log N) * O(M)

其中,
M
是字符串长度,
N
是字符串数。您希望使用不同的标签,因为它们的含义不同


在一个奇怪的情况下,平均字符串长度随着字符串的数量而变化,比如如果你有一个矩阵存储在字符串中或者类似的东西,你可以说
M=N
,然后你就有了
O(N^2 log N)

作为@orangeoctopus,对大小为
n
n
字符串集合使用标准排序算法将导致
O(n^2*logn)
计算

但是-请注意,可以在
O(n^2)
中执行此操作,但有不同的选项

(在我看来)最简单的方法是

  • 构建一个,并用所有字符串填充它。套房 每个字符串都是
    O(n)
    ,您可以执行
    n
    次-总共
    O(n^2)
  • 在trie上执行一次操作,每次遇到字符串的结束标记时,将其添加到已排序的集合中。以这种方式添加的字符串的顺序是按字典顺序排列的,因此完成后列表将按字典顺序排列

  • 很容易看出,您无法比
    O(n^2)
    做得更好,因为只读取数据是
    O(n^2)
    ,因此就时间复杂度的大O表示法而言,此解决方案是最佳的。

    使用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)不清楚你在问什么,你不是说“O(M)wherem…”而不是“O(N)wheren…”?虽然这是最差的情况性能,但根据要求,应该注意的是,比较两个字符串的平均情况性能是O(1),因为它在几何上变得越来越少,您需要访问字符串中的每个附加字符的可能性越来越小。当然,我的意思是将它们分开,但为了更清楚,我将其改为使用
    M
    。他要求的是“最糟糕的复杂性”,但给出的是“平均”刺大小。。。所以它仍然是O(N),对吗?是的,这个问题有点不清楚,因为它混合了最差和平均值。我想你的答案会更有力地涵盖这两个方面。是的——通常我在回答问题时付出的努力与在问题上付出的努力成正比:)但现在我认为应该是O(n^2)。我想说“预序遍历”而不是说“DFS”会更清楚。不使用trie也能实现吗?@Kshitij是的,对字符串进行基数排序,trie只是一个建议-这里可以使用标准的基数排序-每次迭代使用字符(或其位表示)来实现当前的偏序,直到耗尽所有位/字符。这也需要
    O(n^2)
    。您是否还保留了将单词映射到trie节点的索引,以便在合并排序期间访问这些排名?请澄清。另外,我认为还应该包括遍历的成本。因此复杂性应该是O(NN+NN+NlogN)。如果这是真的,那么基数排序方法似乎更好,因为它是O(NN+N*N)。@CERGD:Big O表示法只处理关于输入大小的渐近增长;它不处理常数因子O(2*NN+NlogN)=O(NN)。几个月后重新审视这个问题,很明显,阿米特的答案更简单、更快。不过,我不同意你的观点:测量实际性能的唯一方法是使用计时器,而不是观察O符号中的常数因子。甚至在某些情况下,在实际情况下,一个具有更大O()函数的算法胜过另一个。
    O(M N log N)