二分查找法的原理:
让最大数与最小数的中间数不断与目标数字比较,然后不断缩小最大值和最小值的范围,直到范围缩小到1个数字为止。
代码:
// 输入一个数组,和一个目标查找数字,返回目标数字在这个数组中的位置
function binarySearch(arr, target){
let low = 0;
let high = arr.length - 1
if (arr[low] > target || arr[high] < target){
return - 1
}
while(low <= high) {
let middle = parseInt(low + high) / 2
if(arr[middle] === target) {
return middle
} else if (arr[middle] > target) {
high = middle - 1
} else if (arr[middle] < target) {
low = middle + 1
}
}
}
var arr = [1,2,3,4,5,6]
var target = 2
binarySearch(arr, target) // 返回1
var arr = [1,2,3,4,5,6]
var target = 20
binarySearch(arr, target) // 返回-1
var arr = [1,2,3,4,5,6]
var target = 0
binarySearch(arr, target) // 返回-1
写代码验证一下:
image.png
用法:
在小数组里面看不出来效果,如果在一个大数组中,这种方法的效率查找是很快的。普通循环的时间复杂度是O(n),而二分查找法的时间复杂度:
比如:总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
由于n/2^k取整后>=1,即令n/2^k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)
该算法可以直接用在生产环境中。
网友评论