二分查找(Binary Search)也叫折半查找,是一种常用的查找算法。它应用较广泛,通常用于查找有序列表中某个特定元素的位置。在计算机科学中,二分查找被认为是一种比顺序查找更高效率的算法,时间复杂度为O(logn)。下面从多个角度分析二分查找的实现方法。
1.基本思想
二分查找的基本思想是将查找的区间划分为两部分,每次将当前区间的中点与要查找的值进行比较,如果中点值等于要查找的值,直接返回中点的位置;如果中点值大于要查找的值,那么就在区间的左半部分继续查找;否则在区间的右半部分继续查找,如此不断缩小查找区间,直到找到所需元素或确定所需元素不存在。
2.具体实现
二分查找需要有序列表的支持,因此可以先将无序列表排序后再进行查找。具体实现可以采用递归或循环的方式,下面分别介绍。
(1)递归实现
递归实现要求将查找区间的下标传递给递归函数,如下所示:
```
int binary_search(vector
if (left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
return binary_search(nums, target, mid+1, right);
else
return binary_search(nums, target, left, mid-1);
}
return -1;
}
```
(2)循环实现
循环实现要求用while循环代替递归操作,如下所示:
```
int binary_search(vector
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
```
3.优化方案
虽然二分查找算法的时间复杂度为O(logn),但是仍然有优化的空间,下面分别介绍两种优化方案。
(1)插值查找
插值查找算法假设查找表中的数据元素是均匀分布的,根据插值公式可以快速定位到要查找的数据元素所在的位置,可以大大提高查找效率。插值公式如下:
```
int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
```
其中findVal表示要查找的值,arr表示要查找的有序列表,left和right表示查找区间的左右边界,mid表示中间位置。
(2)斐波那契查找
斐波那契查找是对二分查找的一种改进算法,其基本思路是将查找区间按照黄金分割点划分,可以大大提高查找效率。具体实现可参考下面的代码:
```
int fibonacci_search(int arr[], int findVal, int len)
{
int low = 0;
int high = len - 1;
int k = 0;
int M = 0;
int* F = initFibonacci();
while (len > F[k] - 1) {
k++;
}
for (int i = len; i < F[k]; i++) {
arr[i] = arr[high];
}
while (low <= high) {
M = low + F[k - 1] - 1;
if (findVal < arr[M]) {
high = M - 1;
k = k - 1;
}
else if (findVal > arr[M]) {
low = M + 1;
k = k - 2;
}
else {
if (M <= high) {
return M;
}
else {
return high;
}
}
}
return -1;
}
```
4.
扫码咨询 领取资料