数据结构:
红黑树是一种 BST,知道是BST就挺好懂了,肯定是有序的,而且是链式结构,空间没有问题;红黑树 RBT有他特别的把节点标色的方法,所以最坏情况是O(logn);
文章里说,哈希表如果理解成数组: key=下标;value=元素值,所以他的查找是O(1)的,没错吧,但也具有了数组的问题:提前分配够空间大小,其次也是无序的;
unordered_set/unordered_map 的底层实现肯定是哈希表没错了,因为unordered代表的就是无序,其他有序的底层实现就是红黑树了;
注意一个点,vector是不能哈希的,因此,底层哈希表的无序表是不能以vector为键值的;
但是红黑树的有序表就可以;
Map
map是用来存key-value的,是可以用来存一些可能会重复的东西(比如节点)我们还可以用key获取他,也可以用来计次;
Set
set则是用来去重的,或者说保证唯一的;
无序容器
在无序的情况下,
在 C++ 中,std::unordered_set
的 erase
操作的平均时间复杂度是 O(1)。这是因为 std::unordered_set
是通过哈希表实现的,其中元素的存储和访问是基于哈希值进行的,而不是基于元素的位置。因此,对于 std::unordered_set
,在平均情况下,插入、查找和删除操作的时间复杂度都是 O(1)。
在 C++ 中,std::vector
的 erase
操作的时间复杂度是 O(n),其中 n 是 std::vector
中的元素数量。这是因为 std::vector
是基于数组实现的,当你删除一个元素时,它会触发一系列的元素移动操作,以保持元素的连续存储。具体来说,erase
操作会将被删除元素后面的所有元素向前移动,填补被删除元素的位置。
如果你删除的是尾部元素(即最后一个元素),则 erase
操作的时间复杂度是常数时间 O(1)。这是因为删除尾部元素时,不需要进行元素的移动操作,只需要更新 std::vector
的大小。
所以vec的是O(n),而set却是O(1);
有序容器
由于有序容器是用红黑树实现的,时间复杂度和空间复杂度为O(logn),但如果数量级很小,其实什么复杂度都可以认为是常熟级的;