Java 计算机在二进制搜索中必须进行多少计算?

Java 计算机在二进制搜索中必须进行多少计算?,java,Java,这里,我有一个数组: {1,3,5,6,7,8,9,11,13,14,15} 很简单。但是,我们将使用二进制搜索来搜索整数3所在的索引。计算机需要多少比较 看,我认为这是三个比较,但不知何故这是不正确的。有谁能解释一下计算机需要进行多少次比较,以及为什么?我对编程比较陌生,对这个概念掌握得不太好。在这个序列上的二进制搜索算法将按如下方式进行。因此,我们寻找 3 >代码>,我们将序列中间的元素与3。< /P>进行比较。 {1, 3, 5, 6, 7, 8, 9, 11, 13, 14, 15}

这里,我有一个数组:

{1,3,5,6,7,8,9,11,13,14,15}

很简单。但是,我们将使用二进制搜索来搜索整数3所在的索引。计算机需要多少比较


看,我认为这是三个比较,但不知何故这是不正确的。有谁能解释一下计算机需要进行多少次比较,以及为什么?我对编程比较陌生,对这个概念掌握得不太好。

在这个序列上的二进制搜索算法将按如下方式进行。因此,我们寻找<代码> 3 >代码>,我们将序列中间的元素与3。< /P>进行比较。
{1, 3, 5, 6, 7, 8, 9, 11, 13, 14, 15}
                =?
                3
它们不相等,所以取左边的子序列,我们比较3和中间的元素,也就是

{1, 3, 5, 6, 7}
       =?
       3
它们仍然不相等,然后我们转到左边的子序列,即

{1, 3}
我们将其与中间元素进行比较,但是我们有一个大小为2的列表!如果我们选择作为中间元素1,那么我们需要进行另一个比较,即我们需要在右边的子序列上递归,即
{3}
。在这种情况下,我们将有4个比较


但是,等等,还有另一个技巧,您还需要在每次迭代或递归调用时检查基本情况,并且这些说明了其他比较

二进制搜索依赖于这样一个事实,即数组已排序

你取中间的元素,你可以用<代码> MID=(左+右)/ 2 计算,并与你正在搜索的元素比较<代码>数组[MID] ,在这种情况下,3。p>

  • 如果
    数组[mid]
    大于3,则3必须位于左侧

  • 如果它较小,那么如果它包含在数组中,则3将位于右侧

这将产生一个新的更小的间隔,其大小为原来的一半

您可以将大小减半,直到达到大小为1的间隔。这些是
logn
步骤,
logn
是可以将
n
除以2直到达到1的次数


看一看,这解释了数学细节。需要注意的是,所使用的对数以2为底

由于需要检查当前节点,因此比较的数量要高于一系列数字的简单二进制细分

伪代码:

for node, 

    if x < node, search left
    else if x > node, search right
    else x == node (stop searching)
用于节点,
如果x<节点,则向左搜索
否则,如果x>节点,请向右搜索
else x==节点(停止搜索)
这取决于你的检查顺序。程序需要检查每个节点最多两个比较。因为只有一个节点的x==节点,所以将该节点作为默认条件(由于分支预测,您希望首先测试更可能的分支)最有意义

所以在第一个过程中,节点8,它会找到(x<8)true,移动到节点5,找到(x<5)true,然后向左移动

现在,左边的可以是1或3(因为它是一个未填充的子树,所以可以是1或3)。如果为1,则移动到节点1查找(x<1)false,然后查找(x>1)true,然后移动到节点3

在这个阶段,我们处于节点3。我们发现(x<3)为false,然后检查(x>3),也为false,从而推断出x==3。最短的可能路径是4次检查,但如果我们必须在节点1处停止(同样可能),那么这是6次检查

请注意,我故意将此设置为先检查(x
for node, 

    if x == node (stop searching)
    else if x < node, search left
    else x > node, search right
用于节点,
如果x==节点(停止搜索)
否则,如果x<节点,则向左搜索
else x>节点,右搜索
所以在第一个过程中,节点8,它会发现(x==8)false,然后发现(x<8)true,然后发现(x==5)false,然后发现(x<5)true,然后(50%的几率)转到节点1,发现(x==1)false,然后发现(x<1)false,然后发现(x==3)true。所以5个或7个这样检查。如果您首先搜索正确的分支,则会得到不同的度量