查找摊销时间复杂度
Finding amortized time complexity
所以我为一个向量类编写了一个函数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)
。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 查找数字是否为 2 的幂的时间复杂度
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 查找摊销时间复杂度
- 编写算法以查找数组中最常出现的元素.给出算法的时间复杂度
- 查找所有唯一二叉搜索树的算法的时间复杂度是多少?
- 此算法查找所有路径总和的时间复杂度是多少?