排序字符串数组的复杂性

时间:2015-10-31 16:08:10

标签: sorting time-complexity

假设我们有一个字符串数组str = [" foo"," bar"," zebras"," topper"]需要排序以获得[" bar"," foo"," zebra"," top"],排序复杂性将为O (nlogn)其中n是数组的长度。但我们也进行字符串比较,它应该是O(m),其中m是最长字符串的长度(例如斑马和顶层)。所以最终的复杂性应该是O(m * nlogn)。如果我错了,请纠正我。

这个问题与here不同,因为在这里我将所有字符串与所有字符串进行比较,而不是仅使用一个固定字符串。

2 个答案:

答案 0 :(得分:1)

如果您仅使用普通字符串比较执行排序,则会获得此结果。

通过了解您的输入是字符串,您可以获得更好的性能(但我现在没有任何实现)。例如,如果依次按每个字符对字符串进行排序,则得到O(n m | alphabet |)。

答案 1 :(得分:0)

问题在于我们以两种不同的方式使用N。在一种情况下,它是字符串的长度(哪个字符串?)。 在另一种情况下,它是数组的长度。 您可以通过完全不使用变量“ N”或仅使用变量来防止此错误 当关于N可以代表什么没有歧义的时候。 实际上,我什至不会在这里使用a和b,或者m和n。太容易忘记哪个是哪个,然后将它们混合在一起。 O(a2)运行时与O(a * b)运行时完全不同。 让我们定义新的术语,并使用合乎逻辑的名称。

  • 设为最长字符串的长度。
  • 让a为数组的长度。

现在我们可以分部分进行操作:

  • 将每个字符串排序为0(s log s)。
  • 我们必须对每个字符串(有一个字符串)执行此操作,所以它是0(a * s log s)。
  • 现在我们必须对所有字符串进行排序。有一个字符串,因此您可能会倾向于说这需要0(对数a)的时间。您还应该考虑到您的需要 比较字符串。每个字符串比较花费0(s)时间。有0(对数a)比较, 因此,这将花费0(a * s log a)时间。

如果将这两个部分加起来,则得到O(a * s(log a + log s))。 就是这个。无法进一步降低它。