2007年10月31日 星期三

雜湊 ( hashing )

雜湊 ( hashing )
 
  雜湊法 ( hashing ) 的搜尋與一般的搜尋法 ( saerching ) 不同。在 Hashing 中,鍵值 ( key value
  ) 或識別字 ( identifier ) 在記憶體的位址是經由函數 ( function ) 轉換而得。此種函數,一般稱之
  為雜湊函數 ( hashing function ) 或鍵值對應位址轉換 ( key to address transformation ) 。
 
            
 
  雜湊法具有以下四項優點:
  (1) 使用雜湊法搜尋,檔案不須事先排序 ( sorting ) 。
  (2) 在沒有碰撞 ( collision ) 及溢位 ( overflow ) 的情形下,只需一次讀取即可,且搜尋的速度與
    資料量的多寡無關。
  (3) 保密性高,若不知雜湊函數,無法擷取到資料。
  (4) 可做資料的壓縮 ( data compression ) ,利用適當的散置函數,可將資料壓縮到一個較小的
    範圍內,以節省空間。
 
雜湊函數 ( hashing function )
 
  一般常見的雜湊函數有下列幾種方法:
 
  (1) 平方後取中間位數 ( mid - square )
 
    此法是將鍵值平方後,然後視儲存空間的大小來決定取幾位。
    
    【範例】
        鍵值 k = 113586 。令 m = 9999 ,故 m 為 4 位數的正整數。
        則 h( k ) = k2 取中間四位數
            = 12901779369 取中間 4 位數
            = 1779
 
        m 為儲存空間的大小。
 
  (2) 折疊法 ( folding )
 
    此法是將鍵值分為數段,除了最後一段外,其餘各段皆須等長,然後將每一段相加,即可
    得到其所對應的位址。在相加的時後,有兩種方式:
 
    (a) 位移折疊 ( shift folding )
      將各段向左邊靠齊後相加。
    (b) 邊界折疊 ( folding at the boundaries )
      將奇數位段或偶數位段反轉後相加。
 
    【範例】
        如有一個鍵值為 12320324111220 ,其儲存位址為何?
 
        假設將其分為 5 段,如下所示:
 

 
  (3) 除法 ( Division )
 
    此法利用模數運算,將識別字 X 除以某一個數值 M ,取其餘數當做 X 的位址。這個位址
    介於 0 ~ M-1 之間。
 
    即 fD ( X ) = X mod M
 
  (4) 數位分析法 ( digit analysis )
 
    此法適用於大量的靜態資料,亦即所有的鍵值均事先知道,然後檢查所有的數位,分析每
    一數位是否均勻分佈,將不均勻的數位刪除,然後根據儲存空間的大小來決定數位的數目
    。
 
    【範例】
      有五位學生的學號分別是:
      ST1 = 682203
      ST2 = 682171
      ST3 = 693214
      ST4 = 695252
      ST5 = 691340
 
      令 m = 100 ,那我們只能挑選兩位數當做每一個學號的 Hashing Function 數值。可利
      用統計的方法,分析各數位的分佈情形,方法如下:
 


       SKi 之值越小者,表示 Di 分佈越均勻,因此,我們選擇 D1 和 D2 當做 Hashing
       Function 的數值,故 h(ST1) = 03 ,h(ST2) = 71,h(ST3) = 14,h(ST4)=52,h
       (ST5) = 40
 
解決溢位的方法 ( overflow handing )
 
(1) 線性探測 ( linear probing )

  又稱為線性開放定址 ( linear open addressing )。其做法是將雜湊位址視為環狀的空間,當溢位
  發生時,以線性方式從下一號桶開始探測,找尋一個空的儲存位址將資料存入。如下圖所示:
 

 
(2) 鏈結串列 ( chaining )
 
  是將雜湊空間建立成 b 個串列,起初只有 b 個串列首,只放起始位址,並不放資料,相同位址
  的鍵值,將形成一個鏈結串列。如下圖所示:
 

 
  平均探測次數 = 每個節點探測次數之總合 / 節點數
 
  如上圖, 49 , 23 , 53 , 41 探測數為 1 次,30 , 60 為 2 次,67 為 3 次,節點數為 49 , 23 , 53
  , 41 , 30 , 60 , 67 等 7 個。
  故平均比較(探測)數 = ( 1+1+1+1+2+2+3 ) / 7 = 11 / 7
 
(3) 平方探測 ( quadratic probing )
 
  此法是改善線性探測的缺失,避免相近的鍵值聚在一起。當 f(x) 的位址發生溢位時,下一次是
  探測 ( f(x) + i2 ) mod b 與 ( f(x) - i2 ) mod b ,其中 1<= i <= ( b-1 ) / 2 ,b 是具有 4j+3 型式的
  質數。
 
(4) 再雜湊 ( rehashing )
 
  設置一系列的雜湊函數 g1 , g2 , g3 , .... , gm 。當使用 g1 產生溢位時,則改用 g2 ,若 g2 又
  發生溢位時,則改用 g3 ,直到沒有溢位發生為止。
 
相關名詞
 
完美雜湊 ( Perfect Hashing )
 
  完美雜湊 ( Perfect Hashing ) 係指沒有碰撞 ( collision ),亦沒有溢位 ( overflow ) 的雜湊法。一
  般用於靜態表 ( static table ) 中,由於所有的鍵值均已事先得知,因此可設計出一完美雜湊法
  來處理。
 
桶 ( bucket )
 
  雜湊表中儲存資料的位置,每個位置被給定一個唯一的位址,稱之為 bucket address 。
 
槽 ( slot )
 
  每一個桶可能有好幾個儲存區,此儲存區便稱之為槽 ( slot ) 。每一個槽可以容納一個記錄。

碰撞 ( collision )
 
  當兩個不同的識別字經過雜湊函數運算後,落在相同的 bucket address ,稱之為碰撞。
 
溢位 ( overflow )
 
  如果一個識別字經過雜湊函數運算後,所對應的 bucket 已經滿了,就稱之為溢位。
 
同義字 ( Synonym )

沒有留言: