【问题标题】:complexity of set::insertset::insert 的复杂度
【发布时间】:2012-09-28 09:28:01
【问题描述】:

我已经阅读到集合中的插入操作只需要 log(n) 时间。这怎么可能?

要插入,首先我们要在排序后的数组中找到新元素必须位于的位置。使用二分查找需要 log(n)。然后要插入该位置,其后的所有元素都应向右移动一个位置。又需要n次。

我的怀疑是基于我的理解,即 set 是作为数组实现的,并且元素是按排序顺序存储的。如果我的理解有误,请纠正我。

【问题讨论】:

  • 您假设std::set 被实现为排序数组。为什么?
  • 取自 cppreference:集合通常实现为红黑树。
  • @KonradRudolph:现在只有我知道集合是使用红黑树实现的。谢谢克里斯
  • 嗯,任何关心数据结构的人都应该知道,集合通常使用 树或哈希实现,而不是使用数组,因为性能原因......哎呀,在Java,您实际上必须决定是否需要HashSetTreeSet(这是SortedSet),我怀疑是否有可用的ArraySet。 (请注意,不可修改的集合可以有效地实现为排序数组,使用 binarySearch - 所以实际上作为存储在数组中的排序树)
  • @Anony-Mousse:实际上,由于缓存局部性,平面集在许多情况下比基于树的集性能更高。

标签: c++ stl set time-complexity


【解决方案1】:

std::set 通常实现为红黑二叉搜索树。由于树保持平衡,因此在此数据结构上的插入具有 O(log(n)) 复杂度的最坏情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2012-04-02
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    相关资源
    最近更新 更多