动态数组的时间复杂度和增长策略

时间:2013-11-23 03:28:31

标签: c++ data-structures time-complexity

我正在阅读Herb Sutter的更多例外C ++,了解在实现字符串时要选择的增长策略。他列出了以下内容:

1)确切的增长。在此策略中,新缓冲区的大小与当前操作所需的一样大

优势:没有浪费的空间。

缺点:表现不佳。这种策略需要O(N)分配和每个字符的平均O(N)复制操作,但在最坏的情况下具有高常数因子...

2)固定增量增长。新缓冲区应该是一个大于当前缓冲区的固定数量

优点:浪费空间少。缓冲区中未使用的空间量由增量大小限制,并且不随字符串的长度而变化。

缺点:性能适中。该策略需要O(N)分配和每个字符的平均O(N)复制操作。也就是说,分配的数量和复制给定char的平均次数都随着字符串的长度线性变化。 但是,常量因子的控制权在String实现者手中。

注意:字符1到1

添加到字符串中

问题1 :两者中的常数因素如何控制?我不明白Herb的观点

问题2 :固定增量将如何为O(N),不取决于使用的固定大小,如果说是100个字符,则在第一次调整大小后,下一个99插入将是O(1),那么为什么考虑O(N)?

1 个答案:

答案 0 :(得分:2)

  1. 字符串实现者可以选择固定大小增量 f 的大小。所以他控制了2)中的常数因子,但不是1)。请注意,1)中没有声称可以控制常数因子。

  2. 每个字符的费用为O(N / f )。我相信Herb意味着 f 是由实现修复的,因此它实质上是一个大符号的常数因素(即它被删除)。但是, f 越大,大哦常数因子越小,因此性能越好(以浪费更多的空间为代价)。因此,在选择 f 时,实施者必须权衡这两个因素。