javascript二分法實現查詢功能
阿新 • • 發佈:2021-01-18
技術標籤: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在陣列中的位置