20172301 《程序設計與數據結構》課堂測試修改報告

20172301 《程序設計與數據結構》課堂測試修改報告

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

題目內容

測試過程及結果

  • 畫出順序查找的順序表和成功平均查找長度。
    • 順序查找的原理是遍歷列表,一一比較。因此查找次數就是逐漸加一的。
  • 畫出折半查找的順序表和成功平均查找長度。
    • 第一步,折半查找須要的是有序列表。 因此,須要對列表進行排序。
    • 序列 1 2 3 4 10 11 21 78
      查找次數 3 2 3 1 3 2 3 4
    • 注意:書P164 代碼
    int midpoint = (min + max) / 2;
    變量midpoint是int型而不是double型,意味着若是中點是3.5會自動轉化成3。 當咱們的查找項是偶數個的時候,中點多是兩個中間值的任意一個。可是根據上面的代碼,系統會選擇兩個中間值的第一個故,查找次數如表格所示。
  • 畫出散列查找(線性探查法)的散列表和成功平均查找長度
    • 第一步,咱們須要對序列進行取餘操做。這裏題目中給出m = 11;
    • 序列 11 78 10 1 3 2 4 21
      H(K) = K%11 0 1 10 1 3 2 4 10
    • 第二部,咱們把序列輸入相對應的地址中。
    • 地址 0 1 2 3 4 5 6 7 8 9 10
      序列 11 78 1 3 2 4 21 10
    • 雖然散列查找ASL是O(1),可是那是在無衝突的條件下。這裏咱們要考慮衝突下的查找次數。
  1. 畫出散列查找(鏈地址法)的散列表和成功平均查找長度

測試過程當中遇到的問題和解決過程

  • 問題1:散列表的線性探查法對於數組末尾衝突操做如何解決?
  • 問題1解決方案:
    • 首先,注意一點是,散列表是根據序列順序依次填入地址的 ,並不是是根據排序順序,這是我犯得錯誤一。
    • 而後,若是若是說地址末尾有衝突,那麼應該是Hi = (H(K) + di) % 11,那麼應該仍是從索引0開始日後進行填充,直到數組滿的時候,而不是申請新的空間,這是個人錯誤二。
    • 那麼,若是數組滿了怎麼辦?
    • 我想,這時不單單要擴容數組大小,同時應該擴大m的值。否則,序列一樣仍是在那個數組大小中循環。

其餘(感悟、思考等)

   對於散列查找中的線性探查法解決衝突的過程還不是特別熟悉。致使我對於數組末尾衝突的理解有問題。這只是一個細節,卻影響到整個ASL的計算。而且散列表並非按照序列順序填入的,致使序列地址也存在問題。這是之後應該注意的。web

參考資料

相關文章
相關標籤/搜索