找到摊销的时间复杂度

时间:2013-09-30 23:17:51

标签: c++ time amortized-analysis

所以我为一个矢量类写了一个函数push_back,我现在试图找出摊销的时间复杂度。我对编程的理论方面很陌生,所以如果有人能指导我,那就太棒了。

这是我的功能:

void Vector<T>::push_back(const T &e) {
    if(vsize + 1 > capacity)
        allocate_new();
    array[vsize] = e;
    vsize++;
}

这是我的allocate_new函数:

void Vector<T>::allocate_new() {
    capacity = vsize * 4;
    T* tmp = new T[capacity];

    for(int i = 0; i < vsize; i++)
        tmp[i] = array[i];

    delete[] array;
    array = tmp;
}

2 个答案:

答案 0 :(得分:1)

当您将N元素插入数组时,数组必须在每次4的幂处调整大小。调整大小4^i时所需的时间为O(4^i)。同样,最大调整大小以N大小完成。因此,总金额为:

T = 1 + 4 + 16 + ... + 4^x

其中4^x <= N。因此T=O(4^x)=O(N)。因此,每个插入操作的平均时间为O(1)

答案 1 :(得分:1)

简短的回答是,随着存储空间变大,副本需要4倍的时间,但只会经常发生1/4 th 。 4和1/4 th 取消,所以你最终得到(摊销)恒定时间。

忽略您选择的精确因素,从长远来看,您得到O(N * 1 / N)= O(1) - &gt;摊销不变的时间。