1. 程式人生 > >20172309_《程式設計與資料結構(下)》_課堂測試修改報告。

20172309_《程式設計與資料結構(下)》_課堂測試修改報告。

20172309_《程式設計與資料結構(下)》_課堂測試修改報告。

課程:《程式設計與資料結構》

班級:1723

姓名: 王志偉

學號:20172309

實驗教師:王志強老師

實驗日期:2018年6月13日

必修/選修: 必修

實驗內容:

  • 查詢演算法綜合示例:

實驗過程及結果

  • 畫出順序查詢的查詢順序表及成功查詢平均長度
    • 順序表:
序列 11 78 10 1 3 2 4 21
查詢次數 1 2 3 4 5 6 7 8
  • 平均查詢長度:
    ASL=(1+2+3+4+5+6+7+8)/8=4.5
  • 畫出折半查詢的判定樹並計算出平均查詢長度:
    • 首先注意:進行二分查詢的必須是有序結構。 所以先排序: 1 2 3 4 10 11 21 78。
    • 其次注意取中間值時:mid = (star+end)/2 取值定義為不超過mid的最大整數。
    • 判定樹:(注:第一行說明在第一次就查詢到了。第二行說明在第二次找到了。以此類推···)
    • 平均查詢長度:
    ASL=(1*1+2*2+3*4+4*1)/8=2.625 
  • 畫出雜湊查詢(線性探查法)的散列表和成功平均查詢長度
    • 首先求出散列表的大小m:m一般取要排序數字的個數n的1.1~1.7倍,即1.1n<=m<=1.7n
    • 然後對每個元素分別求模:
元素 11 78 10 1 3 2 4 21
H(key)=key%m 0 1 10 1 3 2 4 10
  • 然後根據求得的mod,把元素插進去:
序列 0 1 2 3 4 5 6 7 8 9 10
查詢次數 11 78 1 3 2 4 21 10
  • 這裡需要注意的是:
  1. 當插入元素1時,求得的模等於1.但是所在的位置已經有元素了,所以我們運用的方法是:H(key)=(key+1)%m,然後判斷此處所求的模的位置否有元素,如果有,則重複此操作;如果沒有,元素將被放在這。
  2. 當被插入的位置是最後一個但此處位置已經有元素時(比如插入元素21時),此時10的位置後面沒有位置!因此我們將元素從頭開始放,直至有位置。我的理解是將這個散列表看成一個環形陣列,然後後面沒位置時,從頭開始。
  • 平均查詢長度:
ASL=(1+1+1+2+1+3+2+8)/8=19/8=2.375

(注:括號中的次數分別對應著原列表中元素的順序。)

  • 用雜湊連結串列法儲存元素:

    這個平均查詢長度:
    ASL=(6*1 + 2*2)/8=5/4=1.25

實驗過程中出現的問題:

  • 問題一:第一種方案中,當在散列表中插入元素時,滿了怎麼辦?
  • 解決方案:當時想到這個問題感覺是這種儲存方式是錯的, 現在想起來是自己太傻太天真了。然後下課後吃飯的時候,想了想,散列表m取1.1n~1.7n,也就是說m永遠比元素個數n大,怎麼會裝不下呢?

  • 問題二:我當時是這麼做的

    也就是說,我當時把散列表大小建立成12個,這為什麼錯了呢?因為當我們把散列表大小建立成12時,相當於我們求的模為13了(從零開始數的)。

參考資料