Algorithm 如果存在';什么是三元搜索?

Algorithm 如果存在';什么是三元搜索?,algorithm,data-structures,binary-tree,ternary-tree,Algorithm,Data Structures,Binary Tree,Ternary Tree,我最近听说了三元搜索,我们把一个数组分成3部分并进行比较。这里有两个比较,但它将数组减少到n/3。为什么人们不用这么多呢?三元搜索仍然会给您提供相同的渐近复杂性O(logn)搜索时间,并增加实现的复杂性 同样的理由也可以解释为什么不需要四元搜索或任何其他高阶搜索。这表明它比二元搜索慢。事实上,人们确实使用k元树来表示任意k 然而,这是一种权衡 要在k元树中查找元素,您需要大约k*ln(N)/ln(k)个操作(记住基公式的更改)。k越大,需要的总体操作就越多 您所说的逻辑扩展是“为什么人们不为N个

我最近听说了三元搜索,我们把一个数组分成3部分并进行比较。这里有两个比较,但它将数组减少到n/3。为什么人们不用这么多呢?

三元搜索仍然会给您提供相同的渐近复杂性O(logn)搜索时间,并增加实现的复杂性


同样的理由也可以解释为什么不需要四元搜索或任何其他高阶搜索。

这表明它比二元搜索慢。

事实上,人们确实使用k元树来表示任意k

然而,这是一种权衡

要在k元树中查找元素,您需要大约k*ln(N)/ln(k)个操作(记住基公式的更改)。k越大,需要的总体操作就越多

您所说的逻辑扩展是“为什么人们不为N个数据元素使用N元树?”。当然,这将是一个数组。

在最好的情况下,“三元”(Terinary?)搜索更有效,这将涉及搜索第一个元素(或者可能是最后一个,取决于您首先进行的比较)。对于距离您首先检查的末尾较远的元素,两次比较将使数组每次缩小2/3,而使用二进制搜索的相同两次比较将使搜索空间缩小3/4


此外,二进制搜索更简单。你只需比较并得到一半或另一半,而不是比较,如果少于前三分之一,则进行比较;如果少于第二个三分之一,则进行比较;如果少于第二个三分之一,则获得最后三分之一。

搜索10亿(十亿美元-100000000美元)与二进制搜索相比,排序项目平均需要15个,而与三元搜索相比,排序项目平均需要9个——这并不是一个巨大的优势。请注意,每个“三元比较”可能涉及两个实际比较。

是什么让您认为三元搜索应该更快

平均比较次数:

in ternary search = ((1/3)*1 + (2/3)*2) * ln(n)/ln(3) ~ 1.517*ln(n)
in binary search  =                   1 * ln(n)/ln(2) ~ 1.443*ln(n).
in ternary search = 2 * ln(n)/ln(3) ~ 1.820*ln(n)
in binary search  = 1 * ln(n)/ln(2) ~ 1.443*ln(n).
最差比较次数:

in ternary search = ((1/3)*1 + (2/3)*2) * ln(n)/ln(3) ~ 1.517*ln(n)
in binary search  =                   1 * ln(n)/ln(2) ~ 1.443*ln(n).
in ternary search = 2 * ln(n)/ln(3) ~ 1.820*ln(n)
in binary search  = 1 * ln(n)/ln(2) ~ 1.443*ln(n).

因此,三元搜索看起来更糟。

三元搜索比二元搜索更快的唯一方法是,如果三元划分确定的成本不到双向比较成本的1.55倍。如果项目存储在排序数组中,则三向确定的平均成本是双向确定的1.66倍。但是,如果信息存储在树中,则获取信息的成本相对于实际比较的成本较高,而缓存局部性意味着随机获取一对相关数据的成本并不比获取单个数据的成本低多少,三元树或n向树可以大大提高效率。

,注意,如果我们继续,这个序列推广到线性搜索

Binary search
Ternary search
...
...
n-ary search ≡ linear search

因此,在n元搜索中,我们将使用“一次比较”,这可能需要多达n次实际比较。

您可能听说过在涉及称重的谜语中使用三元搜索。这些天平可以返回3个答案:左边的更轻,两个都一样,或者左边的更重。所以在三元搜索中,只需要1次比较。 然而,计算机使用布尔逻辑,它只有两个答案。要进行三元搜索,实际上必须进行2次比较,而不是1次。
我想,在某些情况下,正如前面的海报所提到的那样,这种搜索速度更快,但你可以看到,三元搜索并不总是更好,而且在计算机上实现起来更容易混淆,也更不自然。

理论上,k/ln(k)的最小值是在e处实现的,因为3比2更接近e,所以需要更少的比较。您可以检查
3/ln(3)=2.73..
2/ln(2)=2.88..
二进制搜索之所以更快,是因为它的代码分支更少,在现代CPU上运行更快。

。我认为,在这一点上,排名靠前的答案是错的

您的CPU不支持三值逻辑作为单个操作;它将三元逻辑分解为二元逻辑的几个步骤。CPU的最佳代码是二进制逻辑。如果支持三值逻辑作为单一操作的芯片很常见,那么你是对的

B-树在每个节点上可以有多个分支;三阶B-树是三元逻辑。树下的每一步都将进行两次比较,而不是一次,这可能会导致CPU时间变慢

然而,B型树是相当普遍的。如果您假设树中的每个节点将分别存储在磁盘上的某个位置,那么您将花费大部分时间从磁盘读取。。。CPU不会成为瓶颈,但磁盘会成为瓶颈。因此,你需要一个B-树,每个节点有100000个子节点,或者其他任何一个节点都不能放入一个内存块中。具有这种分支因子的B-树很少会超过三个节点高,并且您只有三次磁盘读取-在瓶颈处三次停止-来搜索一个巨大的数据集

审查:

  • 三元树不受硬件支持,因此运行速度较慢
  • 对于大型数据集的磁盘优化,阶数远高于3的B-tress是常见的;一旦你超过了2,就超过3

三元搜索可以有效地用于并行架构—FPGA和ASIC。例如,如果搜索所需的内部FPGA内存少于FPGA资源的一半,则可以创建一个复制内存块。这将允许同时访问两个不同的内存地址,并在一个时钟周期内进行所有比较。这就是为什么100MHz FPGA有时可以超越4GHz CPU的原因之一:)

几乎所有关于二叉搜索树的教科书和网站都没有真正谈论二叉树!他们向你展示三元搜索树!真正的二叉树将数据存储在叶子中,而不是内部节点(导航键除外)。有些人称这些叶树,并区分教科书中所示的节点树:

尼维杰特,