首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据大O,一个清晰的函数is std::map的时间复杂度是多少?

根据大O,一个清晰的函数is std::map的时间复杂度是多少?
EN

Stack Overflow用户
提问于 2012-06-12 09:27:12
回答 4查看 3.6K关注 0票数 2

clear函数is std::map的时间复杂度是多少?

我说它是O(1)对吗?

EN

回答 4

Stack Overflow用户

发布于 2012-06-12 09:44:45

该标准在associative.reqmts/8表102中说

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

因此,它实际上被强制为O(N)。

编辑:总结了各种比特。

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

  1. 调用allocator destroy方法销毁元素
  2. 调用allocator deallocate方法释放节点

占用的内存

前者可以在代码中省略(检查is_trivially_destructible),实际上它通常是在vector中完成的。不幸的是,后者更棘手,而且不存在特征,所以我们必须依赖于优化器。

不幸的是,即使通过内联优化器可以完全删除destroydeallocate节点,我担心它也无法意识到树遍历现在是无用的,也无法对其进行优化。因此,您最终将在树的Θ(N)遍历中结束,并且在每一步都不执行任何操作...

票数 5
EN

Stack Overflow用户

发布于 2012-06-12 09:30:02

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

票数 2
EN

Stack Overflow用户

发布于 2012-06-12 09:38:12

因为它是一个模板,所以在编译时可能知道类型的无操作销毁(例如std::map<int>),所以销毁成员的需要并不是推断必要的最坏情况性能的良好基础。尽管如此,编译器必须访问二叉树的每个节点,释放堆内存,并且节点的数量与元素的数量成线性关系( erase()只会使指向被擦除元素的迭代器/引用/指针无效,insert()不会使任何其他元素无效等所有证据都是1:1关系的证据)。

因此,它是线性的,但因为即使不需要元素析构函数,也需要清理堆的使用。

(有趣的是,这意味着如果所有内存都是从一个专用内存池中分配的,那么对于带有简单的无操作析构函数的元素,可以将std::map<>-like关联容器--或者可能是使用智能的自定义分配器的std::map<>本身--设为O(1)。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10993830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文