二叉搜索树相对于 C++ 向量的优势
Advantage of Binary Search Tree over vector in C++
数据结构二叉搜索树有什么用,如果vector(按排序顺序)可以支持log(n)时间的插入,删除和搜索(使用二分搜索)??
如果仅在一些初始 insertions/deletions 之后进行搜索操作,则排序向量和 BST 之间的性能不会有太大差异。作为
对矢量进行二分搜索的成本与在 BST 中搜索密钥的成本相同。事实上,在这种情况下我会选择排序向量,因为它对缓存更友好。
但是,如果频繁 insertions/deletions 涉及搜索,那么排序向量将不是好的选择,因为元素需要在每次插入和删除后来回移动以保持向量排序。
树的基本优点是向量中的插入和删除是 而不是 O(log(n)) - 它们是 O(n)。 (他们进行 log(n) 次比较,但移动 n 次。)
向量的优势在于常数因子可能对它们非常有利(因为它们往往对缓存更友好,缓存未命中会使您的性能损失 100 倍)。
当
时排序向量获胜
- 主要是搜索。
- 经常更新,但容器中的元素很少。
- 对象具有高效的移动语义
当
时树木获胜
- 容器中包含许多元素的大量更新。
- 对象移动很昂贵。
...并且不要忘记 O(1) 搜索的散列容器,以及 un 有序向量+线性搜索(对于所有内容都是 O(n),但如果足够小实际上是最快的)。
理论上不可能在 O(log(n)) 的排序向量中插入或删除。但是如果你真的想要 BST 与矢量搜索的优势,我可以考虑以下几点:
BST等树形结构占用了"node"的大量小内存分配,每个节点都是一个固定的小内存块。而 vector 使用一个大的连续内存块来保存所有项目,并且在调整大小时它会使内存使用量增加一倍(甚至三倍)。所以在内存非常有限的系统中,或者在碎片频繁发生的系统中,有可能 BST 会成功地为所有节点分配足够的内存块,而 vector 分配内存失败。
数据结构二叉搜索树有什么用,如果vector(按排序顺序)可以支持log(n)时间的插入,删除和搜索(使用二分搜索)??
如果仅在一些初始 insertions/deletions 之后进行搜索操作,则排序向量和 BST 之间的性能不会有太大差异。作为 对矢量进行二分搜索的成本与在 BST 中搜索密钥的成本相同。事实上,在这种情况下我会选择排序向量,因为它对缓存更友好。
但是,如果频繁 insertions/deletions 涉及搜索,那么排序向量将不是好的选择,因为元素需要在每次插入和删除后来回移动以保持向量排序。
树的基本优点是向量中的插入和删除是 而不是 O(log(n)) - 它们是 O(n)。 (他们进行 log(n) 次比较,但移动 n 次。)
向量的优势在于常数因子可能对它们非常有利(因为它们往往对缓存更友好,缓存未命中会使您的性能损失 100 倍)。
当
时排序向量获胜- 主要是搜索。
- 经常更新,但容器中的元素很少。
- 对象具有高效的移动语义
当
时树木获胜- 容器中包含许多元素的大量更新。
- 对象移动很昂贵。
...并且不要忘记 O(1) 搜索的散列容器,以及 un 有序向量+线性搜索(对于所有内容都是 O(n),但如果足够小实际上是最快的)。
理论上不可能在 O(log(n)) 的排序向量中插入或删除。但是如果你真的想要 BST 与矢量搜索的优势,我可以考虑以下几点:
BST等树形结构占用了"node"的大量小内存分配,每个节点都是一个固定的小内存块。而 vector 使用一个大的连续内存块来保存所有项目,并且在调整大小时它会使内存使用量增加一倍(甚至三倍)。所以在内存非常有限的系统中,或者在碎片频繁发生的系统中,有可能 BST 会成功地为所有节点分配足够的内存块,而 vector 分配内存失败。