查找摊销时间复杂度

Finding amortized time complexity

本文关键字:时间复杂度 查找      更新时间:2023-10-16

所以我为一个向量类编写了一个函数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;
}

简短的回答是,随着存储越来越大,副本需要 4 倍的时间,但发生的频率只有 1/4。4 和 1/4取消,因此您最终得到(摊销)恒定时间。

忽略您选择的精确因子,从长远来看,您会得到 O(N * 1/N) = O(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)