为什么?:
一种常用的算法是二进制搜索。
如果您还不知道,请继续阅读。
非常有帮助。 节省大量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