1. 程式人生 > >20172319 2018.10.19《Java程式設計教程》第7周課堂實踐(補寫部落格)

20172319 2018.10.19《Java程式設計教程》第7周課堂實踐(補寫部落格)

20172319 2018.10.19 《Java程式設計教程》第7周課堂實踐

  • 課程:《程式設計與資料結構》
  • 班級:1723
  • 學生:唐才銘
  • 學號:20172319
  • 指導老師:王志強
  • 日期:2018.10.19
  • 必修/選修:必修

目錄


測試內容

  • 三種查詢演算法練習:
  • 給定關鍵字序列:11,78,10,1,3,2,4,21,試分別用順序查詢折半查詢雜湊查詢 (用線性探查法和鏈地址法)來實現查詢。試畫出它們的對應儲存形式(順序查詢的順序表,二分查詢的順序表,兩種雜湊查詢的散列表),並求出每一種查詢的成功平均查詢長度。其中,雜湊函式H(k) = k%11。
    (本次作業6分,每種演算法2分,包括畫出儲存形式和ASL的計算。)

測試要求

  • 完成藍墨雲班課上的三種查詢演算法練習任務;並截圖(類程式碼,測試程式碼,執行結果程式碼)傳送至藍墨雲

  • 返回目錄


實驗步驟

需求分析

  1. 需要了解、掌握與三種查詢相關的知識。
  2. 需要了解、掌握雜湊查詢在發生衝突時的解決方法。
  3. 瞭解ASL是什麼?

相關知識

  • 順序查詢折半查詢ASL 此前在第五週學習總結第6周課堂實踐中闡述過,這裡不再做多餘的敘述。

    雜湊查詢:

  • 雜湊表(Hash table,也叫散列表),根據關鍵碼值(Key value)而直接進行訪問的資料結構。即通過將關鍵碼值對映到表中的一個位置來訪問記錄,以加快查詢的速度。
    。 對映函式稱為雜湊函式 , 存放記錄的陣列稱為 散列表
  • 例如:
  • 雜湊函式為:H(key)= key mod p (p = 11)
  • 對於元素: 17,21,41,38,25。
  • 可通過雜湊函式來確定其在表中的位置,如對於元素25,H(25)= 25%11 = 3,即其在表中處於第3位。
  • 索引 0 1 2 3 4 5 6 7 8 9 10 11 12
    元素 25 38 17 41 21
  • 而有些時候會發生這樣一種情況:H(key1)= H(key2),key1≠key2。
  • 即在表中發生了衝突 ,這是不可避免的。
  • 介紹幾個與其相關的因素:
  • 裝填因子(Loading Factor):設散列表空間大小為m,填入表中元素個數是n,則稱a=n/m為散列表的填裝因子,一般情況下0.6<a<0.9為宜,a越大越有可能發生衝突。
  • p:一般為素數,設散列表空間大小為n,則1.1n<p<1.7n為宜,這樣可以儘可能避免發生衝突。

    處理衝突的幾種方法

  • 舉例:在長度為12的雜湊表中已填有關鍵字分別為17,60,29的記錄,(雜湊函式H(key)= key MOD 11),現有第四個記錄,其關鍵字為38,由雜湊函式得到雜湊地址為5,發生衝突。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 60 17 29

開發地址法:給元素換個位置。

  • 一旦產生衝突(該地址已有其他元素),就按照某種規則去尋找另一個空地址。
  • 若發生了第i 次衝突,試探的下一個地址將增加d
  • h (key) = (h(key)+ d ) mod TableSize (1< i < TableSize )
  • d 決定了不同的解決衝突方案:

    線性探測法:
  • d = i
  • 以增量序列1,2,3 …… (TableSize - 1)迴圈試探下一個儲存地址。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 60 17 29 38
    二次探測法:
  • d = i 2
  • 以增量序列1 2 ,-1 2 ,2 2,-2 2 ,3 2 ,-3 2 …… q 2 ,-q 2 迴圈試探下一個儲存地址;q≦【TableSize/2】。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 38 60 17 29
    偽隨機探測再雜湊:
  • d = 偽隨機數序列
  • 以偽隨機數序列迴圈試探下一個儲存地址。
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 38 60 17 29

鏈地址法:

  • 開發地址法利用的是表中的剩餘空間,如果空間不足,那其將無法處理衝突也無法插入資料,因此此刻需要裝填因子≧1。
  • 原理:遇到衝突時,會在原地址新建一個空間,然後以連結串列節點的形式插入到該空間裡。

  • 索引 元素
    0
    1
    2
    3
    4
    5 60 38
    6 17
    7 29
    8
    9
    10
  • 返回目錄


實現及解釋

  • 關鍵字序列:11,78,10,1,3,2,4,21。
  • 雜湊函式: H(k) = k%11。

    線性查詢:

  • 索引 0 1 2 3 4 5 6 7
    元素 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

    折半查詢:

  • 索引 0 1 2 3 4 5 6 7
    元素 11 78 10 1 3 2 4 21
  • 索引 0 1 2 3 4 5 6 7
    元素 1 2 3 4 10 11 21 78
    查詢次數 3 2 3 1 3 2 3 4
  • 因為所查詢的元素為偶數,所以中值元素為4或10,無論是4還是10,不影響查詢的結果。
  • 這裡把4當成中值,判定樹如下:
  • ASL = (1x1 + 2x2 + 4x3 + 1x4) / 8 = 2.625

雜湊查詢:

  • 開發地址法:
  • 索引 0 1 2 3 4 5 6 7 8 9 10
    元素 11 78 1 3 2 4 21 10
    查詢次數 1 1 2 1 3 2 8 1
  • ASL = (1 + 1 + 2 + 1 + 3 + 2 + 8 + 1 ) / 8 = 2.375

  • 鏈地址法:

  • 查詢次數(頭) 查詢次數(節點) 索引 元素
    1 0 11
    1 2 1 78 1
    1 2 2
    1 3 3
    1 4 4
    5
    6
    7
    8
    9
    1 2 10 10 21
  • ASL = (6x1 + 2x2)/8 = 1.25

  • 返回目錄


錯誤分析

已提交至藍墨雲上的錯誤:

  1. 除餘錯誤:21%11=9.。。。٩(º﹃º٩)
  2. 索引標識錯誤。
  3. 查詢錯誤:在開發地址中先放置好相應元素,再對有衝突元素進行處理;如當11、78、10處在了其相應位置後,對衝突元素1不做處理,直接放3,接著對衝突元素2不做處理,直接放4.

參考資料