我的代码以下列方式使用Arrays.sort(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++){
char[] letters2 = array[b].toCharArray();
Arrays.sort(letters2);
if(Arrays.equals(letters, letters2)
print("equal");
}
}
}
在这种情况下,n等于数组大小。由于嵌套的for循环,性能自动为O(n ^ 2)。但是,我认为Arrays.sort(带有O(nlog(n)))也会影响性能并使其比O(n ^ 2)更差。这种想法是否正确?
最终的表现是O(n * nlog(n)*(n * nlog(n))?还是我离开?
感谢。
编辑:我应该补充一点,当n与数组大小相关时,Arrays.sort正在使用数组元素中的字母数。如果将这个添加到性能分析中,这是我困惑的一部分。
编辑2:如果下选民留下评论为什么它被认为是一个糟糕的问题,那将是很酷的。
答案 0 :(得分:5)
如果n
是数组的长度,并且m
是每个array[i]
的长度,那么您将在每个n^2
次迭代中执行{ {1}}排序,总体来说是O(m log m)
(或O(n^2 (m log m))
如果O(n^3 log n)
。[编辑:现在我想更多关于这一点,你的猜测是正确的,这是错误的复杂性但我在下面说的仍然是正确的!]]
但这并不是必需的。您可以只生成数组的排序副本,然后使用该数组执行嵌套for循环。看看n == m
为0时会发生什么:首先排序a
,然后在内部for循环中排序array[0]
到array[1]
。
当array[n]
为1时,您首先排序a
,然后在内部for循环array[1]
到array[2]
。 但是你已经对所有进行了排序,并且它不会在过渡期间发生变化。
答案 1 :(得分:2)
运行 n 外部循环,每个循环都运行 n 内部循环,每个循环都调用一个O( n log n )算法,因此最终结果 - 没有级别之间的任何交互 - 是O( n 3 log n )。