我已经读过一个集合中的插入操作只需要log(n)时间。怎么可能?
要插入,首先我们在排序数组中找到新元素必须位于的位置。使用二进制搜索需要log(n)。然后要插入该位置,其后面的所有元素都应该向右移动一个位置。这需要另外n次。
我怀疑是基于我的理解,set是作为数组实现的,元素按排序顺序存储。如果我的理解是错误的,请纠正我。
答案 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))时间复杂度。