算法導論--散列表的數學分析(精解)鏈表法

散列表的具體實現就很少作介紹了,就是一個數組,每一個下標存儲的是碰撞的元素的鏈表頭指針,以下圖所示::算法

下面直接研究對用連接法散列的分析:數組

給定一個能存放n個元素的、具備m個槽位的散列表T,定義T的裝載因子α爲n/m,即一個鏈中平均存儲的元素數。函數

用連接法散列的最壞狀況性能不好:全部的n個關鍵字都散列到同一個槽中,從而產生出一個長度爲n的鏈表。這時,最壞狀況下查找的時間爲O(n),再加上計算散列函數的時間,這麼一來就和用一個鏈表來連接全部的元素差很少了。顯然咱們並非由於散列表的最壞狀況性能差才用它的。性能

散列方法的平均性態依賴於所選取的散列函數h在通常狀況下,將全部的關鍵字分佈在m個槽位上的均勻程度。這會兒咱們先假定任何元素散列到m個槽中每個的可能性是相同的,且與其餘元素已被散列到什麼位置上是獨立無關的。稱這個假設爲簡單一致散列。spa

對於j=0,1,...,m-1,列表T[j](每一個槽位對應的鏈表)的長度用nj表示,這樣有:指針

nj的平均值爲E[nj]=α=n/m。blog

假定能夠在O(1)時間內計算出散列值h(k)(數組下標),從而查找具備關鍵字爲k的元素的時間線性地依賴於表T[h(k)]的長度nh(k)。先不考慮計算散列函數和尋址槽h(k)的O(1)時間,咱們來看看查找算法指望查找的元素數,即爲比較元素的關鍵字是否爲k而檢查的表T[h(k)]中的元素數。分兩種狀況來考慮。在第一種狀況中,查找不成功:表中沒有一個元素的關鍵字爲k。在第二種狀況中,查找成功地找到關鍵字爲k的元素。數學

定理11.1 對一個用連接技術來解決碰撞的散列表,在簡單一致散列的假設下,一次不成功查找的指望時間爲O(1+α)。變量

證實:在簡單一致散列的假設下,任何還沒有被存儲在表中的關鍵字k都是等可能地被散列到m個槽的任一個之中。於是,當查找一個關鍵字k時,在不成功的狀況下,查找的指望時間就是查找至鏈表T[h(k)]末尾的指望時間,這一時間的指望長度爲E[nh(k)]=α。因而,一次不成功的查找平均要檢查α個元素,所需的總時間(包括計算h(k)的時間)爲O(1+α)。
方法

對於成功的查找來講,狀況略有不一樣,這是由於每一個鏈表並非等可能地被查找到的。某個鏈表被查找到的機率與它所包含的元素數成正比。然而,指望的查找時間仍然是O(1+α)。

定理11.2 在簡單一致散列的假設下,對於用連接技術解決碰撞的散列表,平均狀況下一次成功的查找須要O(1+α)時間。

證實:假設要查找的關鍵字是表中存放的n個關鍵字中任何一個的可能性是相同的。在對元素x的一次成功的查找中,所檢查的元素數比x所在的鏈表中,出如今x前面的元素數多1。在該鏈表中,出如今x以前的元素都是在x以後插入的,這是由於新的元素都是在表頭插入的。爲了肯定所查找元素的指望數目,對x所在的鏈表中,在x以後插入到表中的指望元素數加1,再對錶中的n個元素x取平均。設x表示插入到表中的第i 個元素,i=1,2,...,n,並設ki=key[xi]。對關鍵字ki和kj,定義指示器隨機變量Xij=I{h(ki)=h(kj)}。在簡單一致散列的假設下,有Pr{h(ki)=h(kj)}=1/m,從而根據引理5.1,有E[Xij]=1/m。因而,在一次成功的查找中,所檢查元素的指望數目爲

這裏有幾點注意

1.根據離散數學,計算一個算法在平均狀態下的計算複雜性,能夠轉變成計算一個隨機變量的指望值。設一個實驗的樣本空間是可能輸入aj(j=1,2,...,n)的集合,且令隨機變量X對a賦值是a做爲輸入時該算法用到的操做次數。基於咱們對輸入的瞭解,對每一個可能的輸入a賦給一個機率p(aj)。那麼該算法在平均狀態下的複雜性是

2.根據證實的第一句可知每一個可能的輸入的機率爲1/n。也就是說x等於表中第i 個元素的機率是1/n。

3.指示器隨機變量Xij=I{h(ki)=h(kj)}的含義是若是i 和j 散列在同一個槽位當中,也就是在同一個鏈表中時,加1次。

所以,綜上所述,在x以後插入到表中的所檢查元素的總數目爲:

算法在平均狀態下的所檢查元素的總數目爲:

最後再計算這個式子的指望值就能得出所檢查元素的指望數目。因而,一次成功的查找所需的所有時間(包括計算散列函數的時間)爲O(2+α/2-α/2n)=O(1+α)。

相關文章
相關標籤/搜索