js二分查找及性能測試

js二分查找及性能測試

一 、定義

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。

二、算法思想
①搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;
②如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。
③如果在某一步驟數組爲空,則代表找不到。
這種查找算法的優勢是每一次查找都使搜索範圍縮小一半。
三、代碼實現
二分查找的實現有兩種方式

1.循環遍歷的方式

function binarySearch(arr,target){
		//選取查找區間
  		var low = 0;
  		var high = arr.length - 1; //索引從0開始,所以-1
  		while(low <= high){
  			//取中位數
  			var mid = Math.floor((low+high)/2);
  			var midItem = arr[mid];
  			//如果中位數是要查找的元素,則返回索引
  			if(midItem == target){
  				return mid;
  			}else if(midItem > target){  //如果中位數大於目標元素,說明目標元素在中位數的左側
  				high = mid - 1;
  			}else if(midItem < target){  //如果中位數小於目標元素,說明目標元素在中位數的右側
  				low = mid + 1;
  			}
  		}
  		return -1;
  	}
  	//測試
  	var arr=[1,2,3,4,5,6,7,8,9,10]
  	console.log(binarySearch(arr,9))   //9

注意:代碼中的判斷條件必須是while (left <= right),否則的話判斷條件不完整,比如:array[3] = {1, 3, 5};待查找的鍵爲5,此時在(low < high)條件下就會找不到,因爲low和high相等時,指向元素5,但是此時條件不成立,沒有進入while()中。

2.遞歸方式

function binarySearch(arr,low,high,target){
  		if(low <= high){
  			var mid = Math.floor((low+high)/2);
	  		var midItem = arr[mid];
	  		if(midItem == target){
	  			return mid;
	  		}else if(midItem < target){
	  			return binarySearch(arr,mid + 1,high,target)
	  		}else if(midItem > target){
	  			return binarySearch(arr,low,mid - 1,target)
	  		}
  		}
  		return -1;
  	}

四、性能測試
瞭解二分查找,二分查找真的比順序遍歷查找快嗎? 爲此,我做了如下測試

//爲了模仿大數據量,創建數組
	var arr = [];
 	for(var i=0;i<99999999;i++){
 		arr.push(i);
 	}

再寫一個普通的遍歷查找

function each(arr,target){
  		for(var i=0 ;i<arr.length;i++){
  			if(arr[i] == target){
  				return i;
  			}
  		}
  		return -1;
  	}

測試算法耗時

	var startTime = new Date().getTime();
  	console.log(each(arr,95471525))
  	var endTime = new Date().getTime();
  	console.log(endTime - startTime + 'ms') 

多次測試運行結果爲:
在這裏插入圖片描述
可見,順序查找目標元素越靠後,耗時越多。
接下來測試二分查找,不論目標元素在靠近頭部還是尾部,多次測試結果爲1ms 到 2ms 之間 :
在這裏插入圖片描述
二分查找的效率還是很高的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章