首先,二分查找的使用对象是有序数据集合。如果是无序的数据,则不能使用二分查找。二分查找的时间复杂度为O(logn),插入和删除操作少,但是查找频繁时,可以考虑将数据设计成有数数组数据,用二分查找进行查找。当插入和删除频繁时,如果设计成有序数组数据,则需要频繁的修改数组数据,此时不宜用二分查找。
二分查找可以理解为生活中的折半查找,每次都取中间值,直至找到指定值或者最后查找区间长度为1。二分查找依赖的是数组,因为数组可以直接访问指定下标的数据,当然,也可以选用链表等数据结构,但是时间复杂度会增加。虽然二分查找很省内存,但是当数据量太大时,也不推荐用二分查找,因为二分查找依赖的数组数据结构在内存中要求连续的内存空间,数据量越大,占用的连续的内存空间越大,如果内存中没有足够大的连续的内存空间,而只有零散的内存空间,则由于数组内存空间的要求,无法用二分查找。
二分查找的拓展
用二分查找找出最先出现的某个指定值
private var arr:Array = [1,2,3,3,4,4,4,4,5,5,6,6,6,6,6,6,6,6,7,7,8,9,9,10,11];
private function binarySearch(num:int):void{
var index:int = -1;
var low:int = 0 ;
var high:int = arr.length - 1;
var mid:int;
var searchNum:int = 0;
console.log("数组长度为"+arr.length);
while(low<=high){
console.log("要查的值为"+num);
mid = Math.floor((high+low)/2);
if(arr[mid]==num){
searchNum++;
index = mid;
console.log("第"+searchNum+"次查找");
console.log("查找到的值为"+arr[mid]);
console.log("查找索引为"+mid);
searchNum++;
forSearch(low,high,num);
break;
}else if(arr[mid]>num){
searchNum++;
high = mid-1;
console.log("high");
console.log("第"+searchNum+"次查找");
console.log("查找到的值为"+arr[mid]);
console.log("查找索引为"+mid);
}else {
//arr[mid]<num
searchNum++;
low = mid + 1;
console.log("low");
console.log("第"+searchNum+"次查找");
console.log("查找到的值为"+arr[mid]);
console.log("查找索引为"+mid);
}
}
console.log("------");
console.log("index="+index);
var str:String = index>=0?arr[index]:"undefined";
console.log(str);
}
//二分查找拓展,用二分查找查找第一个值等于给定元素的索引
private function forSearch(begin:int,end:int,num:int):void{
for(var i:int = begin;i<=end;i++){
if(arr[i] == num){
console.log("第一个值等于给定元素的索引为"+i);
break;
}
}
}}
}
binarySearch(4);