二分查找
原理
二分查找就是对一个已经排好序的线性表进行查找的算法,该算法要求查找的对象必须是已经排序的线性表并且其中不含有重复的元素。
本文默认为升序排列
查找过程:
选取左右两个范围leftp和rightp,分别对应着查找的左右边界;midp则是查找区间的中间。
int leftp = 0, rightp = nums.size() - 1;
//midp的计算,左边界leftp加上目标区间的长度(rightp - leftp)取半
//这里很容易出错
int midp = leftp + (rightp - leftp) / 2;
然后对目标数据target与midp位置的数据进行比较,如果target小于nums[midp],说明target在leftp和midp之间的位置;如果target大于nums[midp],说明target在midp和rightp之间的位置;如果相等则说明找到了目标数据的位置,直接返回即可。
对于上述逻辑可以理解的话,我们就可以取减半后的区间重复上述操作即可。重复直到找到目标数据或者目标数据不在该线性表中即可。
看到这里,相信大家可以尝试去力扣上自己实现一下了。
class Solution {
public:
int search(vector<int>& nums, int target) {
int leftp = 0, rightp = nums.size() - 1;
while(leftp <= rightp){
int midp = leftp + (rightp - leftp) / 2;
if(target < nums[midp]){
rightp = midp - 1;
}
else if(target > nums[midp]){
leftp = rightp + 1;
}
else if(target == nums[midp]){
return midp;
}
}
return -1;
}
};
在代码中我们可以看到,无论是leftp还是rightp都不是直接赋值midp。这是因为对于midp位置的数据我们已经知道不等于目标数据了,所以我们向左(向右)移动一位,提高查询效率。
结束的判定条件为:查询到目标数据或者左右的指针重叠时说明已经完成了二分查找的过程了。
算法总结
- 二分查找的时间复杂度为O(logn),空间复杂度为O(1),在查找算法中属于比较快的算法;
- 但是其弊端也是非常明显的,需要提前对于数据集进行排序,并且不能有重复的数据(查询数据只能查找到一个),所以该算法的使用具有一定的局限性。
5007



被折叠的 条评论
为什么被折叠?



