- 雜湊是透過一個數學函數來計算(或轉換)一個雜湊表中鍵值所對應的位址
- 可以直接且快速地找到鍵值所放的地址, 毋需透過循序搜尋的尋找方式
- 雜湊是一種由鍵值至位址之關係轉換
- 任何透過雜湊搜尋的檔案都不需經過事先的排序。也就是直接以:鍵值→ 雜湊函數 →位址
- 一般而言在有限的記憶體中,使用雜湊函數可快速的建檔、插入、搜尋及更新
- 雜湊有以下四大優點:
1. 使用雜湊法搜尋,事先不用排序
2. 搜尋速度與資料多少無關,在沒有碰撞和溢位下,只需一起讀取即可
3. 保密性高,不事先知道雜湊函數就無法搜尋
4. 可做資料壓縮,可節省空間。 - bucket:雜湊表中儲存資料的位置,且每個位置被指定一個唯一的位址,稱為 bucket address
- 雜湊法中的記憶位置被分成b個bucket,所有的資料鍵值經赫序轉換後必對應到表中的某一bucket
- slot:每一個bucket有好幾個儲存區,此儲存區便稱之為 slot,每個 slot 可以容納一個記錄
- 載入密度:雜湊空間的載入密度以α表示。α=n/sb
- n是識別字的使用數目,b是bucket的數目,s則是每一bucket的slot數
- α值愈大則使用率越高,碰撞或溢位的機會也就相對較高
- 同義字:若兩個識別字 I1 與 I2 其雜湊函數值相同,則f(I1)=f(I2),則稱I1與I2為同義字
- 碰撞:當兩個不同識別字經過雜湊函數運算後落在相同的bucket address,則稱為碰撞
- 溢位:如果一個識別字經雜湊函數運算後,所對應的bucket已經滿了,則稱為溢位
- Hash Function 設計原則
- 運算容易
- 碰撞越少越好
- 盡量將文字轉換成數字
- 盡量充分利用所有的 bucket 位置, 不要有偏差( bias ), 極盡可能均勻分配
- 中間平方法: 轉換成數值 --> 平方此數值-->取中間三位(視需要決定位數)--> 壓縮(視需要決定倍數)
- 除法: 利用 Mod 運算將識別字 X 除以某數 M, 取其餘數當作 X 的位址( 0~ M-1 ), M 建議用質數
- 疊合法: 轉換成數值 --> 將其分成幾部分, 除最後一個外, 每部分長度相同-->將其相加起來得到 bucket addess
- 移動摺疊
- 邊界摺疊: 將機數位段或偶數位段反轉後相加
- 位數分析法: 取出適當位數後, 可直接對應置 bucket 或再配合其他方法
- 靜態表: 永久性表, 所有資料已事先得知, 無刪除或修改的運算
- 動態表; 暫時性表, 所有資料未事先得知, 且有插入, 刪除或修改的運算
- 溢位處理(Overflow handling)
- 當識別字放入某個 bucket 時,若該 bucket 已滿了,則發生溢位
- 任何一種雜湊函數都免不了會發生碰撞或溢位
- 完美雜湊: 無碰撞或溢位的雜湊函數
- 線性探測(linear probing): 是把雜湊位置視為環狀的空間,當溢位發生時,以線性的方式從一 bucket開始探測,找到一個空的儲存位址即將資料存入,若找完一個循環還沒有找到空間則表示位置已滿。
- 平方探測(quadratic probing): 用來改善線性探測的缺失,避免相近的鍵值聚在一起。當f(X)的位址發生溢位時,下一次是探測(f(X)+i2) mod m或(f(X)-i2) mod m,其中1≦i≦(m-1)/2(注意m必須是具有4j+3型的質數(如7 or 127))
- 再雜湊: 設置一系列的雜湊函數f1,f2...fm。當f1產生溢位時,則改用f2,若f2又發生溢位時,則改用f3,....直到沒有溢位發生為止。
- 鏈結串列: 首先將所有的雜湊空間建立b個串列,起初只有b個串列首之後,若有相同位址的識別字則將其鏈結其後,成為鏈結串列,直到所有的可用空間用完為止。
對自已的路雖不很明確,但不能僅止於現狀!
該做與不該做的,最少有一個指針在控管!
清楚明白自已的弱點所在,
就算只是一步、兩步還是慢慢前進。
「人生的課題,如果你沒有學會處理,
它就會一而再、再而三的讓你練習」
在進行歸納推理時,如果逐個考察了某類事件的所有可能情況,
因而得出一般結論,那麼這結論是可靠的,這種歸納方法叫做枚舉法
學習決定你的才識,讀書決定你的思想,社團決定你的人脈,創業決定你的膽略,生活決定你的品位
標籤
- Design Pattern (2)
- English (6)
- GAME (32)
- java (12)
- programming (95)
- 實用 (62)
- 廢言 (3)
- 漫畫 (15)
- 處事手法 (3)
2012年8月27日 星期一
Hash
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言