在二进制搜索中,我们将数组分成2,然后,我们通过递归使用二进制搜索再次搜索单个数组。
现在,如果我使用三元搜索,而不是二进制搜索,搜索会将数组划分为3.我的问题是:
答案 0 :(得分:1)
从Wiki's开始,三元搜索树是三元树,其中节点相对于搜索键是有序的。如果搜索键是字符串,则每个节点存储一个字符,搜索字符串由一系列二进制搜索组成,每个字符串对应一个字符串:
在二元搜索中,您只需比较并获得一半或另一半 但是,在比较的三元搜索中,如果小于,则得到第1个1/3,否则再次比较,如果小于,则得到第二个1/3,否则得到最后1/3。
在这里阅读更多内容:
答案 1 :(得分:1)
嗯,这完全取决于你所说的“更快”。渐近地说,它们都在O(log n)时间内运行(技术上,二进制搜索在O(log_2(n))中运行,而三元搜索在O(log_3(n))中运行,其中log_k表示“log base k”;但是,这些仅因常数因子而不同,因此它们都等于O(log n))。因此,从算法的角度来看,这两个函数总体上在相同的时间内运行(即,它们具有相同的时间复杂度)。
尽管如此,肯定会有一个特殊情况,即计算量会比另一个少。例如,如果目标值恰好位于数组的中间,则二进制搜索将在第一次迭代时返回值,而不是递归,而三元必须递归才能找到该值。同样,如果目标值恰好是通过数组的三分之一,那么三元搜索会立即找到它,而二进制搜索必须递归。
答案 2 :(得分:0)
如果您正在谈论单处理器系统,那么就没有渐近的差异,并且三元搜索会产生更多的开销。在多处理器/多核系统上,它将(最多一点)加速搜索以将其划分为独立搜索(假设执行环境/语言允许这样的划分)。但这通常最好只在顶层进行一次。
答案 3 :(得分:0)
我在确定“三元搜索”的含义时遇到了一些麻烦。二进制搜索将数组分成两半的原因是,您进行的每个比较都将数组划分为两个区域,元素小于所考虑的元素,元素大于所考虑的元素。我没有看到一种简单的方法来概括这一点,以便通过一次比较将数组拆分为三个部分。
但是,如果你没有将数组分成相等的一半而是将其分解为 1 / 3 / 2 / 3 在每次迭代时拆分,然后你仍然会得到O(lg n)性能,尽管常数项会更高。事实上,对于任何将数组拆分为大小ε/ 1-ε个分数的常数ε,您将获得O(lg n)行为。
如果执行比较时将数组拆分为两个大小εn和(1-ε)n,仅在数组大小小于1时终止,则算法将在k步后终止,其中k为最小整数,其中ε k n < 1和(1-ε) k n&lt; 1&gt; 1.重新安排,我们得到
ε k n&lt; 1
ε k &lt; 1 / N
k&gt; log ε 1 / n
k&gt; - log ε n
k&gt; - lg n /lgε
k&gt; lg n / lg 1 / ε
使用类似的逻辑,但使用1 - ε,我们得到
k&gt; lg n / lg 1 / (1 - ε)
请注意,由于lg 1 / ε和lg 1 / (1 - ε)是常数,满足这些性质的最小k是O(lg n)。