原文地址:http://blog.csdn.net/qq_27093465/article/details/52269862
一)哈希表簡介
非哈希表的特點:關鍵字在表中的位置和它之間不存在一個確定的關系,查找的過程為給定值一次和各個關鍵字進行比較,查找的效率取決於和給定值進行比較的次數。
哈希表的特點:關鍵字在表中位置和它之間存在一種確定的關系。
哈希函數:一般情況下,需要在關鍵字與它在表中的存儲位置之間建立一個函數關系,以f(key)作為關鍵字為key的記錄在表中的位置,通常稱這個函數f(key)為哈希函數。
hash : 翻譯為“散列”,就是把任意長度的輸入,通過散列算法,變成固定長度的輸出,該輸出就是散列值。
這種轉換是一種壓縮映射,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來唯一的確定輸入值。
簡單的說就是一種將任意長度的消息壓縮到莫伊固定長度的消息摘要的函數。
hash沖突:(大師兄自己寫的哦)就是根據key即經過一個函數f(key)得到的結果的作為地址去存放當前的key value鍵值對(這個是hashmap的存值方式),但是卻發現算出來的地址上已經有人先來了。就是說這個地方要擠一擠啦。這就是所謂的hash沖突啦
二)哈希函數處理沖突的方法
1)開放定址法:
其中 m 為表的長度
對增量di有三種取法:
線性探測再散列 di = 1 , 2 , 3 , ... , m-1
平方探測再散列 di = 1 2 , -12 , 22 , -22 , 32 , -32 , ... , k2 , -k2
(大師兄備注:嗎單,上面的平方探測再散列是加1的平方;減1的平方,加2的平方,減2的平方,加3的平方,減3的平方。。。加k的平方,減k的平方。卧擦,老師你能再坑點么?法科。要是你直接看這個平方探測再散列的di是怎么來的,不一定能看懂老師ppt的這個寫法,是平方的意思。上面的紅色字呢,相當於是老師的ppt,是對應上面的圖片一起看的。)
隨機探測再散列 di 是一組偽隨機數列
例子:
我在上面的這個配圖底部寫的那個紅色的12,我當時測試的時候,不知道這個12,也就是上面增量 di 的由來。不知道,限制知道了,那是1的2次方。。。。老師懶得或者說不會給數字打角標。
2)鏈地址法
3、4)再哈希、建立公共溢出區
3.再hash法,就是算hashcode的方法不止一個,一個要是算出來重復啦,再用另一個算法去算。反正很多,直到不重復為止咯。大師兄猜的
4.建立一個公共溢出區域,就是把沖突的都放在另一個地方,不在表里面。具體實現就 不知道啦,也是大師兄猜的。
2.再哈希法
3.鏈地址法(Java hashmap就是這么做的)
4.建立一個公共溢出區