这段代码片段的时间复杂度是多少?

时间:2015-02-01 06:38:56

标签: algorithm time big-o complexity-theory analysis

void push(const Type& e){
        if (size() == CAP) {
            CAP = CAP + 100;
            Type * Snew = new Type[CAP];
            for (int i = 0; i < CAP - 100; i++){
                Snew[i] = S[i];
            }
            delete[] S;
            S = Snew;
        }
        TOP++;
        S[TOP] = e;
    }

此算法的时间复杂度是什么?为什么?我正在看它,希望我没错,但我认为由于存在单个for循环,它具有线性时间(O(n))复杂度,并且我认为循环外的所有其他操作都是恒定时间操作。

2 个答案:

答案 0 :(得分:0)

它的O(n),好吧。取决于new的实现,也可能是O(n)而不是常量(如果它正在清除mem或其他东西),但仍然使整个事物O(n)。

答案 1 :(得分:0)

复杂性为O(n)。但是,请注意,大多数堆栈实现都会使数组的大小加倍,而不是将其增加一个固定的数量,以实现分摊的常量时间。有关讨论,请参阅Constant Amortized Time