檢索演算法之二分查詢

2021-09-07 04:47:58 字數 1905 閱讀 1838

二分查詢演算法類似我們日常生活中常見的猜數字的遊戲。假設給定從1-100這個排好序的陣列,而猜數字的人只知道這個範圍,你拿著一塊寫有數字的題板背對著他,讓他猜你手裡拿的的數字。

估計有經驗的人會先猜50,然後你說偏大了,偏小了,還是相等。如果偏大了或者是偏小了,他會用同樣的方式在偏大或者偏小的陣列中從新指定乙個中間值來猜。。就這樣不斷重複如下去。。直到找到要猜的數字為止。

類似圖如下:

演算法分析如下:

(1) 

將陣列的第乙個位置設定為下邊界(0)。

(2) 

將陣列最後乙個元素所在的位置設定為上邊界(陣列的長度減1)。

(3) 

若下邊界等於或小於上邊界,則做如下操作。

a. 將中點設定為(上邊界加上下邊界)除以2。

b. 如果中點的元素小於查詢的值,則將下邊界設定為中點元素所在下標加1。

c. 如果中點的元素大於查詢的值,則將上邊界設定為中點元素所在下標減1。

d. 如果沒有找到,重複執行a,b,c.直到找到為止。

否則中點元素即為要查詢的資料,可以進行返回。

演算法**如下:

//

插入排序演算法

var insertionsort = function

(arr)

arr[inner] =temp;}};

//二分查詢演算法

var binsearch = function

(arr, data)

else

if (arr[mid] >data)

else

}return -1;

};

var nums = [5,1,7,4,2,10,9,3,6,8];

console.log(nums.tostring());

insertionsort(nums);

console.log(nums.tostring());

console.log(nums[binsearch(nums, 6)]);

結果如下:

有一種情況我們似乎沒有考慮到,那就是當陣列中出現多個重複資料的情況下,怎麼來確定我們想要查詢的資料的出現次數。

通過分析我們知道要查詢的數字6的開始索引為5,結束索引為8,通過math.floor取中間值的時候得到的索引就是7.也就是說7是處在5和8之間的乙個數。所以我們可以利用這個7來遍歷左右兩邊來查詢重複值。

var samecount = function

(arr, data)

else

}for (var j = (position + 1); j < arr.length; ++j)

else}}

return

count;

};

執行:

var nums = [5,1,7,4,2,10,9,3,6,8,6,7,6,11,6];

console.log(nums.tostring());

insertionsort(nums);

console.log(nums.tostring());

console.log(samecount(nums, 6));

結果為:

演算法之二分查詢

總時間限制 1000ms 記憶體限制 65536kb 描述在乙個非降序列中,查詢與給定值最接近的元素。輸入第一行包含乙個整數n,為非降序列長度。1 n 100000。第二行包含n個整數,為非降序列各元素。所有元素的大小均在0 1,000,000,000之間。第三行包含乙個整數m,為要詢問的給定值個數...

演算法之二分查詢

二分查詢演算法是運用分治策略的典型例子。給定一組已經排好序的n個元素a n 從這n個元素中找到乙個特定元素x。基本思想 將n 個元素劃分成個數大致相同的兩部分,取中間元素a n 2 與x進行比較 如果x a n 2 即找到x,演算法終止 如果x如果x a n 2 則只在陣列a的右半部分繼續查詢x。c...

演算法之二分查詢

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想,每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到想要查詢的元素,或是區間被縮小為0。二分查詢的時間複雜度為o l ogn o logn o logn l og nlogn logn 是乙個非常恐怖的數量級,即使n非...