二分查找

最省内存的方式实现二分查找,1000万的数据如何快速判断某个数是否在这个数据集中。100M的内存限制。

用数组存储1000万个正数,大概需要80MB,但用散列表、二叉树这些数据结构所需空间会大于80M,不符合空间限制

如何快速定位IP对应的省份地址

IP地址转化为32位整型数,按照起始位置从小到大排序,查找最后一个小于等于目标值的元素,查看是否在这个区间中

 

二分查找应用场景的局限性:

依赖的是顺序表结构,即数组

针对的是有序数据

数据量太小不适合二分查找

数据量太大也不适合二分查找

 

 

有序数组中不存在重复元素的二分查找:

left + 1 < right    right = mid  left = mid  收尾条件

left <= right  left = mid + 1 right = mid - 1

 

变形一:

查找第一个值等于给定值的元素

left + 1 < right  right = mid  left = mid  等于的时候right=mid  收尾条件

left <=right  left=mid+1 right=mid-1  等于的时候判断,如果mid==0或者mid-1处的元素不等于目标值则返回,否则right=mid-1

变形二:

查找最后一个值等于给定值的元素

left + 1 < right  right = mid  left = mid  等于的时候left=mid  收尾条件

left <=right  left=mid+1 right=mid-1  等于的时候判断,如果mid==n-1或者mid+1处的元素不等于目标值则返回,否则left=mid+1

变形三:

查找第一个大于等于给定值的元素

left <=right  left=mid+1  大于等于的时候判断,如果mid==0或者mid-1处的元素小于目标值则返回,否则right=mid-1

变形四:

查找最后一个小于等于给定值的元素

left <=right  right=mid-1  小于等于的时候判断,如果mid==n-1或者mid+1处的元素大于目标值则返回,否则left=mid+1

变形五:

旋转有序数组中找最小值

一半有拐点一半有序 用left跟mid比较可以判断,最小值在有拐点的区间中

left + 1 < right    mid > =left:left = mid + 1  else:right=mid

变形六:

旋转数组中查找

在有序区间中找

变形七:

在有重复元素的旋转排序数组中查找

剪枝 当left的值等于mid的值的时候直接continue

变形八:

在有重复元素的旋转排序数组中查找最小值

在拐点区间中找,mid跟right比,剪枝

 

posted @ 2020-03-31 16:45  LinBupt  阅读(130)  评论(0编辑  收藏  举报