二分查詢法的思想非常簡單,在一組已經完成排序的資料(array)中,如果需要查詢某一特定資料(value)是否存在的時候,設定兩個上下限(max, min)開始的時候在陣列的最前和最後,把需要查詢的值跟這兩個位置的中間位置資料(array[(max+min)/2])進行對比,如果value >array[(min+max)/2] ,則縮小範圍使得min=(min+max)/2,反之,如果value簡單的示例如下:
使用c++**實現如下:
template
int binary(t arr, int size, t value)
else
mid=(max+min)/2;
std::cout<< "max: "
return -1;
}這裡需要注意的是,在判斷了value和中間值的之後,min=mid+1,或者max=mid-1。因為中間值已經判斷過不為查詢的值,所以+1 -1不會造成漏掉資料。但是如果直接賦值為mide的話,如果查詢乙個超界的數值的時候,會造成死迴圈。
二分查詢也可以使用遞迴的方法來實現:
template
int find_value(t arr, int min, int max, t value)
else if(arr[mid] < value)
}再來看一下二分查詢的時間複雜度
假設總的資料量為n,每一次二分過後,剩下的資料量為之前的資料量的一般,也就是k此二分之後,資料量為n/2^k,最壞的時間複雜度為n/2^k=1, 也就是logn。其實當資料量很龐大的時候,二分查詢的速度非常的快。但是前提是這個方法需要的是一組排序好的陣列,所以如果資料量大到幾個g的時候並不合適,會占用太大的記憶體。
二分查詢法實現
查詢分為靜態查詢和動態查詢 靜態查詢主要包括順序查詢和二分查詢 折半查詢 順序查詢是我們常用的一種查詢方式,它有順序表的順序查詢和鍊錶的順序查詢,這兩部分在前面學習線性表時都有學習。二分查詢是一種針對有序表進行的查詢,其效率高,比較次數少。動態查詢是指可以對錶進行刪除和插入操作。主要以二叉排序樹為主...
java實現二分查詢法
二分查詢法 我把他理解為折半排除法,就是把查詢的範圍分為兩半,排除其中一半,把另一半再分成兩半,再排除一半,再分兩半,逐漸把範圍縮小,直到找到需要查詢的元素,或者判定沒有這個元素。使用二分查詢的前提是被查詢的是個有序的序列。以整數型一維陣列為例,查詢陣列中有沒有某個數字 package search...
java 實現二分查詢法
二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。public class searchutils else if des srcarray middle else return 1 二分查詢 在一定範圍中查詢元素 param s...