20172323 2018-2019-1 《程序設計與數據結構》課堂測試報告

20172323 2018-2019-1 《程序設計與數據結構》課堂測試報告

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

1.測試內容

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

2.測試過程及結果

  • 線性查找:從列表頭開始比較查找每個元素,要麼找到該元素,要麼抵達列表尾得出沒有該元素的結論
  • 解題:將序列內元素裝入順序表中,從頭挨個查找
  • 如圖:

  • 折半查找:從排序列表的中間開始查找,若是中間元素不是目標元素,根據兩個元素的大小關係,再判斷從列表的前一半或是後一半進行查找。每次的查找都是從當前一串數字的中間元素開始的。直到最後找到該元素或是沒有找到拋出一個信息。若是中間元素是偶數個,則選擇前一個元素爲中間元素。
  • 解題:首先將序列元素進行從小到大的排序,從中間元素進行查找
  • 如圖

  • 散列查找(線性探查法)
  • 基本思想:在記錄的存儲地址和它的關鍵字之間創建一個肯定的對應關係;這樣,不通過比較,一次存取就能獲得所查元素的查找方法。
  • 線性探查:線性探查法的地址增量di = 1, 2, ... , m-1,其中,i爲探測次數。該方法一次探測下一個地址,知道有空的地址後插入,若整個空間都找不到空餘的地址,則產生溢出。
  • 解題:由於散列函數H(K) = K % 11,因此經過哈希函數運算得出關鍵字序列的存儲位置。

1.首先在0索引處添加序列元素11
數據結構

2.在1索引處添加序列元素78
函數

3.在10索引處添加序列元素10
測試

4.在1索引處添加序列元素1,但由於1索引處已經有了元素78,發生衝突,按照線性探查法,探測下一地址,若是爲空則插入,因此最終1添加到2索引處
.net

5.添加序列元素3到3索引處
設計

6.添加2到2索引處,2索引處不爲空日後移一位,3索引處依然不爲空,再日後移一位,最後添加到4索引處
指針

7.添加4到4索引處,發生衝突,日後移一位,添加到5索引處
blog

8.添加21到10索引處,不爲空,日後移一位到0索引處,注意不是添加一個11索引處,發生衝突則日後移,直到6索引處
排序

9.最終獲得哈希表,而查找每一個元素所須要的比較次數以下

10.ASL= (1 + 1 + 2 + 1 + 3 + 2 + 8 + 1 )/8 = 2.375
11.錯誤分析:當發生衝突時,從發生衝突的那個單元開始,按照必定的次序,從哈希表中找出一個空閒的存儲單元,把發生衝突的待插入關鍵字存儲到該單元中,從而解決衝突的發生。若是是在哈希表尾的存儲單元發生了衝突,則繼續從0索引處開始尋找空閒存儲單元,若是沒有找到空閒的存儲單元,則溢出,不能憑空生出一個新的索引處


  • 散列查找(鏈地址法)
  • 將全部相互發生衝突的同義詞(哈希地址相同的關鍵字)存儲在同一個單鏈表中。若干組同義詞能夠組成若干個單鏈表,可用一堆數組存放頭指針
  • 解題:

因此ASL= (1 x 6 + 2 x 2)/8 = 1.25

  • 鏈地址法的優勢:
    • 處理衝突簡單,且無堆積現象,所以平均查找長度短
    • 各鏈表上結點空間是動態的,適合造表前沒法肯定表長的狀況
    • 在用拉鍊法構造的散列表中,刪除結點的操做易於實現。
    • 開放定址法爲減小衝突,要求裝填因子α較小,故當結點規模較大時會浪費不少空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增長的指針域可忽略不計,所以節省空間

3.參考資料

相關文章
相關標籤/搜索