所以我为一个矢量类写了一个函数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;
}
答案 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;摊销不变的时间。