动态阵列的时间复杂性和增长策略
Time complexity and growth strategy of dynamic arrays
我在Herb Sutter的《更卓越的C++》中读到了关于在实现字符串时要选择的增长策略。他列出了以下内容:
1) 精确增长。在这种策略中,新的缓冲区与当前操作所需的大小完全相同
优点:不浪费空间。
缺点:性能差。该策略需要O(N)个分配和每个字符的平均O(N)个复制操作,但在最坏的情况下需要高常数因子。。。
2) 固定增量增长。新的缓冲区应该是比当前缓冲区大的固定数量
优点:几乎没有浪费空间。缓冲区中未使用的空间量受增量大小的限制,并且不随字符串的长度而变化。
缺点:性能适中。此策略需要O(N)个分配,并且每个字符平均需要O(N)个复制操作。也就是说,分配数量和复制给定字符的平均次数都随字符串长度线性变化。然而,常量因子的控制权掌握在String实现者手中。
注意:字符由1添加到字符串1
问题1:常数因子如何在两者中控制?我不明白Herb的意思
问题2:固定增量将如何为O(N),而不取决于所使用的固定大小是多少,如果说它的100个字符,那么在第一次调整大小后,接下来的99个插入将为O(1),那么为什么要考虑O(N)呢?
-
字符串实现者可以选择f的固定大小增量有多大。因此,他可以控制2)中的常量因子,但不能控制1)中的常数因子。请注意,在1)中没有对常数因子的控制权。
-
每个字符的成本为O(N/f)。我相信Herb的意思是f是由实现固定的,因此本质上是大oh符号中的一个常数(即它被丢弃)。然而,f越大,大oh常数因子就越小,因此性能越好(以浪费更多空间为代价)。因此,实现者在选择f时必须权衡这两个因素。
相关文章:
- 具有未知值时的时间复杂性
- 使用堆查找第K个最大元素的时间复杂性
- 解决这个问题的时间复杂性是多少
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 对于像C++这样的现实世界语言,时间复杂性有什么一致的定义吗
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 是平衡二进制树上预购和DFS的时间复杂性
- 带有多个内部回路的循环的时间复杂性
- 列表STL的时间复杂性在一段时间内进行排序
- O(2M N)和O(kN)的时间复杂性
- 映射向量的时间复杂性是多少
- 时间复杂性差异以及如何
- 递归最糟糕的情况时间复杂性
- 可传递值影响递归算法的渐近时间复杂性
- 程序的时间复杂性确定两个字符串是否彼此排列
- 为什么此代码O(n)的时间复杂性
- next_perMuart的时间复杂性在大o符号中
- C 中使用了哪种类型的堆以及STD :: Pirstity_queue的时间复杂性
- 带有两个递归调用的递归算法的时间复杂性
- 动态阵列的时间复杂性和增长策略