數據結構_散列表

散列表的查找技術

        我們學過的查找技術都是通過一系列的給定值與關鍵碼的比較,查找效率依賴於查找過程中進行的給定值與關鍵碼的比較次數。而散列表的查找不用比較,通過關鍵碼直接確定存儲位置。在存儲位置和關鍵碼之間建立一個確定的對應關係。
        散列表的基本思想:在記錄的存儲地址和他的關鍵碼之間建立一個確定的對應關係。這樣,不經過比較,一次讀取就能得到所查元素的查找方法。
        散列表:採用散列技術將記錄存儲在一塊連續的存儲空間中,這塊連續的存儲空間稱爲散列表。
        散列函數:將關鍵碼映射爲散列表中適當存儲位置的函數。
        散列地址:由散列函數所得的存儲位置。
        例如 :一組數:12, 37, 52, 43, 84, 99
                    散列表函數爲:H(k) = k%11
                    散列表:長度爲11

        散列既是一種查找技術,也是一種存儲技術。散列只是通過記錄的關鍵碼定位該記錄,沒有完整的表達記錄之間的邏輯關係,所以,散列主要是面向查找的存儲結構。
        散列技術的關鍵問題:1、散列函數的設計。如何設計一個簡單、均勻、存儲利用效率高的散列函數。
                                                2、衝突的處理。如何採用合適的處理衝突方法來解決衝突。
        衝突:對於兩個不同的關鍵碼Ki != Kj,有H(Ki) = H(Kj),即兩個不同的記錄需要存放在同一個存儲位置,Ki和Kj相對於H稱爲同義詞。
        散列函數,設計散列函數一般應遵循以下原則:
                     1、計算簡單。散列函數不應該有很大的計算量,否則會降低查找效率。
                     2、函數值即散列地址分佈均勻。函數值要儘量均勻散佈在地址空間,這樣才能保證存儲空間的有效利用並減少衝突。
    (1)、散列函數-直接定址法
           散列函數是關鍵碼的線性函數。即H(key) = a *key + b (a、b爲常數)
           適用情況:事先知道關鍵碼,關鍵碼集合不是很大且連續性較好。
      (2)、散列函數-除留餘數法
           散列函數爲 : H(key) = key mod p 一般情況下,選p爲小於或等於表長(最好接近表長)的最小素數。
           適用情況:不要求事先知道關鍵碼的分佈。 

      (3)、散列函數-數字分析法

            根據關鍵碼在各個位上的分佈情況,選取分佈比較均勻的若干位組成散列地址。

           適用情況:能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。

      (4)、散列函數-平方取中法

            對關鍵碼平方後,按照散列表大小,取中間的若干位作爲散列地址(平方後截取)

           適用情況:實現不知道關鍵碼的分佈且關鍵碼的位數不是很大。

       (5)、散列函數-摺疊法

           將關鍵碼從左到右分割成位數相等的幾部分,將這幾部分疊加求和,取後幾位作爲散列地址。

           適用情況:關鍵碼位數很多,事先不知道關鍵碼的分佈。


處理衝突的方法-開放定址法

      由關鍵碼得到的散列地址一旦產生了衝突,就去尋找下一個空的散列地址,並將記錄存入。

                                     方法:1、線性探測法            2、二次探測法                3、隨機探測法