c++ - 查找摊销时间复杂度

标签 c++ time amortized-analysis

<分区>

所以我为 vector 类编写了一个函数 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/4th。第 4 和 1/4th 取消,因此您最终得到(摊销的)常数时间。

忽略您选择的精确因子,从长远来看,您将得到 O(N * 1/N) = O(1) -> 摊销常数时间。

关于c++ - 查找摊销时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19105465/

相关文章:

haskell - 如何确保 Data.Vector 的分摊 O(n) 级联?

c++ - 具有依赖类型的简单 CRTP 案例的编译错误

c++ - 大数据库操作出错

python:打印带有时区信息的时间和日期

sql-server-2008 - T-SQL计算平均时间

algorithm - 什么是算法的摊销分析?

algorithm - n 个操作序列的聚合分析

c++ - 使用OpenGL均匀分布虚线?

c++ - 删除 constexpr 会更改 gcc 上数组的值

php - 如何在 PHP 中以毫秒为单位获取当前时间?