二分法查詢

2022-09-08 04:54:12 字數 2850 閱讀 3716

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時,查詢失敗

int

search_bin(sstable st,keytype key) return

0; //

表中不存在待查元素

}

int search_bin (sstable st, keytype key, int low, int

high)

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

;if(key==st.r[mid].key) return

mid;

else

if(key1;//

前一子表查詢

else low=mid+1;

思考:極端情況下會不會產生陣列溢位,答案是肯定的,因為極端情況下,當high為int型別的臨界最大值的時候,low只要變化,兩者相加肯定會溢位。為了效率更高,我們也可以用位運算,

改進**:

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 除了對特別小的陣列外,二分法查詢表現是非常優秀的.每次對範圍加倍可以建...