动态阵列的时间复杂性和增长策略

Time complexity and growth strategy of dynamic arrays

本文关键字:策略 时间复杂性 阵列 动态      更新时间:2023-10-16

我在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)呢?

  1. 字符串实现者可以选择f的固定大小增量有多大。因此,他可以控制2)中的常量因子,但不能控制1)中的常数因子。请注意,在1)中没有对常数因子的控制权。

  2. 每个字符的成本为O(N/f)。我相信Herb的意思是f是由实现固定的,因此本质上是大oh符号中的一个常数(即它被丢弃)。然而,f越大,大oh常数因子就越小,因此性能越好(以浪费更多空间为代价)。因此,实现者在选择f时必须权衡这两个因素。