【发布时间】:2023-03-14 02:48:01
【问题描述】:
为什么std::map 被实现为red-black tree?
那里有几个平衡的binary search trees (BST)。选择红黑树时的设计权衡是什么?
【问题讨论】:
-
虽然我见过的所有实现都使用 RB-tree,但请注意这仍然依赖于实现。
-
@Thomas。它是依赖于实现的,那么为什么所有的实现都使用 RB-trees?
-
我真的很想知道是否有任何 STL 实施者考虑过使用跳过列表。
-
C++的map和set其实是有序map和有序集。它们不是使用散列函数实现的。每个查询都将采用
O(logn)而不是O(1),但这些值将始终进行排序。从 C++11(我认为)开始,有unordered_map和unordered_set,它们是使用哈希函数实现的,虽然它们没有排序,但大多数查询和操作都可以在O(1)(平均)中实现 -
我很惊讶没有人谈论迭代器失效。 STL 的 API 保证,当您从
std::map插入或删除元素时,指向其他元素的迭代器不会失效。这使得为每个动态分配的节点存储多个元素,同时满足通常的时间复杂度保证,即使不是完全不可能,也非常困难。 (对std::map的查询和更新必须花费最坏的对数时间。)因此,在实践中,std::map实现必须是某种自平衡二叉树。
标签: c++ dictionary data-structures stl binary-search-tree