c - 向数组末尾插入 n 个元素的时间复杂度是多少?
问题描述
我知道向数组中插入一个元素需要一个恒定的时间让我们说 c。
我试过的:
用于插入 n 个元素
time=c+c+c+.......n times =nc
我想问一下,它会是 n 的大 O 还是 o(1)。
解决方案
是的,添加n
元素需要 O(n) 时间,但添加单个项目不是 O(1)。它的摊销O(1)。
任何给定的添加都可能需要 O(n) 时间,因为当前数组的空间已被填满,因此必须将其复制到另一个更大的空间。
但是,如果新的空间分配是一个大于原始空间之一的常数因子(经常使用 2),那么复制成本会摊销,以便每次添加的平均时间如您所说是恒定的,并且n
添加是 O(n)。
为了更清楚地说明这一点,请考虑因子为 2 且初始数组大小为 1 的情况。然后考虑复制成本以将数组从大小 1 增长到足以容纳任何 k>= 的 2^k+1 个元素0。这个大小是 2^(k+1)。总复制成本将包括所有复制到 2 倍大的步骤:
1 + 2 + 4 + ... + 2^k = 2^(k+1) - 1 = 2n - 1
等式是由于基本代数。结果是 O(n)。但是,最后一个副本本身有 n = 2^k 个元素,这也是 O(n)。
推荐阅读
- css - 悬停时从外部源更改 svg 的颜色
- visual-c++ - Windows X64 位系统上的 VC++ X64 位应用程序不会连续调用键盘挂钩回调过程
- ios - 如何使用 swift 4 在 pubnub 中显示在线离线用户状态?
- python - 如何通过 python 多处理填充数组?
- c++ - 如何在不添加/删除 mem 函数的“const”的情况下重载 getter 函数?
- ios - iOS pushViewController 没有导航到 Swift5 中的控制器
- php - 如何迭代 Mail::send Laravel 函数的消息?
- r - 按行使用日期:从数据框中获取日期行(“POSIXct”)而不丢失类
- angular - 角度从列表中删除一列
- amazon-web-services - 如何列出具有 tag1 的实例:
和标签2: 和标签3: