二进制搜索树优于C ++中的向量

时间:2015-12-16 07:09:15

标签: c++ vector binary-search-tree

数据结构有什么用途二叉搜索树,如果vector(按排序顺序)可以支持在log(n)时间插入,删除和搜索(使用二进制搜索)?

3 个答案:

答案 0 :(得分:6)

树的基本优点是向量中的插入和删除 O(log(n)) - 它们是O(n)。 (他们进行log(n)比较,但n移动。)

向量的优点是常量因子可能对它们有利(因为它们往往更加缓存友好,缓存未命中可能会使性能降低100倍)。

时排序的向量获胜
  • 主要是搜索。
  • 频繁更新,但容器中只有少数元素。
  • 对象具有高效的移动语义

时树木胜利
  • 容器中有许多元素的大量更新。
  • 对象移动很昂贵。

...并且不要忘记哈希容器,这些容器是O(1)搜索, un 有序向量+线性搜索(对于一切都是O(n),但如果小的话足够的实际上是最快的。)

答案 1 :(得分:2)

如果在一些初始插入/删除之后只有搜索操作,则排序向量和BST之间的性能差异不会很大。如 在向量上进行二进制搜索将花费您与在BST中搜索密钥相同的成本。事实上,在这种情况下我会选择有序矢量,因为它更适合缓存。

但是,如果在搜索过程中频繁插入/删除,则排序后的矢量将不是一个好选项,因为元素需要在每次插入和删除后来回移动以保持矢量排序。

答案 2 :(得分:0)

理论上,在O(log(n))中的排序向量中不可能插入或删除。但如果你真的想要在BST和矢量中搜索的优势,我可以考虑一下这些事情:

BST和其他树结构占用" node"的大量小内存分配,并且每个节点都是固定的小内存块。 vector使用一个大的连续内存块来保存所有项目,并在重新调整大小时将内存使用量增加一倍(甚至三倍)。因此,在内存非常有限的系统中,或者在频繁发生碎片的系统中,BST可能会成功为所有节点分配足够的内存块,而向量无法分配内存。

相关问题