1. 程式人生 > >20172314 三種查詢演算法練習

20172314 三種查詢演算法練習

課程:《程式設計與資料結構》
班級: 1723
姓名: 方藝雯
學號: 20172314
實驗教師:王志強
測試日期:2018年10月19日
必修/選修: 必修

錯誤原因分析

  • 雜湊查詢不需要排序,而我是對排序之後的數求H(k)。
  • 雜湊查詢中ASL不會求。
  • 雜湊查詢中時間太緊急漏了一個數。

題目分析

常見的雜湊函式

  • 直接定址法

    取關鍵字的某個線性函式為雜湊地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B為常數。

  • 除留餘數法

    設散列表中允許的地址數為m,取一個不大於m,但接近或者等於m的質數p作為除數,按照雜湊函式:Hash(key) = key % p ,即對p取餘數。

  • 平方取中法

    假設關鍵字是1234,那麼它的平方就是1522756,再抽取中間的3位就是227作為雜湊地址;再比如關鍵字是4321,那麼它的平方就是18671041,抽取中間的3位就可以是671或者710用作雜湊地址。

  • 摺疊法

    摺疊法是將關鍵字從左到右分割成位數相等的幾部分(注意:後一部分位數不夠時可以短些),然後將這幾部分疊加求和,並按散列表表長,取後幾位作為雜湊地址。比 如:關鍵字是9876543210,散列表表長為三位,我們將它分成四組987|654|321|0|,然後將它們疊加求987+654+321+0=1962,再求後3位得到雜湊地址為962。有時可能 這還不能夠保證分佈均勻,不妨從一段向另一端來回摺疊後對齊相加。比如將987和321反轉,再與654和0相加,程式設計789+654+123+0=1566,此時的雜湊地址為566。

  • 隨機數法

    選擇一個隨機函式,取關鍵字的隨機函式值為它的雜湊地址,即H(key) = random(key),其中 random為隨機數函式。

  • 數學分析法

    分析一組資料,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成雜湊地址,則衝突的機率會明顯降低。因此數字分析法就是找出數字的規律,儘可能利用這些資料來構造衝突機率較低的雜湊地址。

處理衝突

  • 一旦發生衝突,就去尋找下 一個空的散列表地址,只要散列表足夠大,空的雜湊地址總能找到。
  • 線性探查法
    • 對給出的一組數用雜湊函式計算得到位置,遇到衝突時,檢視緊隨其後的下一個,如還是衝突,繼續,直到找到空位。
    • 對於ASL,它是指插入元素時的比較次數。
  • 二次探查法
    • 在遇到衝突時, 使用函式Hi = (H0 + i^2)%m, Hi = (H0 - i^2)%m, i = 1,2,3…來查詢空位,而不是檢視緊隨其後的下一個。
  • 連結地址法
    • 同以上的區別就是,在遇到衝突時,排在同一位置的下一個元素,形成一個單鏈表。

錯題修改

具體解題步驟如圖:

感悟

上課聽得不仔細,沒有分清楚這幾種方法,但現在對錯誤的認識很明晰,補部落格也是非常有用的!