20172301 2018-2019-1 《程序設計與數據結構》課堂測試(三種查找方法的練習)報告

20172301 2018-2019-1 《程序設計與數據結構》課堂測試(三種查找方法的練習)報告

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

1.測試內容

  • 給定關鍵字序列11,78,10,1,3,2,4,21試分別用順序查找、折半查找、散列查找(用線性探查法和鏈地址法來實現查找)。試畫出他們對應的存儲形式(順序查找的順序表、折半查找的斷定樹、兩種散列查找的散列表),並求出每一種查找的平均查找長度,其中的散列函數H(k) = k % 11

2. 測試過程及結果

  • 設計思路:

    • 針對三種不一樣的查找方法,實現不一樣查找順序和次數的序列查找,描繪出對應的存儲形式和進行平均查找長度的計算。
    • 平均查找長度:爲肯定記錄在查找表中的位置,需和給定值進行比較的關鍵字個數的指望值稱爲查找算法在查找成功時的平均查找長度,ASL()
    • 散列查找的衝突:以序列元素的關鍵字K爲自變量,經過函數H(k)計算出該元素的存儲位置,在不一樣的序列元素計算出相同的存儲位置,致使多個不一樣序列元素存放在同一個存儲位置。
  • 步驟:

  • 順序查找--從列表頭開始依次比較每個值,直至找到該目標,結果是要麼找到目標,要麼到達列表尾並得出該組中不存在該目標的結論。
    • 將序列內容存入列表中,而後從頭開始進行遍歷式查找來肯定查找元素。
    • 結果圖片:
  • 折半查找--從排序列表的中間開始查找,若是中間元素不是目標元素,則繼續取半搜索。重複以前的操做,將取半長度的中間開始查找,在每一次查找操做後,將排除剩餘待搜索的一半數據。
    • 將序列內容進行排序,而後按大小存入列表中,開始取中間查找,並在每次查找中排除一半查找長度。
    • 結果圖片:
  • 散列查找--在進行查找時,在記錄的存儲位置與它的關鍵字之間創建一個肯定的對應關係,以線性表中每一個元素的關鍵字K爲自變量,經過函數H(k)計算出該元素的存儲位置,函數H(k)即哈希函數(散列函數),。這種查找方法稱爲散列查找。
    • 經過哈希函數運算出的關鍵字序列的存儲位置:
    • 結果圖片(線性探查)錯誤位置

      java

      • 錯誤分析:忘記線性探測再散列的增量序列是在總體的尾部仍是在取餘前,因此按照在總體的尾部進行計算致使算錯。
      • 線性探測再散列課堂講解PPT圖片:
    • 結果圖片(鏈式探查):
      算法

散列查找發生衝突的解決方案

  • 開放地址法--線性探測再散列、二次探測再散列、僞隨機探測再散列
  • 鏈地址法
    • 鏈地址法的優勢數據結構

      • (1)鏈地址法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,所以平均查找長度較短;
      • (2)因爲鏈地址法中各鏈表上的結點空間是動態申請的,故它更適合於造表前沒法肯定表長的狀況;
      • (3)開放定址法爲減小衝突,要求裝填因子α較小,故當結點規模較大時會浪費不少空間。而鏈地址法中可取α≥1,且結點較大時,鏈地址法中增長的指針域可忽略不計,所以節省空間;
      • (4)在用鏈地址法構造的散列表中,刪除結點的操做易於實現。只要簡單地刪去鏈表上相應的結點便可。而對開放地址法構造的散列表,刪除結點不能簡單地將被刪結點的空間置爲空,不然將截斷在它以後填人散列表的同義詞結點的查找路徑。這是由於各類開放地址法中,空地址單元(即開放地址)都是查找失敗的條件。所以在用開放地址法處理衝突的散列表上執行刪除操做,只能在被刪結點上作刪除標記,而不能真正刪除結點。
    • 鏈地址法的缺點函數

      • 指針須要額外的空間,故當結點規模較小時,開放定址法較爲節省空間,而若將節省的指針空間用來擴大散列表的規模,可以使裝填因子變小,這又減小了開放定址法中的衝突,從而提升平均查找速度。
  • 平方探測法

其餘(感悟、思考等)

上課沒有好好記筆記,跟住老師的步伐,致使最後忘記公式的內容,進行算錯補寫博客的。測試

參考資料

相關文章
相關標籤/搜索