我只需要对大O的这一方面进行一些澄清-
如果我们有一个在进入O(n)函数之前具有O(logn)函数的方法,那么该方法的整体大O会是O(N)而不是O(nlogn)吗?例如,对一个数组排序(一个O(logN)函数),然后是一个遍历该数组的for循环。
答案 0 :(得分:0)
这取决于方法的调用方式。
请参见以下示例:
// O(n)
void iterate(int[] array) {
for(int i = 0; i < array.length; i ++) {
// ...
}
}
// O(n^2)
void doubleIterate(int[] array) {
for(int i = 0 ; i < array.length ; i ++){
for(int j = 0 ; j < array.length ; j ++) {
// ...
}
}
}
如果您从iterate
的for循环之外调用doubleIterate
,则整个方法的复杂度为O(n^2)
。
// O(n^2) + O(n) = O(n^2 + n) = O(n^2)
void doubleIterate(int[] array) {
for(int i = 0 ; i < array.length ; i ++){
for(int j = 0 ; j < array.length ; j ++) {
// ...
}
}
iterate(array);
}
如果您在iterate
的第一个循环中调用doubleIterate
,则复杂度仍为O(n^2)
。
// O(n*(n+n)) = O(2*n^2) = O(n^2)
void doubleIterate(int[] array) {
for(int i = 0 ; i < array.length ; i ++){
for(int j = 0 ; j < array.length ; j ++) {
// ...
}
iterate(array);
}
}
如果从iterate
的内部循环调用doubleIterate
,则整个方法的复杂度为O(n^3)
。
// O(n^2*n) = O(n^3)
void doubleIterate(int[] array) {
for(int i = 0 ; i < array.length ; i ++){
for(int j = 0 ; j < array.length ; j ++) {
// ...
iterate(array);
}
}
}