在搜索的阵列使用二进制搜索元素需要,在最坏情况下日志2次 Ñ迭代因为,在每一个步骤中,我们修剪我们的搜索空间的一半。相反,如果我们使用“三元搜索”,则每次迭代都将减少三分之二的搜索空间,因此最坏的情况应该是log 3 N < log 2 N迭代...
似乎三元搜索更快,那么为什么要使用二元搜索呢?
在搜索的阵列使用二进制搜索元素需要,在最坏情况下日志2次 Ñ迭代因为,在每一个步骤中,我们修剪我们的搜索空间的一半。相反,如果我们使用“三元搜索”,则每次迭代都将减少三分之二的搜索空间,因此最坏的情况应该是log 3 N < log 2 N迭代...
似乎三元搜索更快,那么为什么要使用二元搜索呢?
Answers:
如果应用二进制搜索,您可以许多比较。如果应用三元搜索,你有2 ⋅ 日志3(ñ )+ Ö (1 )多比较,在每个步骤中,您需要执行2个比较削减搜索空间分为三个部分。现在,如果你做数学题,你可以观察到: 2 ⋅ 日志3(ñ )+ Ö (1 )= 2 ⋅ 日志(2
顺便说一句:如果比较比较昂贵并且可以并行化,那么搜索可能很有意义,因为这样可以应用并行计算机。
注意,可以很容易地将参数推广到搜索。你只需要表明函数˚F (ķ )= (ķ - 1 )⋅ 日志(2 )是严格的单调递增的k的整数值。
DCTLib是正确的,但请稍等一会。
按照您的逻辑,n -ary应该是最快的。但是,如果考虑一下,n -ary完全等于常规迭代搜索(只是对列表进行1到1迭代,但顺序相反)。首先,您选择列表中的最后一项(或最后一项),然后将该值与比较值进行比较。然后,从列表中删除该项目,然后选择新列表中的最后一个项目,它只是数组中倒数第二个值。每次,您一次只能消除1个值,直到找到您的值为止。
相反,您应该这样考虑-每次迭代如何从列表中消除最多的值?在二分查找中,您总是消除列表的一半。在三元搜索中,您有可能(实际上有33.33%的机会)消除列表的2/3,但有更大的机会(66.66%)则只会消除列表的1/3。为了计算O(n),您需要查看最坏的情况,即1/3,小于1/2。随着您越来越接近n,情况变得更糟。
二进制搜索不仅可以改善最坏的情况,而且平均时间也会得到改善。查看期望值(我们平均可以删除列表的哪一部分),我们使用以下公式:
(P_lower)x(如果较低的话可以去除的部分)+(P_higher)x(如果较高的话可以去除的部分)= E
对于二进制搜索,这是.5x.5 + .5x.5 = .5(我们总是删除列表的一半)。对于三元搜索,此值是.666x.333 + .333x.666 = 0.44,或者在每个步骤中,我们很可能只会删除列表的44%,因此平均而言,效率不如二元搜索。该值的峰值为1/2(列表的一半),并随着您接近n(反向迭代)和0(常规迭代)而减小。
好的,所以我撒谎了..涉及到一点数学,但我希望对您有所帮助!
请注意log(N)vs 2 log(N)比较参数是基于对算法的幼稚解释。如果我实际坐下来并用x86汇编语言编写,结果将是相反的。问题在于,对于测试用例使用整数,再加上不能删除冗余比较的不够智能的编译器。使用字符串和适当的字符串比较函数重试,并对其进行编码以在每个循环中调用一次比较函数,您会发现三元搜索再次变得更快。