二进制搜索算法

为什么?:

一种常用的算法是二进制搜索。

如果您还不知道,请继续阅读。

非常有帮助。 节省大量CPU。 以指数方式减少计算。

当搜索大量信息以查找匹配项时,想到的第一个想法是线性搜索。 遍历所有值以查找匹配项。 如果找到它,请返回位置或值,然后结束搜索。

然而,当要搜索的值变得非常大时,这变得非常低效。 这是O(N)算法。 在更坏的情况下,您可能必须搜索所有值以找到匹配项,甚至更糟的是找到不存在的匹配项!

怎么样?:

项目列表是否可以数字或ASCII排序。 使用二进制搜索!

首先,对列表进行排序,然后将最中间的值(如果列表元素不均匀,则向上或向下)与搜索词进行比较。 如果它是“少于”您的用语,则说明它一定是

低于那个点。 这样就可以消除上限。 如果该术语的值大于中心点的值,请消除该较低的范围。

因此将要搜索的项目数量减少了一半。

将此技术连续应用于其余项目,并将每次迭代的搜索量减少一半。

因此以更快的O(log N)算法运行。

示例: 警告 :使用“递归”,切记要考虑CPU上的函数调用负载。 在某些语言中,这实际上可能比线性慢。 请参阅下面的非递归。

(摘自

维基百科

BinarySearch(A[0..N-1], value, low, high) {
       if (high < low)
           return -1 // not found
       mid = low + ((high - low) / 2)  // Note: not (low + high) / 2 !!
       if (A[mid] > value)
           return BinarySearch(A, value, low, mid-1)
       else if (A[mid] < value)
           return BinarySearch(A, value, mid+1, high)
       else
           return mid // found
   } 
这里有一个优化。

有时在处理大量数字或浮点数时精度很高。

中=(低+高)/ 2

可能会溢出并占用内存,从而导致结果不可靠。

中=低+((高-低)/ 2)

解决它。 :)

看到这里... 非递归:

low = 0
       high = N
       while (low < high) {
           mid = low + ((high - low) / 2)  // Note: not (low + high) / 2 !!
           if (A[mid] < value)
               low = mid + 1; 
           else
                //can't be high = mid-1: here A[mid] >= value,
                //so high can't be < mid if A[mid] == value
                high = mid; 
       }
       // high == low, using high or low depends on taste 
       if ((low < N) && (A[low] == value))
           return low // found
       else
           return -1 // not found       

这个最基本的算法有很多资源。 只需在Google中输入“二进制搜索”即可。

祝您编程愉快。

From: https://bytes.com/topic/algorithms/insights/867454-binary-search-algorithm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值