雜湊表 雜湊函式 雜湊衝突與解決

2021-08-22 10:28:44 字數 1241 閱讀 2119

雜湊表:通過關鍵碼來對映到值的乙個資料結構;

雜湊函式:鍵與值對映的乙個對映關係;

常用方法

1、直接定址法:f(x) = kx+b (k、b都是常數) ,一旦確定了雜湊函式,那麼新增、獲取元素都需要通過這個雜湊函式;

2、除留餘數法:f(x) = x%k (k是常數,k <= m (m為儲存位置長度)) ;

其他幾種方法:

方法名說明

適合情況

直接定址法

f(key) = key 或者 f(key) = a*key + b

事先知道關鍵字的分布情況,查詢表較小且連續

數字分析法

根據實際問題自己創造乙個能將關鍵字雜湊表的各位置的雜湊函式

事先知道關鍵字的分布情況且關鍵字的若干位分布較均勻

平方取中法

先把關鍵字平方,然後取得到的結果的中間幾位當雜湊值

不知道關鍵字的分布,而位數又不是很大的情況

摺疊法把關鍵字分成較小的幾組資料,求和,取得到結果的後幾位當雜湊值

不知道關鍵字的分布,且關鍵字位數較多情況

除留餘數法

f(key) = key%n ( n≤m )m為表長(容量),n 為不大於 m 的素數,或是不含 20 以下的質因子

一般都可以,所以是最常用的方法

隨機數法

f(key) = random(key)

關鍵字長度不等的時候

雜湊衝突:由於雜湊函式構造不當,通過同乙個雜湊函式把兩個不同的數雜湊到了同乙個位置;m != n ---->f(m) = f(n);雜湊衝突無法避免,但可以減少(改變合適的雜湊函式還是有可能發生雜湊衝突,但衝突的資料會大大減少)。

解決雜湊衝突:

常用方法

1、鏈位址法:陣列+鍊錶(雜湊表)

2、探測法:① 線性探測:p(i) = i+c ②非線性探測:p(i) = i+random();

其他幾種方法:

方法名說明

註解開放位址法

再雜湊函式法

發生雜湊位址衝突時,換乙個雜湊位址計算,相信總會有乙個函式是可以解決衝突的

這種方法可以使關鍵字不產生聚集,但增加了計算時間

鏈位址法

陣列+鍊錶

這種方法絕不會出現找不到位址的情況,但是查詢時要遍歷鍊錶

公共溢位區法

就是把衝突的關鍵字放在乙個新錶中

這個方法的查詢性還是比較高的

雜湊表,雜湊衝突

什麼是雜湊表?雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。關鍵字 雜湊函式 雜湊函式 雜湊位址 優點 一對一的查詢...

雜湊 雜湊函式 衝突處理

例 如果我們現在要統計的是80後出生年份的人口數,那麼我們對出生年份這個關鍵字可以用年份減去1980來作為位址。此時f key key 1980。這樣的雜湊函式優點就是簡單 均勻,也不會產生衝突,但問題是這需要事先知道關鍵字的分布情況,適合查詢表較小且連續的情況。由於這樣的限制,在現實應用中,直接定...

雜湊衝突 閉雜湊與開雜湊

閉雜湊 也叫開放定址法,當發生雜湊衝突時,如果雜湊表未被裝滿,說明在雜湊表中必然還有空位置,那麼可以把key存放到衝突位置中的 下乙個 空位置中去。include using namespace std 雜湊表每個空間給個標記 empty此位置空,exist此位置已經有元素,delete元素已經刪除...