資料結構 雜湊表

2021-10-25 05:23:19 字數 1976 閱讀 2744

雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f(key)。查詢時,根據這個確定的對應關係找到給定值key的對映f(key),若查詢集合中存在這個記錄,則必定在f(key)的位置上。

我們把這種對應關係f稱為雜湊(hash)函式,也稱為雜湊函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,則這塊連續儲存空間稱為雜湊表(hash table)。雜湊表的關鍵值通過雜湊函式對映到陣列上,查詢時通過關鍵值直接訪問陣列。

雜湊技術既是一種儲存方法,也是一種查詢方法。其是面向查詢的儲存結構。雜湊技術最適合的求解問題是查詢與給定值相等的記錄。但當同樣的關鍵字對應多個記錄時,則不適合使用雜湊技術雜湊技術也不適合進行範圍查詢,比如查詢18-22歲的同學。

設計乙個簡單、均勻、儲存效率高的雜湊函式是雜湊技術中最關鍵的問題。但有時會碰到兩個關鍵字key1≠key2,但f(key1)=f(key2)的情況,這種現象稱為衝突,且把key1和key2稱為這個雜湊函式的同義詞。衝突是不能完全避免的。

好的雜湊函式需要滿足兩個條件:

(1)計算簡單;

(2)雜湊位址分布均勻。

要提高雜湊表的查詢效率,關鍵在於合理的構造雜湊函式和優秀的解決衝突的方法

常用的雜湊函式構造方法有:

(1)直接定址法;

(2)數字分析法;

(3)平方取中法;

(4)摺疊法;

(5)除留餘數法;

(6)隨機數法。

常用的處理雜湊函式衝突的方法有:

(1)開放定址法;

(2)再雜湊函式法;

(3)鏈位址法;

(4)公共溢位區法。

如果沒有衝突,雜湊查詢是所有查詢方法中效率最高的,其時間複雜度為o(1)

通常會用裝填因子來衡量雜湊表的效能。裝填因子α=填入表中的記錄個數/雜湊表長度。通常都會將雜湊表的空間設定的比查詢集合大,這樣雖浪費了一定的空間,但換來的是查詢效率的大幅提公升。

在stl的functional標頭檔案中,定義了雜湊模板來實現雜湊函式

hash函式的模板類定義為:

template struct hash,其定義標準庫使用的預設雜湊函式的一元函式物件類。

該函式物件的例項定義乙個operator(),其接受乙個引數的型別key,返回乙個型別為size_t的值,表示該引數的雜湊值。若兩個引數k1,k2相等,則std::hash()(k1) == std::hash()(k2),若k1,k2不相等,則std::hash()(k1) == std::hash()(k2)成立的概率非常小,接近1.0/size_t.max()。

無序關聯容器std::unordered_set,std::unordered_multiset,std::unordered_map,std::unordered_multimap使用專業的模板std::hash的預設雜湊函式

hash函式模板類可使用的關鍵字型別有:bool,char,signed char,unsigned char,char16_t,char32_t,wchar_t,short,unsigned short,int,unsigned int,long,unsigned long,long long,unsigned long long,float,double,long double,上述型別的指標型別,string,wstring,u16string,u32string,unique_ptr,shared_ptr,vector,bitset,error_code,type_index,thread::id。

使用示例的**為:

#include

#include

#include

int main (

)

資料結構 雜湊表

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

資料結構 雜湊表

雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...

資料結構 雜湊表

3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...