开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
简言
二分查找算法,也叫做折半查找法。其基本思想很简单就是对一个有序的数据集合对半查找,每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一般,指导找到所要查找的元素或者直到没有区间为止。
题目1: 有序数组中查找目标值
ary = [1, 3, 4, 9, 11, 15, 19, 20,25],target = 8 使用二分查找的方式判断是否是否存在目标数值。
解题思路:
二分查找,将有序数据集进行对半分割,并检查每个分区的中间元素,不断循环直到没有区间范围。这个区间范围通过left和right 2个变量来控制。
- 首先,定义一个区间[left, right] (left :首部位置,right:尾部位置) 开闭原则,我们需要定位的数据是在该区间范围内
- 第一轮:1, 3, 4, 9, 11, 15, 19, 20,25 left=0 ,right=8,mid=4
ary[mid] > target ,那么 right = mid-1=3
- 第二轮:1, 3, 4, 9, 11, 15, 19, 20,25 left =0 right = 3,mid= 1
ary[mid] <target,那么 left = mid+1 = 2
- 第三轮:1, 3, 4, 9, 11, 15, 19, 20,25 left = 2 right = 3 mid=2
left从左向右移,right从右向左移。一旦在middle处找到目标,查找将停止;如果没有找到目标,left和right将重合。
function erfenSearch(ary, target) {
if (ary.length ==0) return false;
let left = 0, right = ary.length;
while (left < right) {
let mid = Math.floor((left + right) / 2);
if(ary[mid] == target){
return true;
} else if (ary[mid] > target) {
right = mid - 1;
} else if (ary[mid] < target) {
left = mid + 1;
}
}
return false;
}
总结
二分查找在很多场景里会是使用毕竟其效率是很高的的,比如在操作系统、MYSQL、Hadoop 等。但是使用二分查找的算法必须是满足一定的条件的,比如在有序的数组A中找到给定的数据。操作的数据集必须是有序的。二分查找能应用于任何类型的数据,搜索的集合是相对静态的数据集