title: 二分查詢
tags: 資料結構與演算法之美
author: 辰砂
二分查詢也稱折半查詢(binary search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列 (解釋:所以二分查詢的時候一定要是有序的陣列)
若k==r[mid].key,查詢成功若k1若k>r[mid].key,則low=mid+1
設表長為n,low、high和mid分別指向待查元素所在區間的上界、下界和中點,k為給定值
初始時,令low=1,high=n,mid=(low+high)/2
讓k與mid指向的記錄比較
若k==r[mid].key,查詢成功
若k若k>r[mid].key,則low=mid+1
重複上述操作,直至low>high時,查詢失敗
intsearch_bin(sstable st,keytype key) return
0; //
表中不存在待查元素
}
int search_bin (sstable st, keytype key, int low, inthigh)
public判定樹:樹中每個結點表示表中乙個記錄,結點中的值為該記錄在表中的位置,通常稱這個查詢過程的二叉樹稱為判定樹。折半查詢法在成功時進行比較的關鍵字個數最多不超過樹的深度。(折半查詢的執行過程可以用二叉樹來描述,這棵樹通常稱為「判定樹」)class
binarysearch ;
system.
out.println(binarysearch(nums, 1
)); system.
out.println(binarysearchrecursion(nums, 1, 0, nums.length - 1
)); }
/*** 迴圈
** @param nums
* @param target
** @return
*/public
static
int binarysearch(int nums, int
target)
int left = 0
;
int right = nums.length - 1
;
while (left <=right)
else
if (target >nums[mid])
else
}return -1
; }
/*** 遞迴
** @param nums
* @param target
* @param left
* @param right
** @return
*/public
static
int binarysearchrecursion(int nums, int target, int left, int
right)
int mid = (left - right) / 2 +right;
if (left <=right)
else
if (target >nums[mid])
else
}return -1
; }
關鍵字的平均比較次數,也稱平均搜尋長度asl(**erage search length)
如上圖而言是11個節點
假設概率都相等的情況下:asl=1/11(11+2×2+4×3+4*4 )=33/11=3
查詢成功時比較次數:為該結點在判定樹上的層次數,不超過樹的深度 d = log2 n + 1
查詢不成功的過程就是走了一條從根結點到外部結點的路徑d或d-1。
查詢過程:每次將待查記錄所在區間縮小一半,比順序查詢效率高,時間複雜度o(log2 n)
適用條件:採用順序儲存結構的有序表,不宜用於鏈式結構
由上面可以知道二分法的**的核心
mid=(low+high)/2思考:極端情況下會不會產生陣列溢位,答案是肯定的,因為極端情況下,當high為int型別的臨界最大值的時候,low只要變化,兩者相加肯定會溢位。為了效率更高,我們也可以用位運算,;if(key==st.r[mid].key) return
mid;
else
if(key1;//
前一子表查詢
else low=mid+1;
改進**:
int mid = (left - right) >> 2 + right;參考C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...
python二分法查詢 Python 二分法查詢
二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...
二分法查詢
前幾天csdn上說只有10 程式設計師能寫出正確的二分法查詢 so.我在看過二分法查詢方法後寫了乙個 一次測試成功.範圍 需要次數 10 4 100 7 1000 10 10000 14 100000 17 1000000 20 除了對特別小的陣列外,二分法查詢表現是非常優秀的.每次對範圍加倍可以建...