二分查找-最省内存的快速查找实现方式

首先,二分查找的使用对象是有序数据集合。如果是无序的数据,则不能使用二分查找。二分查找的时间复杂度为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);
发布了61 篇原创文章 · 获赞 2 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_22794043/article/details/89930196