二分查詢(基於有序陣列)

2021-08-26 17:46:43 字數 2678 閱讀 1728

採用一對平行的陣列,乙個儲存鍵乙個儲存值

實現的核心是rank()方法,它返回表中小於給定鍵的鍵的數量

二分查詢法:將被查詢的鍵和子陣列的中間鍵比較。如果被查詢的鍵小於中間鍵,就在左子陣列中繼續查詢,如果大於就在右子陣列中繼續查詢,否則中間鍵就是我們要找的鍵。

實現 rank() 採用了二分查詢法,rank()性質如下:

如果表中存在該鍵,rank() 返回該鍵的位置,也就是表中小於它的鍵的數量

如果表中不存在該鍵,rank() 仍返回表中小於它的鍵的數量

/*基於遞迴的二分查詢*/

public

intrank(key key,int lo,int hi)

/*基於迭代的二分查詢*/

public

intrank(key key)

return lo;

}

/** 演算法3.2 二分查詢(基於有序陣列)

* 資料結構是一對平行的陣列,乙個儲存鍵乙個儲存值,

* 並在建構函式中將它們轉化回 key 和 value

*/public

class

binarysearchst

extends

comparable

,value>

//rank()方法實現了二分查詢,它返回表中小於給定鍵的鍵的數量

public

intrank(key key)

public value get(key key)

public

void

put(key key,value val)

for(int j=n; j>i; j--)

keys[i]=key;

vals[i]=val;

n++;

if(n == keys.length)

resize(2*keys.length); //擴充陣列大小

}public

void

delete(key key)

n--;

if(n>0 && n==keys.length/4)

resize(keys.length/2); //縮小陣列大小

一般情況下,二分查詢都比順序查詢快得多,它也是眾多實際應用程式的最佳選擇。

當然,二分查詢也不適合很多應用。例如,它無法處理leipzig corpora資料庫,因為查詢和插入操作是混合進行的,而且符號表也太大了。如我們所強調的那樣,現代應用需要同時能夠支援高效的查詢插入兩種操作的符號表實現。也就是說,我們需要在構造龐大的符號表的同時能夠任意插入(也許還有刪除)鍵值對,同時也要能夠完成查詢操作。

所以,我們現在核心的問題在於能否找到同時保證查詢插入操作都是對數級別的演算法和資料結構。

要支援高效的插入操作,似乎需要一種鏈式結構。但單鏈表無法使用二分查詢,因為二分查詢的高效來自於能夠快速通過索引取得任何子陣列的中間元素。

為了將二分查詢的效率和鍊錶的靈活性結合起來,我們需要更加複雜的資料結構。能夠同時擁有兩者的就是二叉查詢樹

基於有序陣列的二分查詢

define max count 100 基於有序陣列的二分查詢 int keys max count int values max count int count 0 int isempty 根據給定的關鍵字,在字典中查詢是否有匹配項,並返回匹配的項的 陣列索引,如果沒有找到匹配的項,則返回大於該...

二分查詢有序陣列

對於乙個有序字串陣列,用二分法查詢某一字串是否存在於該字串陣列中。函式原型為 bool binarysearch const vector array,const string target 注意這裡的有序指的是字典序,如字串陣列 a,ab,ac,bc,cd,d 就是有序字串陣列,而 a,b,ab ...

有序陣列的二分查詢

給出乙個有序陣列 公升序 以及指定的數值。返回指定數值在陣列中的下標 若不存在則返回 1 在傳入的公升序陣列arr中查詢是否有元素值與給定的number相等。param arr 有序陣列 公升序 param number 指定的數值 return 指定數值在該陣列中的下標值。返回 1表示不存在 st...