雜湊表:通過關鍵碼來對映到值的乙個資料結構;
雜湊函式:鍵與值對映的乙個對映關係;
常用方法:
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元素已經刪除...