經典搜尋演算法之二分查詢與二叉查詢樹

2021-10-07 02:16:59 字數 1708 閱讀 8578

1.二分查詢

二分查詢也稱為折半查詢,它是一種效率較高的查詢方法。二分查詢的使用前提是線性表已經按照大小排好了序。這種方法充分利用了元素間的次序關係,採用分治策略。基本原理是:首先在有序的線性表中找到中值,將要查詢的目標與中值進行比較,如果目標小於中值,則在前半部分找,如果目標小於中值,則在後半部分找;假設在前半部分找,則再與前半部分的中值相比較,如果小於中值,則在中值的前半部分找,如果大於中值,則在後半部分找。以此類推,直到找到目標為止。

假設我們要在 2,6,11,13,16,17,22,30中查詢22,上圖所示,則查詢步驟為:

首先找到中值:中值為13(下標:int middle = (0+7)/2),將22與13進行比較,發現22比13大,則在13的後半部分找;

在後半部分 16,17,22,30中查詢22,首先找到中值,中值為17(下標:int middle=(0+3)/2),將22與17進行比較,發現22比17大,則繼續在17的後半部分查詢;

在17的後半部分 22,30查詢22,首先找到中值,中值為22(下標:int middle=(0+1)/2),將22與22進行比較,查詢到結果。

二分查詢大大降低了比較次數,二分查詢的時間複雜度為:,即。

示例**:

public class binarysearch ;

system.out.println("非遞迴結果,22的位置為:" + binarysearch(arr, 22));

system.out.println("遞迴結果,22的位置為:" + binarysearch(arr, 22, 0, 7)); }

//非遞迴

static int binarysearch(int arr, int res) else if(res arr[high] || low > high)

int middle = (low+high)/2;

if(res < arr[middle])else if(res > arr[middle])else } }

2.二叉查詢樹

一般情況下二分查詢比順序查詢在時間上要快很多,但是在頻繁修改的表中採用二分查詢,其效率是非常低下的,因為順序表的修改操作效率低下,而二分查詢的高效就是利用順序表的索引來取值進行比較的。為了支援頻繁的修改,我們需要採用鍊錶這種資料結構。然而,單鏈表的查詢效率又非常低,為了解決這一問題,二叉查詢樹(bst)便誕生了。

二叉查詢樹的特點是:任一結點的值都大於其左子樹,小於其右子數,如下圖所示:

我們將二叉查詢樹投影到平面上,實際上就是有順序的線性表,如下圖所示:

二叉查詢樹既有快速查詢的特點,又有快速插入的特點。其查詢**幾乎和二分查詢一樣。

其時間複雜度最好情況為,最差情況為。

最好情況為平衡二叉樹(即每次查詢會分成兩半)時,如圖:

最差情況為所有資料全部在一端時(鍊錶無索引,需要乙個乙個搜尋),如圖:

二分查詢搜尋演算法

二分查詢能解決從給定的一組有順序的數中查詢出某乙個數這類問題。它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。left 為序列開始 mid 為序列中間 right 為序列結束位置 value 為查詢的關鍵字 預設序列為公升序 思路就是先將序列中...

二分查詢 折半搜尋 演算法

折半搜尋又叫二分查詢也叫二分演算法,顧名思義 折半就是把有序陣列分成兩段 找乙個中間軸 跟你想要查詢的元素比較如果是中間軸數大於查詢數就從前半段進行如此步驟 直到找到查詢數,小於則從後半段依此。下邊這段 只是對有排序規則的,對無排序則用comparator自定義排序規則 如物件。折半查詢 針對有序陣...

二分搜尋演算法

今天我勉強搞懂了二分查詢演算法,我覺得很有收穫,這是個不錯的演算法,希望還不知道 不懂二分演算法的朋友能看看!二分查詢 二分查詢的前提是陣列一定是有序的 傳入乙個陣列 t 傳入乙個查詢元素 t key 返回查詢結果 class myutil else if key.compareto x mid 0...