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。htm

    線性查找:

  • 索引 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. 查找錯誤:在開發地址中先放置好相應元素,再對有衝突元素進行處理;如當十一、7八、10處在了其相應位置後,對衝突元素1不作處理,直接放3,接着對衝突元素2不作處理,直接放4.

參考資料

相關文章
相關標籤/搜索