1. 程式人生 > 其它 >javascript二分法實現查詢功能

javascript二分法實現查詢功能

技術標籤:javascript

二分法非JavaScript所獨有,任何語言皆可實現,一路通百路通。

二分法

定義:二分法(Bisection method) 即一分為二的方法. 設[a,b]為R的閉區間. 逐次二分法就是造出如下的區間序列([an,bn]):a0=a,b0=b,且對任一自然數n,[an+1,bn+1]或者等於[an,cn],或者等於[cn,bn],其中cn表示[an,bn]的中點。

通俗的說就是:將一段排好序的陣列一分為二,將目標數與兩個區間的最大值和最小值相比較,在某個區間的話再將該區間一分為二,繼續與區間最大值最小值相比較,再繼續一分為二…直到找到目標數在該陣列中的位置。

典型演算法

演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。
基本思想:假設資料是按升序排序的,對於給定值key,從序列的中間位置k開始比較,
如果當前位置arr[k]值等於key,則查詢成功;
若key小於當前位置值arr[k],則在數列的前半段中查詢,arr[low,mid-1];
若key大於當前位置值arr[k],則在數列的後半段中繼續查詢arr[mid+1,high],
直到找到為止,時間複雜度:O(log(n))

☆如下案例是查詢某個數在陣列arr中的位置,使用二分法的同時使用了遞迴執行。
查不到會顯示“無值”或“超出範圍”。

該案例中無使用js自帶api查詢方法,也不使用for迴圈遍歷。

let arr = [1,2,3,4,5,6,7,8,9,10];
let temp=10;
function searchIndex(param,targetNum,index,callback,callbackError) {
  console.log(param,index);
  let startItem = param[0];
  let endItem = param[param.length-1];
  let centerIndex = Math.ceil((param.length-1)/2);
  let centerItem = param[centerIndex];
  if
(param.length>=3){ if(targetNum === startItem){ callback(index); }else if(targetNum === centerItem){ index+=centerIndex; callback(index); }else if(targetNum === endItem){ index+=param.length-1; callback(index); }else{ if(targetNum>startItem && targetNum<endItem){ if(targetNum>startItem && targetNum<centerItem){ param.splice(centerIndex+1); }else if(targetNum>centerItem && targetNum<endItem){ param.splice(0,centerIndex); index+=centerIndex; }else{ callbackError('--異常--'); } searchIndex(param,targetNum,index,callback,callbackError); }else{ callbackError('--超出範圍--'); } } }else{ callbackError('--無值--'); } } searchIndex(arr,temp,0,(targetIndex)=>{ console.log('--finish--',targetIndex); },(error)=>{ console.log(error); });

查詢10在陣列中的位置
在這裡插入圖片描述

查詢5在陣列中的位置
在這裡插入圖片描述