我想知道为什么在BST中搜索比二进制搜索算法更快。
我所说的树在子树中(几乎)总是具有相同数量的向量(均衡)。
我测试了它们,在BST中搜索总是更快。为什么呢?
答案 0 :(得分:2)
如果不看实施,就不可能知道。在他们的核心,他们是一回事。
BST需要跟随指针遍历到右半部分,而数组上的二进制搜索则算术运算(例如加法和除法/移位)。通常,对数组进行二进制搜索的速度要快一些,因为它总体上遍历较少的内存(不需要存储指针),并且在算法的最后阶段它具有更高的缓存一致性。
如果数组变量对你来说总是比较慢,那么实现中可能存在一个小故障或(但这不太可能!!)算法比所有内存开销慢得多。
答案 1 :(得分:0)
两者在速度方面应该大致相同。两者都是O(log n)。二进制搜索访问内存位置并在每次迭代时进行比较。 BST遵循指针(也是内存访问)并进行比较。其大O复杂度中常数的差异应该可以忽略不计。
一个可能的原因可能是您需要在二进制搜索的每次迭代期间执行额外的计算。大多数实现都有如下行:
mid=(high+low)/2;
与整数加法和比较运算相比,除法运算成本高。这可能会导致额外的性能开销。减少影响的一种方法是使用:
mid=(high+low)>>1;
但我认为大多数编译器无论如何都会为你优化。
BST变体不需要计算任何东西,它只是比较并遵循适当的指针。
也可能是你正在递归地进行二进制搜索而且你的BST查询非递归地使BST更快。但是如果没有查看你的代码,很难提出任何具体的原因。