王争数据结构笔记(15)
1、二分查找也称为折半查找算法,是一种非常简单易懂的快速查找算法。二分查找的时间复杂度为O(logn)。对数时间复杂度是一种极其高效的时间复杂度,比时间复杂度为O(1)的算法还要高效。
2、二分查找的非递归实现。
public int bsearch(int[] a,int n,int value){
int low=0;
int high=n-1;
while (low<=high){
int mid=(low+high)/2;
if (a[mid]==value){
return mid;
}
else if (a[mid]<value){
low=mid+1;
}
else{
high=mid-1;
}
}
return -1;
}
low,high,mid 为数组下标,low,high表示区间范围,mid表示中间位置
3、二分查找的递归实现。
public int bsearch(int[] a,int n,int val){
return bsearchInternally(a,0,n-1,val);
}
private int bsearchInternally(int[] a, int low,int high,int value){
if(low>high) return -1;
int mid=low+((high-low)>>1);
if(a[mid]==value){
return mid;
}
else if (a[mid]<value){
return bsearchInternally(a,mid+1,high,value);
}
else{
return bsearchInternally(a,low,mid-1,value);
}
}
4、二分查找的局限性:
1)、二分查找依赖数组。这是因为数组按下标随机访问数据的时间复杂度是O(1),而链表随机访问的时间复杂度为O(n).
2)、二分查找针对有序数据。适用于插入、删除操作不频繁,一次排序多次查找的场景。针对动态变化的数据集合,二分查找不再适用。
3)、数据量较小的情形不适宜二分查找,这是因为顺序遍历也不错。数据量较大的情形不适宜二分查找,这是因为存储数据的空间必须是连续的。