我有两个问题:
public static void method1(int[] a, int[] b) {
int sum1 = 0, sum2 = 0;
for(int i = 0; i < a.length; i++) {
sum1 += a[i];
}
for(int i = 0; i < b.length; i++) {
sum2 += b[i];
}
}
问题1:这是否在O(n)中? method1
中有多少循环(不是嵌套循环)?
问题2:如果有
怎么办?Arrays.sort(a);
在method1
内,它的功能是什么?
答案 0 :(得分:7)
问题1:这是否在O(n)?
这是正确的(这里,n
表示两个数组中每一个的长度。)
在method1中有多少循环(不是嵌套循环)是否重要?
只要循环数固定,并且每个循环中的迭代次数在n
中是线性的,它就不会。更正式的是,如果C
是常量,C*n
是O(n)
。
问题2:如果有
怎么办?Arrays.sort(a);
排序通常为O(n logn)
,这就是Arrays.sort(int[])
平均 。对于最坏情况的表现,documentation含糊不清:
该算法在许多数据集上提供O(n log(n))性能,导致其他快速降序降级为二次性能,并且通常比传统(单枢轴)Quicksort实现更快。
这显然不足以保证最坏情况中的O(n logn)
。在行之间阅读表明它可能是O(n^2)
。
值得注意的是,在JDK7中,Arrays.sort(Object[])
使用的算法与Arrays.sort(int[])
使用的算法不同。前者是TimSort的改编版,因此应保证O(n logn)
最坏情况下的表现。不幸的是,文档再次没有拼写出来。
答案 1 :(得分:1)
一个。它是O(n),其中n =输入长度(总)
湾是的,它有多少循环:如果它是一个恒定数量的循环k那么它是O(k * n)通常被认为是O(n)但是如果k> = n它应该被考虑的东西< / p>
Arrays.sort(a);
是使用合并排序实现的,在平均和最差的情况下都在O(n log n)中运行(不像NPE所说的那样!)。
MrSmith42的更新:
来自http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html:
sort(Object [])使用的算法不一定是MergeSort,但它必须是稳定的。)
还有:
实施说明:排序算法是Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch的Dual-Pivot Quicksort。该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单轴)Quicksort实现更快。