二分法查找,也叫折半查找,是一种高效的查找方法。在计算机算法中被广泛应用于有序数列的查找,它的时间复杂度是 O(log n)。但是在具体应用过程中,我们需要关注的不仅仅是时间复杂度,还需要研究它的最多比较次数,从而更好地掌握算法的应用。
二分法查找原理
二分法查找基本原理很简单,它的思想是将有序数列分成左右两部分,取中间值与目标值做比较,如果中间值小于目标值,则在右半部分进行查找;反之,则在左半部分进行查找。
通过不断地将查找区间二分直到找到目标元素。这样每次查找前减半都可以将剩余待查找元素数量砍半,因此时间复杂度为 O(log n)。
二分法查找实现
C++实现:
int binary_search(int nums[], int target, int left, int right)
{
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
Java实现:
public static int binarySearch(int[] nums, int target, int left, int right) {
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
二分法查找的最多比较次数
那么二分法查找最多需要多少次比较呢?
在一步一步分析之前,我们先列出一个表格来帮助我们理解:
| 数据规模 | 最多比较次数 |
| ------------- |:---------------:|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
| 5 | 3 |
| 6 | 3 |
| 7 | 3 |
| 8 | 3 |
| 9 | 4 |
| 10 | 4 |
从上表可以看到,最多要比较几次取决于数据规模以及是否能够找到目标值。
具体地,对于有 n 个元素的有序数列,在最坏情况下,即目标元素在最后一位或不存在时,需要 log2(n+1) 次比较。
因为每次比较可以去掉一半的范围,假设一共需要进行 k 次比较,那么有:1* 2k = n+1,所以 k = log2(n+1)。
从这个公式中可以看出,当 n 值非常大时,log2(n+1) 增长缓慢,因此二分查找算法的时间复杂度为 O(log n)。
实际使用中,我们不会仅仅用到二分法查找一个元素,而是在大数据量中进行循环查找,因此了解二分法查找最多需要比较的次数可以帮助我们优化代码,从而使得程序更加高效。
二分法查找的优缺点
二分法查找作为种经典的查找算法,具备以下优缺点:
优点:
1. 数据量越大,二分法查找的优势越明显;
2. 算法思路简单,易于理解和实现;
3. 可以用于更灵活的情况,比如需要查找的数据存放于磁盘中;
缺点:
1. 二分法查找只能应用于有序的数据结构,因此需要先对数据进行排序,增加了前置操作成本;
2. 内存使用情况较大,需要开辟新的存储空间进行排列和查找;
3. 对于数据量较小、查找次数不多的情况下,二分法查找并不占优势。
微信扫一扫,领取最新备考资料