【发布时间】:2012-09-28 09:28:01
【问题描述】:
我已经阅读到集合中的插入操作只需要 log(n) 时间。这怎么可能?
要插入,首先我们要在排序后的数组中找到新元素必须位于的位置。使用二分查找需要 log(n)。然后要插入该位置,其后的所有元素都应向右移动一个位置。又需要n次。
我的怀疑是基于我的理解,即 set 是作为数组实现的,并且元素是按排序顺序存储的。如果我的理解有误,请纠正我。
【问题讨论】:
-
您假设
std::set被实现为排序数组。为什么? -
取自 cppreference:集合通常实现为红黑树。
-
@KonradRudolph:现在只有我知道集合是使用红黑树实现的。谢谢克里斯
-
嗯,任何关心数据结构的人都应该知道,集合通常使用 树或哈希实现,而不是使用数组,因为性能原因......哎呀,在Java,您实际上必须决定是否需要
HashSet或TreeSet(这是SortedSet),我怀疑是否有可用的ArraySet。 (请注意,不可修改的集合可以有效地实现为排序数组,使用 binarySearch - 所以实际上作为存储在数组中的排序树) -
@Anony-Mousse:实际上,由于缓存局部性,平面集在许多情况下比基于树的集性能更高。
标签: c++ stl set time-complexity