set :: insert的复杂性

时间:2012-10-08 06:37:05

标签: c++ stl set time-complexity

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

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

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

2 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:0)

HashSet,LinkedHashSet和EnumSet的add(),remove()和contains()操作的开销为常量O(1),这是由于内部HashMap实现所致。

对于树形结构TreeMap和ConcurrentSkipListMap,put(),get(),remove(),containsKey()操作时间为O(log(n))。

因此TreeSet具有O(log(n))时间复杂度。