二分查找是在有序集合中快速寻找某个元素的算法, 它的时间复杂度为O(logn)是一种非常高效的查找算法。二分查找每次都通过和区间的中间元素作对比,来将查找区间缩小为之前的一半,直到找到元素或区间缩小为一.
二分适合的场景:
- 二分查找依赖于数组结构的随机访问能力,对于其他数据结构无法适用。
- 数组里面的元素必须是有序的,即如果我们是一次排序N次二分查找,那么可以平摊掉排序的时间,如果数据集合是频繁插入,删除,那么每次二分之前就需要先排序,在查找了,二分就不适合了.
- 数据量太小不适合用二分查找,比如10次以内的循环,其实直接顺序遍历时间也差不多。但是如果涉及到元素比较比较耗时(比如长字符串直接的比较),那么比较次数越少越好
- 数据量太大也不适用于二分查找。因为二分需要依靠数组,而数组是无法存储大数据的。
二分查找变形问题
在排序数组中寻找一个指定的数,我们既可以使用二分,也可以使用二叉树,散列表等数据结构。虽然后者会使用更多内存,但是当内存不是如此紧缺的情况下,使用后者也能做到。那么二分的优势何在呢?
二分法更适合用于“近似查找”问题,比如刚刚的几个变种问题,如果使用散列表等结构就做不到了。
题号 | 题目链接 | 答案链接 | 难度 | 完成度 |
---|---|---|---|---|
33 | 搜索旋转排序数组 | searchInRotatedSortedArray | ✨✨ | ✅ |
50 | Pow(x, n) | powx | medium | ✅ |
69 | x 的平方根 | mySqrt | ✨ | ✅ |
74 | 搜索二维矩阵 | search_a_2d_matrix | medium | ✅ |
81 | 搜索旋转排序数组II | searchInRotatedSortedArrayII | medium | ✅ |
153 | 寻找旋转排序数组中的最小值 | find_minimum_in_rotated_sorted_array | medium | ✅ |
367 | 有效的完全平方数 | isPerfectSquare | ✨ | ✅ |