如果有三元搜索,为什么要使用二进制搜索?

mou*_*sey 39 algorithm binary-tree data-structures ternary-tree

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

Bor*_*lid 42

实际上,人们确实使用k-ary树来获得任意k.

然而,这是一个权衡.

要在k-ary树中查找元素,需要围绕k*ln(N)/ ln(k)运算(记住基础变化公式).k越大,您需要的整体操作就越多.

你所说的逻辑扩展是"为什么人们不为N数据元素使用N-ary树?".当然,这将是一个阵列.

  • 顺便说一下`k/ln(k)`在'k = e`处是最小的(即`k = 2.71`),因此"最优"k-ary树是e-ary.二进制非常接近. (8认同)
  • B树是位于阵列和二叉树之间的k-ary树,并且是常用的; 对于大于3阶的k-ary树来说,肯定有一个目的. (4认同)

Aku*_*ete 26

三元搜索仍将为您提供相同的渐近复杂度O(log N)搜索时间,并增加了实现的复杂性.

可以说同样的论点,为什么你不想要四元搜索或任何其他更高的顺序.

  • @Nikita:Log2 N = Log3 N/Log3 2 =常数*Log3 N = O(Log N).任何两个复数对数阶之间只有一个恒定的因子差异. (10认同)

Mic*_*urr 25

搜索10亿(10亿 - 1,000,000,000)个分类项目与二元搜索相比平均约为15个,而三元搜索比较大约9个 - 这不是一个巨大的优势.请注意,每次'三元比较'可能涉及2次实际比较.

  • 直到现在我还不知道'十亿'有不同的含义.干杯. (8认同)
  • 事实上,'k-ary比较'实际上包含'k'关键比较可能是回答这个问题时最重要的因素.+1 (6认同)

Dea*_*n J 9

哇.我认为,最受欢迎的答案会错过这个问题.

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

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

然而,B树很常见.如果你假设树中的每个节点都将分别存储在磁盘上的某个地方,那么你将花费大部分时间从磁盘读取......并且CPU不会成为瓶颈,但磁盘将是.因此,您可以选择每个节点有100,000个子节点的B树,或者其他任何几乎不适合一个内存块的子树.具有这种分支因子的B树很少会超过三个节点,并且您只需要三个磁盘读取 - 三个停止瓶颈 - 来搜索庞大而庞大的数据集.

回顾:

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

  • 三元树有三个`jmp`操作(如果更少则离开`JB`,如果更多正确`JA`,如果相等则下降`JE`).二叉树有两个二进制操作(如果更少,则返回`JB`,如果更多则右转`JA`).处理器是否具有二进制或三元架构与其无关.在IA-32架构上只有指令`JA`,`JB`和`JE`. (4认同)

小智 8

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

平均比较次数:

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).
Run Code Online (Sandbox Code Playgroud)

最差的比较数:

in ternary search = 2 * ln(n)/ln(3) ~ 1.820*ln(n)
in binary search  = 1 * ln(n)/ln(2) ~ 1.443*ln(n).
Run Code Online (Sandbox Code Playgroud)

所以看起来三元搜索更糟糕.


sup*_*cat 8

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


Laz*_*zer 5

另外,请注意,如果我们继续下去,这个序列会推广到线性搜索

Binary search
Ternary search
...
...
n-ary search ? linear search
Run Code Online (Sandbox Code Playgroud)

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