有没有人看到过STL的实现,其中stl::set不是以红黑树实现的?
我之所以问这个问题,是因为在我的实验中,B树表现优于std::set
(以及其他红黑树实现),具体取决于B值大小,速度提高了2到4倍。我很好奇是否有强制使用红黑树的充分理由,当似乎有更快的数据结构可用。
有没有人看到过STL的实现,其中stl::set不是以红黑树实现的?
我之所以问这个问题,是因为在我的实验中,B树表现优于std::set
(以及其他红黑树实现),具体取决于B值大小,速度提高了2到4倍。我很好奇是否有强制使用红黑树的充分理由,当似乎有更快的数据结构可用。
谷歌的一些人实际上构建了一个基于B树的C ++标准库容器实现。它们似乎比标准二叉树实现具有更好的性能。
然而,有一个问题。C ++标准保证从地图或集合中删除元素仅会使指向地图或集合中相同元素的其他迭代器无效。由于节点拆分和合并,这些新结构的删除成员函数可能会使树中其他元素的迭代器无效。因此,这些实现并不是标准实现的完美替代品,不能用于符合规范的实现。
希望这有所帮助!
至少有一个实现是基于AVL树而不是红黑树的。
我没有尝试验证这个实现的符合性,但至少(与基于B树的实现不同),它至少可以被编写成完全符合标准要求。
insert
和 erase
需要平摊常数修改时间,而 AVL 树无法提供此功能。 - jbapple
std::set
和相关的容器都有着由标准规定的严格的最大复杂度(“大O”)要求。一个替代实现是否能够满足所有这些要求? - Tristan Brindle