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

2021-10-03 08:50:30 字數 2420 閱讀 5357

1、雜湊表查詢定義

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

2、雜湊函式的構造方法

1)直接定址法

2)數字分析法

數字分析法就是抽取關鍵字中的一部分來計算雜湊儲存位置。數字分析法通常適合處理關鍵字位數較大的情況,如果事先知道關鍵字的分布且關鍵字的若干位分布較均勻,就可以考慮用這個方法。

3)平方取中法

取關鍵字的平方,抽取中間的3位用作雜湊位址。平方取中法比較適合於不知道關鍵字的分布,而位數又不是很大的情況。

4)摺疊法

摺疊法是將關鍵字從左到右分割成位數相等的幾部分,然後將這幾部分疊加求和,並按雜湊表表長,取後幾位作為雜湊位址。摺疊法實現不需要知道關鍵字的分布,適合關鍵字位數較多的情況。

5)除留餘數法

次方法為最常用的構造雜湊函式方法。對於雜湊表長為m的雜湊函式公式為:f(key)=key mod p(p<=m)。這方法不僅可以對關鍵字直接取模,也可在摺疊、平方取中後再取模。若雜湊表長為m,通常p為小於等於表長的最小質數或不包含小於20質因子的合數。

6)隨機數法

選擇乙個隨機數,取關鍵字的隨機函式值為它的雜湊位址。也就是f(key)=random(key)。當關鍵字的長度不等時,採用這個方法構造雜湊函式比較合適的。

總結:在現實中,應該視不同的情況採用不同的雜湊函式。以下一些考慮的因素來提供參考:一是計算雜湊位址所需的時間,二是關鍵字的長度,三是雜湊表的大小,四是關鍵字的分布情況,五是記錄查詢的頻率。綜合這些因素,才能決策選擇哪種雜湊函式更合適。

3、處理雜湊衝突的方法

1)開放定址法

fi(key)=(f(key)+di) mod m(di=1,2,3,...,m-1),這種解決衝突的開放定址法稱為線性探測法。

fi(key)=(f(key)+di) mod m(

2)再雜湊函式法

對於再雜湊函式法,事先準備多個雜湊函式,fi(key)=rhi(key)(i=1,2,...,k),這裡rhi就是不同的雜湊函式。每當發生雜湊位址衝突時,就換乙個雜湊函式計算,相信總會有乙個可以把衝突解決掉。這種方法能夠使得關鍵字不產生聚集,相應地也增加了計算時間。

3)鏈位址法

將所有關鍵字為同義詞的記錄儲存在乙個單鏈表中,我們稱這種表為同義詞子表,在雜湊表中只儲存所有同義詞子表的頭指標。無論有多少個衝突,都只是在當前位置給單鏈表增加結點的問題。鏈位址法對於可能會造成很多衝突的雜湊函式來說,提供了絕不會出現找不到位址的保障。這也就帶來了查詢時需要遍歷單鏈表的效能損耗。

4)公共溢位區法

這種方法,對於衝突的關鍵字,為所有衝突的關鍵字建立了乙個公共的溢位區來存放。在查詢時,對給定值通過雜湊函式計算出雜湊位址後,先與基本表的相應位置進行對比,如果相等,則查詢成功;如果不相等,則到溢位表去進行順序查詢。如果相對於基本表而言,有衝突的資料很少的情況下,公共溢位區的結構對查詢效能來說還是非常高的。

4、雜湊表查詢實現

#includeusing namespace std;

typedef int status;

#define true 1

#define false 0

#define nullkey -32768

#define hashsize 12

typedef struct hashtable;

int m = 0; //雜湊表表長,全域性變數

//初始化hash表

status inithashtable(hashtable* h)

//除留餘數法計算hash值,通過關鍵字計算儲存位址

int hash(int key)

//向hash表插入關鍵字操作

void inserthash(hashtable* h, int key)

//在hash表中搜尋關鍵字,返回關鍵字儲存位址

status searchhash(hashtable h, int key, int* addr)

return true;

}int main()

; for (int i = 0; i < hashsize; i++)

inserthash(&h, elem[i]);

int addr;

int key = 67;

if (searchhash(h, key, &addr) == true)

cout << addr << endl;

else

cout << "search nothing." << endl;

return 0;

}

雜湊表(雜湊表)查詢

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

雜湊表 雜湊表 查詢

直接定址法 數字分析法 平方取中法 平方取中法是將關鍵字平方之後取中間若干位數字作為雜湊位址。摺疊法摺疊法是將關鍵字從左到右分割成位數相等的幾部分,然後將這幾部分疊加求和,並按雜湊表表長取後幾體作為雜湊位址。除留餘數法 隨機數法 選擇乙個隨機數,取關鍵字的隨機函式值為它的雜湊位址。即 f key r...

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

雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 這裡對應關係f稱為雜湊函式,又稱為雜湊 hash 函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表 hash table 雜湊技術既是一種儲存方法...