哈希表(Hash table,也叫散列表)绽快,是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄粘驰,以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù)述么,存放記錄的數(shù)組叫做散列表蝌数。
記錄的存儲(chǔ)位置=f(關(guān)鍵字)
即直接將關(guān)鍵值與實(shí)際存儲(chǔ)地址綁定起來了,可以直接通過key計(jì)算出存儲(chǔ)地址度秘,而不需要尋址顶伞。
這里的對(duì)應(yīng)關(guān)系f稱為散列函數(shù),又稱為哈希(Hash函數(shù))剑梳,采用散列技術(shù)將記錄存儲(chǔ)在一塊連續(xù)的存儲(chǔ)空間中唆貌,這塊連續(xù)存儲(chǔ)空間稱為散列表或哈希表(Hash table)。
哈希表hashtable(key垢乙,value) 就是把Key通過一個(gè)固定的算法函數(shù)既所謂的哈希函數(shù)轉(zhuǎn)換成一個(gè)整型數(shù)字锨咙,然后就將該數(shù)字對(duì)數(shù)組長度進(jìn)行取余,取余結(jié)果就當(dāng)作數(shù)組的下標(biāo)追逮,將value存儲(chǔ)在以該數(shù)字為下標(biāo)的數(shù)組空間里酪刀。(或者:把任意長度的輸入(又叫做預(yù)映射, pre-image)钮孵,通過散列算法骂倘,變換成固定長度的輸出,該輸出就是散列值巴席。這種轉(zhuǎn)換是一種壓縮映射历涝,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間漾唉,不同的輸入可能會(huì)散列成相同的輸出荧库,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)毡证。)??? 而當(dāng)使用哈希表進(jìn)行查詢的時(shí)候电爹,就是再次使用哈希函數(shù)將key轉(zhuǎn)換為對(duì)應(yīng)的數(shù)組下標(biāo),并定位到該空間獲取value料睛,如此一來丐箩,就可以充分利用到數(shù)組的定位性能進(jìn)行數(shù)據(jù)定位摇邦。
Hash Table的查詢速度非常的快,幾乎是O(1)的時(shí)間復(fù)雜度屎勘。
-哈希函數(shù)的構(gòu)造方法
1.直接地址法
h(k) = k+c
2.除留余數(shù)法
h(k) = k mod p
p最好取為不大于哈希表長度的最大素?cái)?shù)施籍,效果最好
3.數(shù)字分析法
提取關(guān)鍵字中取值均勻的數(shù)字作為哈希地址,適用于所有關(guān)鍵字值都已知的情況概漱。
-哈希沖突解決方法
1.開放地址法
即將沖突的元素插入到哈希表重的空閑單元中丑慎。(線性探查法,平方探查法等)
2.拉鏈法
將所有的同義詞用單鏈表鏈接起來瓤摧,哈希表中每個(gè)單元中存放的不是記錄本身竿裂,而是同義詞單鏈表的頭指針。
3.再哈希法