20172314 三種查找算法練習

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

錯誤緣由分析

  • 散列查找不須要排序,而我是對排序以後的數求H(k)。
  • 散列查找中ASL不會求。
  • 散列查找中時間太緊急漏了一個數。

題目分析

常見的哈希函數

  • 直接定址法數據結構

    取關鍵字的某個線性函數爲散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B爲常數。dom

  • 除留餘數法函數

    設散列表中容許的地址數爲m,取一個不大於m,但接近或者等於m的質數p做爲除數,按照哈希函數:Hash(key) = key % p ,即對p取餘數。測試

  • 平方取中法設計

    假設關鍵字是1234,那麼它的平方就是1522756,再抽取中間的3位就是227做爲散列地址;再好比關鍵字是4321,那麼它的平方就是18671041,抽取中間的3位就能夠是671或者710用做散列地址。blog

  • 摺疊法排序

    摺疊法是將關鍵字從左到右分割成位數相等的幾部分(注意:後一部分位數不夠時能夠短些),而後將這幾部分疊加求和,並按散列表表長,取後幾位做爲散列地址。比 如:關鍵字是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…來查找空位,而不是查看緊隨其後的下一個。
  • 連接地址法
    • 同以上的區別就是,在遇到衝突時,排在同一位置的下一個元素,造成一個單鏈表。

錯題修改

具體解題步驟如圖:

感悟

上課聽得不仔細,沒有分清楚這幾種方法,但如今對錯誤的認識很明晰,補博客也是很是有用的!

相關文章
相關標籤/搜索