这个例子是O(n)还是O(nlogn)?

时间:2018-10-21 01:49:06

标签: big-o

我只需要对大O的这一方面进行一些澄清-

如果我们有一个在进入O(n)函数之前具有O(logn)函数的方法,那么该方法的整体大O会是O(N)而不是O(nlogn)吗?例如,对一个数组排序(一个O(logN)函数),然后是一个遍历该数组的for循环。

1 个答案:

答案 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); 
        }
    }
}