詳解雜湊表查詢

2021-08-16 03:47:39 字數 2515 閱讀 7700

**

雜湊表查詢又叫雜湊表查詢,通過查詢關鍵字不需要比較就可以獲得需要記錄的儲存位置,它是通過在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f(key)。即: 

—儲存位置=f(關鍵字),其中f為雜湊函式。

1、雜湊表最適合的求解問題是查詢與給定值相等的記錄。

2、雜湊查詢不適合同樣的關鍵字對應多條記錄的情況,如使用關鍵字「男」去查詢某個同學。

3、不適合範圍查詢,比如查詢班級18~22歲的同學。

怎麼樣的才算是好的雜湊函式?

1、計算簡單。雜湊函式的計算時間(指的是產生位址的時間),不應該超過其他查詢技術與關鍵字比較的時間。 

2、 位址分布均勻。盡量讓雜湊位址均勻分布在儲存空間中,這樣可以使空間有效的利用。

(1)直接定址法

f(key)= a*key + b (其中a,b均為常數)

這種雜湊函式優點是比較簡單、均勻,也不會產生衝突,但是需要事先知道關鍵字的分布情況,適合查詢表比較小且連續的情況。在實際中並不常用。
(2)數字分析法

可以使用關鍵字的一部分來計算雜湊儲存的位置,比如手機號碼的後幾位(或者反轉、左移右移等變換)。

通常適用於處理關鍵字位數比較大的情況,如果事先知道關鍵字的分布且關鍵字的若干位分布均勻,就可以考慮用這種方法。
(3)除留餘數法

這是最為常用的構造雜湊函式的方法,對於雜湊表長度為m的雜湊函式為:

f(key)=key mod p (p<=m)

mod是取模(求餘數)的意思。事實上,如果p選得不好,就很容易出現同義衝突的情況:

如上圖所示,選擇p=11,就會出現key=12、144的衝突。

根據經驗,若雜湊表表長為m,通常p為小於或者等於表長的最小質數或不包含小於20質因子的合數。
從剛才的除留餘數法可以看出,設計再好的雜湊函式也不可能完全避免衝突(key1!=key2,但是f(key1)=f(key2)),下面介紹幾種常用的避免衝突方法。

(1)開放定址法

該方法是一旦發生衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將其記錄存入。

fi(key)=(f(key)+di) mod m (di=1,2,3……m-1)

二次探測法:

fi(key)=(f(key)+di) mod m (di=1^2, -1^2, 2^2, -2^2……q^2, -q^2, q<=m/2)

增加平方項,主要是為了不讓關鍵字都集中在某一塊區域,避免不同的關鍵字爭奪乙個位址的情況。
隨機探測法:

fi(key)=(f(key)+di) mod m (di是乙個隨機數列)

di使用隨機函式計算而來,是前面方法的改進。
(2)鏈位址法

將所有關鍵字為同義詞的記錄儲存在乙個單鏈表中,在雜湊表中只存所有同義詞子表的指標。

如上圖所示,取12為除數,進行除留餘數法,無論存在多少衝突,都只是在當前位置給單鏈表增加節點而已。

#define success 1

#define unsuccess 0

#define hashsize 12 //定義雜湊表長為陣列的長度

#define nullkey -32768

typedef struct

hashtable;

int m = 0;

status inithashtable(hashtable *h)

int hash(int key)

void inserthash(hashtable *h, int key)

status searchhash(hashtable h, int key, int

*addr)

return success; //查詢成功返回

}

雜湊表查詢詳解

雜湊表查詢又稱雜湊表查詢,通過查詢關鍵字不需要比較就可以獲得需要記錄的儲存位置,它是通過在記錄的儲存位置和它的關鍵字之間建立的乙個確定的關係f,使得每個關鍵字key對應乙個儲存位置f key 即 儲存位置 f 關鍵字 其中f為雜湊函式。雜湊表最適合的求解問題是查詢與給定值相等的記錄。雜湊查詢不適合同...

查詢 雜湊表查詢(雜湊表)

1 雜湊表查詢定義 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查詢集合中存在這個記錄,則必定在f key 的位置上。採用雜湊技術將記錄儲存在一塊連續的儲存空間中...

雜湊表(雜湊表)查詢

雜湊技術是在記錄的儲存位置和它的關鍵字之間建立起乙個確定的對應關係f,使每個關鍵字key對應乙個儲存位置f key f為雜湊函式,又稱雜湊函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間成為雜湊表 雜湊表。直接用key值的某個線性函式當位址。f key a key b 簡單,不...