选择红黑树作为set的底层数据结构,是因为它提供了一种折中的平衡方案。它既不追求完美的平衡,如AVL树那样,也避免了极端不平衡的情况。这种折中的策略,使得红黑树在大多数情况下都能提供良好的性能,特别是在频繁的插入和删除操作中。 哲学家亚里士多德曾经说过:“美德总是位于两个极端之间的中间状态。”红黑树正是采...
选择红黑树作为set的底层数据结构,是因为它提供了一种折中的平衡方案。它既不追求完美的平衡,如AVL树那样,也避免了极端不平衡的情况。这种折中的策略,使得红黑树在大多数情况下都能提供良好的性能,特别是在频繁的插入和删除操作中。 哲学家亚里士多德曾经说过:“美德总是位于两个极端之间的中间状态。”红黑树正是采...
底层数据结构不同: std::set使用红黑树实现,元素按照大小顺序存储。 std::unordered_set使用哈希表实现,元素按照哈希值存储。 元素查找方式不同: std::set中的元素是有序的,查找一个元素的时间复杂度为O(log n)。 std::unordered_set中的元素是无序的,查找一个元素的时间复杂度为O(1)。 内存占用不同: ...
尽管C++ 标准没有强求 std::map 底层的数据结构,但是根据其规定的时间复杂度,现在所有的 STL 实现都采用平衡二叉树来实现 std::map,而且用的都是红黑树。《算法导论(第 2 版)》第 12、13 章介绍了二叉搜索树和红黑树的原理、性质、伪代码,侯捷先生的《STL 源码剖析》第 5 章详细剖析了 SGI STL 的对应实现。
概念:std::set 是一个关联容器,它使用红黑树作为底层数据结构来存储元素。它的特点是元素的值是唯一的,并且在插入时会自动按照指定的比较器进行排序。 分类:std::set 属于 C++ 标准库中的关联容器,与之类似的还有 std::map、std::multiset 和 std::multimap。 优势: 唯一性:std::set 中的元素值是唯一的,...
尽管C++ 标准没有强求 std::map 底层的数据结构,但是根据其规定的时间复杂度,现在所有的 STL 实现都采用平衡二叉树来实现 std::map,而且用的都是红黑树。本文对 STL 中红黑树(rb_tree)的实现问了几个稍微深入一点的问题,并给出了我的理解。
二师兄:两者都是使用红黑树作为底层的数据结构。红黑树是一种自动平衡的二叉树,它确保插入、删除和查找操作的时间复杂度都是O(log n)。 面试官:set/map对于key的类型有什么要求吗? 二师兄:因为set/map被称为有序容器,所以对插入进去的key有排序的要求。一般需要为类型实现<比较方法,以下代码无法通过编译: ...
面试官:用过std::set/std::map吗? 二师兄:用过。 面试官:能介绍一下二者吗? 二师兄:std::set是一个有序集合,元素不重复,一般用于去重和排序。std::map是有序组合,包含键值对,键唯一,值可重复。面试官:知道底层数据结构吗? 二师兄:std::set/map底层使用红黑树存储,确保插入、删除...
尽管C++ 标准没有强求 std::map 底层的数据结构,但是根据其规定的时间复杂度,现在所有的 STL 实现都采用平衡二叉树来实现 std::map,而且用的都是红黑树。《算法导论(第 2 版)》第 12、13 章介绍了二叉搜索树和红黑树的原理、性质、伪代码,侯捷先生的《STL 源码剖析》第 5 章详细剖析了 SGI STL 的对应实...
尽管std::unordered_set在平均情况下具有更快的操作速度,但在实际应用中,我们需要根据数据的特点和算法的需求来选择合适的数据结构。如果数据分布均匀且不需要保持有序性,std::unordered_set通常是更好的选择。然而,在哈希冲突严重或需要频繁访问有序元素的情况下,std::set可能会表现出更好的性能。 为了更直观地...