- 普通的二分查找,利用中间数比较,将上界下标或者下界下标减1或者加1,针对查找某个数是否存在的情况,或者是某个有序数组单一存在的某个数:
private static int binary_search(int[] nums, int key) {
int low = 0, high = nums.length-1;
while(low<=high) {
int mid = low + ((high-low)>>1);
if (nums[mid] > key) high = mid-1;
else if (nums[mid] < key) low = mid + 1;
else return mid;
}
return -1;
}
- 查找下界,当有数组中存在多个重复的数据时,二分查找原型就不是那么好用了,这个时候就需要确定这个数对应的上界和下界。下界的求解过程就是我们在二分查找基础上改动,因为求解下界也就是左侧的下标,那么我们就是采用右侧往左压缩的过程,直到一个合适的索引为止,如下代码中所示。将等号取在第一个等式上,往左侧压缩:
private static int get_lower(int[] nums, int key) {
int low=0, high = nums.length-1;
System.out.println("test");
while(low<=high) {
int mid = low + (high-low)/2;
if (nums[mid] >= key) high = mid-1;
else low = mid+1;
}
if (low<nums.length && nums[low]== key) return low;
return -1;
}
- 查找上界,原理和下界相同,不过是往右侧压缩:
private static int get_upper(int[] nums, int key) {
int low = 0, high = nums.length-1;
while(low<=high) {
int mid = low + (high-low)/2;
if (nums[mid] <= key) low = mid+1;
else high = mid-1;
}
if(high>=0 && nums[high]==key) return high;
return -1;
}
部分参考链接
http://zhangxiaoya.github.io/2015/06/26/upper-bound-and-lower-bound-of-binary-search/
网友评论