问题描述
String str[] = {"Hello","World","John","Doe"};
Arrays.sort(str);
System.out.prinltn(Arrays.toString(str));
我知道Arrays.sort(int [])的时间复杂度为O(nlgn)。但是字符串数组呢?由于排序字符串数组在内部使用compareto函数比较两个字符串。它会改变方程式吗?
解决方法
这样说的问题:排序为O(n logn)是因为这是不完整的,因此是模糊的,未定义的语句。目前尚不清楚其含义。问题是:您未能定义n
是什么。
现在,实际上,n
在上下文中通常很明显。例如,如果我说:“假设最佳排序算法,将整数数组排序为O(n logn)”,那么几乎每个听到此消息的人都会立即意识到,尽管我没有明确说出n
显然,我的意思是: n =该数组中整数的数量。
所以让我们回到您的问题:现在n不再清楚了。
n是数组中的字符串数吗? n是该数组中所有字符串的平均字符数吗?
我们实际上是在这里谈论2个独立的变量。因此,要用大O表示法正确地描述此问题的性能特征,您应该说:
- 给出:
String[] str
,例如:str = {"Hello","World","John","Doe"}
- 让
n
为str
数组中的元素数。 - 让
m
为str
数组中字符串的平均字符数。 - 然后,在此数组上调用
Arrays.sort(str)
将具有O(m * n log n)
的性能特征。
之所以为O(m * n logn)的原因是,排序算法本身将运行O(n logn)
比较操作以便执行排序。并且每个比较操作都需要O(m)
的时间才能完成,尽管那是最糟糕的情况:给定Hello
和World
,即使这两个m = 5
,比较仅需1步即可完成;该算法比较H
和W
并立即回答,甚至从不看ello
或orld
。但是,如果字符串是Hello1
,Hello2
,Hello3
和Hello4
,那么每比较2个字符串,就可以保证有5个“步骤”,并且会有{ {1}}比较。