【问题标题】:Container complexity容器复杂性
【发布时间】:2014-02-07 09:04:17
【问题描述】:

因此我有一个std::set<int>std::list<int>
我想对我的容器进行分类。
对于集合,对于 n 插入的元素,我将具有像 O(nlogn) 这样的复杂性。
对于列表,我将具有像 O(n) 这样的复杂性,用于插入 n 元素 + O(nlogn) 用于调用 list::sort
在这两种情况下,复杂度都是O(nlogn),但在std::list 的情况下还有额外的O(n) 操作。我有一些固定的时间用于set 重新平衡。

问题来了,哪个容器运行得更快?

【问题讨论】:

  • 无法判断,需要使用profiler。
  • 你是否只插入一次元素(然后只访问它们,因为你只对列表排序一次)?
  • 是的,一旦我插入它们,我就开始使用而无需任何额外的插入。
  • 所以你可以使用std::vector,它对缓存更友好。
  • bigocheatsheet.com给你一个想法

标签: c++ stl time-complexity array-algorithms


【解决方案1】:

由于您想要一个 'const' 排序容器,我建议 std::vector 缓存友好。

初始化期间:

  • push_back所有元素O(n)
  • std::sort 向量O(n log n)
  • std::unique 如果您想删除重复项(如 std::set 所做的那样)。 O(n)

所以初始化是O(n log n)

要检查元素是否存在,请使用std::binary_search 拥有O(log n) 而不是O(n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多