我正在做各种C ++字典实现的报告(地图,字典,向量等)。
使用std :: map进行插入的结果表明性能为O(log n)。性能也有一致的高峰。我不是百分之百确定是什么造成了这种情况;我认为它们是由内存分配引起的,但我找不到任何文献/文档来证明这一点是不成功的。
任何人都可以清楚这件事或指出我正确的方向吗?
干杯。
答案 0 :(得分:4)
你是对的:它是O(log n)的复杂性。但这是由于地图的排序性质(通常是基于二叉树的)。
另见http://www.sgi.com/tech/stl/UniqueSortedAssociativeContainer.html插入注释。最糟糕的情况是O(log n)并且如果你可以暗示在哪里进行插入,则摊销O(1)。
地图通常基于二叉树,需要进行平衡以保持良好的性能。您观察到的负载峰值可能与此平衡过程相对应
答案 1 :(得分:2)
在STL方面,经验方法并不是绝对必要的。当标准清楚地规定诸如std :: map插入之类的操作的最小复杂性时,没有必要进行实验。
我建议您阅读标准,以便在继续实验之前了解最低复杂性保证。当然,在您正在测试的任何STL实现中可能存在错误;但是流行的STL是经过良好调试的生物并且使用非常广泛,所以我对此表示怀疑。
答案 2 :(得分:2)
如果我没记错的话,std :: map是一个平衡的红黑树。当std :: map确定底层树需要平衡时,可能会导致一些尖峰。此外,当分配新节点时,操作系统可能会在分配部分期间导致一些峰值。