雜湊函式就是 關鍵字key 到 值value 的對映:
value = f(key)value反映的是關鍵字key的儲存位址。
直接定址法
f(key) = a * key + b例如存放不同出生年份的人口數量,出生年份是關鍵字,那麼可以用直接定址法。
直接定址法的優點是簡單均勻,也不會產生衝突;缺點是該方法適合表比較小且連續的情況,所以 該方法雖然簡單但是並不常用。
數字分析法
f(130***x1234) = 1234該方法抽取關鍵字的一部分作為value儲存位置,例如**號碼取後四位作為value。
該方法適合關鍵字位數比較大,且知道關鍵字分布位分布比較均勻的情況。
平方取中法
f(key) = key * key 再取中間數假設關鍵字是1234,那麼它的平方就是 1522756,再取中就得到 value=227。
該方法適合位數不是 很大,並且不知道關鍵字分布的情況。
摺疊法
f(9876543210) = 987 + 654 + 321 + 0 = 1962 再取後三位 = 962摺疊法是將關鍵字分成位數相等的幾個部分,再直接相加後取後幾位作為雜湊位址。
摺疊法適合關鍵字位數比較多,且不知道關鍵字分布的情況。
除留餘數法
**f(key) = key mod p **將key除以p得到的值作為value儲存位址,通常p是小於雜湊表長的最大質數。
隨機數法
f(key) = random(key)也就是選取關鍵字的隨機函式作為它的雜湊位址。
開放定址法
f(key) = (f(key) + di ) mod p根據 di 的變化,開放定址法又可以分為以下三種情況:
再雜湊法
f(key) = rh(key)當發生衝突時,就換乙個雜湊函式進行計算,總有乙個雜湊函式會把衝突解決掉。
鏈位址法
將相同value的不同key值用鍊錶的形式存放,這樣的好處是絕不會發生衝突,缺點是查詢時遍歷單鏈表會帶來效能的損耗。
公共區溢位法
用一塊新的記憶體來存放發生衝突的資料。查詢時先在基本表中進行查詢,如果沒有 找到再在溢位表中進行順序查詢。如果在基本表中衝突較小的話,公共區溢位法也是乙個好方法。
如果沒有衝突,雜湊表的查詢效率無疑是最高的,但是實際應用中不可能沒有衝突,所以 雜湊表 的查詢效能還取決於以下因素:
雜湊函式是否均勻
處理衝突的方法
雜湊表的裝填因子
裝填因子 = 填入表中的記錄個數 / 表的長度,代表著雜湊表的裝滿程度,越大越容易發生衝突。
構造方法採用 除留餘數法
解決衝突的方法採用 開放定址法的線性探測法
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
/*雜湊表:
理解上可以理解成c++中的unordered_set
構造方法採用 除留餘數法
解決衝突的方法採用 開放定址法的線性探測法
*/const
int nullkey = int32_min;
class
hashtable
inthash
(int key)
//雜湊函式的構造方法,採用除留餘數法
void
insert
(int key)
bool
search
(int key)
return
true;}
void
print()
const};
intmain()
; hashtable hashtable
(nums.
size()
);for(
auto
& e: nums)
hashtable.
insert
(e);
hashtable.
print()
;return0;
}
雜湊表 雜湊表 C語言簡單實現
本文參考自 大話資料結構 通過某個函式f計算出記錄的儲存位置,而不需要通過比較,這就是一種新的儲存技術 雜湊技術。雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 在查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查...
雜湊表(雜湊表)的實現
雜湊函式直接用key size的形式,size為雜湊表的大小。衝突處理採用平方探測法,為保證可以探測到整個雜湊表空間,雜湊表大小設定為4k 3形式的素數。當雜湊表中的元素過多時會造成效能下降,這時應該倍增雜湊表的大小,重新計算原來雜湊表中每個元素在新的雜湊表中的位置。雜湊表的實現 hashtable...
雜湊表 雜湊表
一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...