20172319 2018.10.19《Java程式設計教程》第7周課堂實踐(補寫部落格)
阿新 • • 發佈:2018-11-09
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的計算。)
測試要求
完成藍墨雲班課上的三種查詢演算法練習任務;並截圖(類程式碼,測試程式碼,執行結果程式碼)傳送至藍墨雲
實驗步驟
需求分析
- 需要了解、掌握與三種查詢相關的知識。
- 需要了解、掌握雜湊查詢在發生衝突時的解決方法。
- 瞭解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
錯誤分析
已提交至藍墨雲上的錯誤:
- 除餘錯誤:21%11=9.。。。٩(º﹃º٩)
- 索引標識錯誤。
- 查詢錯誤:在開發地址中先放置好相應元素,再對有衝突元素進行處理;如當11、78、10處在了其相應位置後,對衝突元素1不做處理,直接放3,接著對衝突元素2不做處理,直接放4.