雜湊法又稱雜湊法,它在元素的儲存位置與元素關鍵碼間建立乙個確定的對應函式關係hash()
,使每個關鍵碼與結構中的乙個唯一的儲存位置相對應:address=hash(rec.key)
插入時,按照此函式計算儲存位置並存放,查詢時對元素的關鍵碼進行相應的函式計算,把求得的函式值與關鍵碼進行比對,一致則查詢成功。按照此方法構造的表結構即為雜湊表
1.直接定址法
可以直接使用f(key)=a*key+b
,這樣的形式獲取value值
2.平方取中法
先通過關鍵字的平方值擴大相近值的差別,然後根據表長度取中間幾位數作為雜湊函式值。
int
hash
(int key)
3.除留餘數法可以使用f(key) = key % p
的方法去計算value值。
4.隨機數法
選擇乙個隨機函式,取關鍵字的隨機函式值為他的雜湊位址,即h(key) = random(key)
1.開放定製法
所謂的開放定址法就是一旦發生了衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將記錄存入。
公式:hi=(h(key) + di) % m
比如說,關鍵字集合為,表長為12。雜湊函式
f(key) = key mod 12
。
計算key等於26的時候求余是2。但是2的位置已經有值了,那麼進行接下來的操作f(36) = (f(36)+1)mod 12
,這個時候就沒有值了。那麼就有空位了。
這個就是線性探測法。
2.拉鍊法
拉鍊法的解決方法是,當出現衝突的時候,會把衝突值變成乙個鍊錶加在最後面。
拉鍊法也有缺點,就是鍊錶數量一旦變得很大的時候,查詢的效能變得很大。jdk的解決方法是當鍊錶長度大於8的時候變成紅黑樹。
public
class
hashtable
//使用預設引數的構造器
public
hashtable()
//放入元素
public
boolean
put(k key,v value)
return
false;}
//新增元素到指定索引處
private
boolean
addentry
(hashtable
.entry
temp,
hashtable
.entry
table)
}鏈結在該索引位置處最後乙個元素上
addentrylast
(temp,entry);}
//3.若空則直接放在該位置
setfirstentry
(temp,index,table)
;//4.插入成功,返回true
return
true;}
//鏈結元素到指定索引處最後乙個元素上
private
void
addentrylast
(hashtable
.entry
temp,
hashtable
.entry
entry)
//初始化索引處的元素值
private
void
setfirstentry
(hashtable
.entry
temp,
int index,
hashtable
.entry
table)
//擴容容量
private
void
resize
(int newsize)
} table=newtable;
}//計算索引值
private
intindexfor
(int hash,
int tablelength)
//取得與key對應的value值
protected v get
(k k)
return null;
}//內部類,包裝需要存在雜湊表中的元素
class
entry
}}
資料結構與演算法簡記 雜湊演算法
將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。而通過原始資料對映之後得到的二進位制值串就是雜湊值。md5 md5 message digest algorithm,md5 訊息摘要演算法 sha secure hash algorithm,安全雜湊演算法 借助h...
資料結構與演算法 雜湊表
對映在數學上相當於乙個函式f x a b。雜湊表的核心是乙個雜湊函式 hash function 這個函式規定了集合a中的元素如何對應到集合b中的元素。根據設定的雜湊函式 h key 和處理衝突的方法 將一組關鍵字映像到乙個有限的連續的位址集 區間 上,並以關鍵字在位址集中的 像 作為相應記錄在表中...
資料結構與演算法 雜湊表
雜湊表也叫雜湊表,hash表是一種根據關鍵字值 key value 而直接進行訪問的資料結構。是把記錄的儲存位置和記錄的關鍵字之間建立對應關係的一種儲存結構。雜湊表又叫 雜湊表,速度很快,最常用的一種儲存機構是順序表 鍊錶的結構 主結構是順序表,每個順序表中的元素又對應一張鍊錶。雜湊表的常用資料結構...