清楚函数的时间复杂度是什么std :: map根据大O?

时间:2012-06-12 09:27:12

标签: c++ map time-complexity

clear函数的时间复杂度是std :: map?
我是否正确地说它是O(1)?

4 个答案:

答案 0 :(得分:3)

标准说明在 [associative.reqmts] / 8 表102

  

a.clear()< => a.erase(a.begin(), a.end())

中的a.size()线性

所以实际上它被命令为O(N)。


编辑:总结各个位。

要删除节点,map执行两项操作:

  1. 调用分配器destroy方法来销毁元素
  2. 调用分配器deallocate方法以释放节点占用的内存
  3. 前者可以在代码中省略(检查is_trivially_destructible),实际上它通常在vector中完成。不幸的是,后者更加棘手,并且不存在特征,因此我们必须依赖优化器。

    不幸的是,即使通过内联优化器可以完全删除destroydeallocate节点,我担心它无法实现树遍历现在无用并优化 也离开了。因此,您最终会在树的Θ(N)遍历中结束,并且在每一步都没有完成......

答案 1 :(得分:2)

cplusplus reference site声称它在容器的大小上具有线性复杂性,因为必须调用每个元素的析构函数。

答案 2 :(得分:2)

因为它是一个模板,所以在编译时可能会知道类型的无操作中的销毁(例如std::map<int>),因此销毁成员的需要不是推断必要性的良好基础最糟糕的表现。仍然,编译器必须访问二叉树的每个节点,释放堆内存,并且节点的数量线性地与元素的数量相关(erase()仅使迭代器/引用/指向已擦除元素的指针无效,{ {1}}不会使所有证据与1:1关系无效。

所以,它是线性的,但是由于需要清理堆使用,即使不需要元素析构函数......

(有趣的是,这意味着一个insert() - 类似的关联容器 - 或者可能是std::map<>本身带有一个聪明的自定义分配器 - 可以为具有普通无操作析构函数的元素设置O(1)所有内存都是从专用内存池中分配的,可以在O(1)中“丢弃”。)

答案 3 :(得分:0)

据我所知,所有清理操作的复杂性都是O(n),因为你需要逐个去除这些对象。