二分查找
最省内存的方式实现二分查找,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比,剪枝