我搜索了很长一段时间才找到一个比较,显示插入/推送擦除/弹出等所有STL-Containers的复杂性差异。我没有找到任何。我的所有STL书籍也没有。任何提示?
我当然知道一些经验法则。但是定义在哪里?
答案 0 :(得分:2)
尝试
http://www.sgi.com/tech/stl/complexity.html
http://www.sgi.com/tech/stl/table_of_contents.html
来自complexity.html:
从根本上说,很难 定义渐近的概念 算法复杂度正是为了 真正的计算机硬件而不是 抽象机器模型。因此我们解决了 遵循以下准则:
- 对于具有运行时间O(f(n))的算法A,必须有一个 相应的算法A'即 在任意机器上纠正 long指针和size_t类型等 A和A'基本上执行 相同的操作顺序 实际的硬件。 (在简单的情况下A. 和A'将是一样的。其他 案例A可能已经简化了 地址的知识是 有限的。输入 大号n,A'最多必须占用 时间Cf(n),其中C是常数, 独立于n和地址 尺寸。 (指针,size_t和ptrdiff_t 假定操作采取 恒定的时间独立于他们的 大小。)
- 所有容器或迭代器复杂性规范参考 摊销的复杂性。个人 操作可能需要更长时间 指定。但任何足够长的 相同的操作顺序 容器或迭代器将采取 最多只要相应的总和 指定的运营成本。
- 算法指定最坏情况或平均情况 表现,并确定哪些。 除非另有说明,否则平均值 假设容器元素是 从有限类型中选择更多 可能的值大于 容器和容器元素 是独立的 分布。
- 操作f的复杂性规范假定操作 由f调用最多需要 指定的运行时但算法 如果通常保持适当 调用的操作不过是一个 对数因子慢于 在预期的情况下指定。
- 醇>
如果操作比假定的功能F更昂贵 当前的STL,然后F将减速到 大多数与增加的成本成比例。 未来的任何操作都会失败 满足这个属性将成为 明确的。
为了使其精确,假设F指定使用时间f(m) 输入大小m。 F使用操作Gk, 指定的运行时间gk(n)on 输入大小如果在a中使用F. 每个Gk较慢的上下文 超过预期的最多因素 h(n),然后F最多减速a 系数h(m)。这是因为没有 目前的算法适用 操作Gk到输入 显着大于m。
答案 1 :(得分:1)
ISO C ++标准定义了算法和容器访问方法的复杂性(如果需要)。所有其他地方(如果没有明确说明)所有投注都是关闭的,图书馆实施者可以自由地进行实施。
例如,您可以假设使用红黑树实现了地图和集合,但没有要求这样做。许多算法都过载或专用于特定的迭代器类别(如随机访问迭代器),有时可能甚至优化以从特殊硬件(如XMM寄存器和并行执行某些操作)执行。
有时你真的必须逻辑地假设操作可能花费多少,由于其他要求,例如std :: list中的splice必须具有O(1)复杂度=>长度为O(n)。
我收到了N. Josuttis的书 C++ Standard Library - Tutorial And Reference 所有这些方面都很好地涵盖在那里。
最诚挚的问候,
Ovanes
答案 2 :(得分:1)
看一下有关STL,Boost和数组容器性能的报告