Java 使用Arrays.sort进行数组分析的性能
我有一个使用数组的代码。排序(char[])的方式如下:Java 使用Arrays.sort进行数组分析的性能,java,performance,big-o,code-analysis,Java,Performance,Big O,Code Analysis,我有一个使用数组的代码。排序(char[])的方式如下: void arrayAnalysis(String[] array){ for(int a=0; a<array.length;a++){ char[] letters = array[a].toCharArray(); Arrays.sort(letters); ... for(int b=a+1; b<array.length;b++){
void arrayAnalysis(String[] array){
for(int a=0; a<array.length;a++){
char[] letters = array[a].toCharArray();
Arrays.sort(letters);
...
for(int b=a+1; b<array.length;b++){
char[] letters2 = array[b].toCharArray();
Arrays.sort(letters2);
if(Arrays.equals(letters, letters2)
print("equal");
}
}
}
void数组分析(字符串[]数组){
对于(int a=0;a您运行n个外部循环,每个外部循环运行n个内部循环,每个内部循环调用一个O(n logn)算法,因此最终结果(在级别之间没有任何交互)是O(n3 logn)。如果n
是数组的长度,m
是每个数组的长度[i]
,然后您将在每个n^2
迭代中执行O(m log m)
排序,因此总体上是O(n^2(m log m))
(或者O(n^3 log n)
如果n==m
[编辑:现在我想得更多了,您的猜测是正确的,这是错误的复杂性。但我下面说的仍然是正确的!]
不过,这并不是必须的。您可以创建数组的排序副本,并使用该副本执行嵌套for循环。看看a
为0时会发生什么:首先排序array[0]
,然后在内部for循环中通过array[n]
对array[1]
进行排序
然后当a
为1时,首先对array[1]
进行排序,然后在内部for循环array[2]
中通过array[n]
。但是您已经对所有这些进行了排序,并且在这段时间内不会发生变化。字符串有多长?这是数组中的n
。排序大O,它与数组大小中的n
不同。如果您有最大字符串长度,那么Arrays.sort位以一个常量为界。那么您的复杂度估计值不仅取决于n
,还取决于字符串大小。下面的答案很好。非常感谢@ChrisNash,我以前没有考虑过边界大小。关于下面的答案,我的困惑是是否忽略了初始排序。明白了,您看到的是外部排序O(m log m)
和内部排序O(m log m)
。但是它们是顺序操作,所以它们是加法而不是乘法(记住O(某物)+O(较小的东西)
仍然是O(某物)
)。重要的一点是有多少排序。在外循环中也有一个O(n log n)算法调用。我想你忽略了数组。排序(char[])
在外部循环中调用。但是,您所说的非常有意义。这是一种提高性能的方法。对数组进行一次排序。这就是O(n(m log m))
。比较数组就是一个嵌套循环,这就是O(n^2 m)
,由于是最坏的情况,您必须比较每个字符中的m
字符。这是一个可爱的问题,因为n
和m
的相对大小实际上会对答案产生影响。