为什么人们通常会进行二分搜索而不是三重搜索(除以 每次分成三个部分)或每次甚至分为十个部分?
答案 0 :(得分:18)
因为二进制搜索导致最少量的比较和查找。对于一个简单的直觉,考虑每次分成4个部分。
[ | | . | ]
v1 v2 v3
您现在已完成3次查找,并且必须将您要搜索的值与所有三个值进行比较。将其与二次搜索的两次迭代进行比较:
[ | . ]
v1
[ | . | ]
v1 v2
您现在已经缩小了相同数量的搜索范围,但只进行了2次查找和2次比较。
答案 1 :(得分:5)
因为每个级别的1个比较(如在二分搜索中)在任何n元搜索的最坏情况下具有最少的比较次数。这是因为每个级别的比较次数线性增加,其中树的深度以对数方式减小。对于n-nary搜索,最坏情况下的比较数是((n-1)/ log(n))* log(m)其中m是树中项目的数量,在n = 2时最小化。
答案 2 :(得分:2)
答案 3 :(得分:1)
Binary允许轻松比较< =或> =或<或者> (不记得通常使用的是什么)。它干净地划分了集合,很容易产生分裂。对于任意数据集,您将如何划分为不同的部分?您如何决定将哪些部分放入?二进制搜索需要进行O(log n)查找。添加更多组件会将其更改为更接近O(m * log n)的值,其中m是您要分割的部件数。
雅各
答案 4 :(得分:1)
它大大简化了逻辑:
if(cond)
Go Left
else
Go Right
与开关声明对比。
答案 5 :(得分:1)
因为二元搜索是基于拆分一个简单的操作,除了总是给出一个答案,这意味着一个切割点,所以如果你能提出一个有两个答案的问题,你可以有两个切点,依此类推< / p>
答案 6 :(得分:1)
主要是因为很难决定如何缩小范围 - 如何插值。比较函数给出了一个三向答案 - 小于,等于,大于。但通常情况下,这种比较并没有给出“大于”或“比”小得多的答案。实际上,比较器必须考虑三个值 - 当前测试点,搜索值,以及“范围的高端”或“范围的低端”来估算比例距离。
因此,二进制搜索更简单,因为它对比较的要求更少。
答案 7 :(得分:1)
没有人真正提到在所有计算机中实现的比较运算符一次只比较两件事 - 如果计算机可以同时比较三个对象,这肯定是有道理的。
按照目前的情况,比较三个值需要(至少)两个操作。
答案 8 :(得分:1)
实际上,N路搜索树而不是二叉树通常用于数据库系统。虽然比较的数量可能大于O(log2n),但是读取操作的数量实际上更少。查看B树及其变体。
答案 9 :(得分:0)
理由是因为你实际上并没有从中获得任何东西:搜索仍然是O(log n)
,只是有不同的基础。
答案 10 :(得分:-1)
二进制搜索使用1比较将n切割为n / 2。三元搜索使用2次比较将n切割为n / 3。
前者的复杂性为1. log2 n,后者为2. log3 n或log3 n ^ 2
log2 n始终优于log3 n ^ 2.
要看到这个,
提升到3的力量, 3 ^ log2 n vs n ^ 2=&GT; 3 ^(log2 3.log3 n)vs n ^ 2
=&GT; n ^(log2 3)vs n ^ 2
所以二进制搜索比任何m-ary搜索更快。你正在比较log2 m vs(m-1)。
顺便说一下,插值搜索比使用loglogN的二进制搜索渐近快。但除非您的数据很大,否则不值得去解决问题。 [所以上面关于最佳搜索的评论在理论上是错误的!]