1. 程式人生 > >20172328 藍墨雲實驗——三種查詢演算法練習

20172328 藍墨雲實驗——三種查詢演算法練習

20172328 藍墨雲實驗——三種查詢演算法練習

  • 課程:《軟體結構與資料結構》
  • 班級: 1723
  • 姓名: 李馨雨
  • 學號:20172328
  • 實驗教師:王志強老師
  • 實驗日期:2018年10月19日
  • 必修選修: 必修

一、實驗要求學習內容

  • 查詢的關鍵:比較
  • 用平均比較次數來評估演算法的優劣,稱為平均查詢長度(ASL)
  • ASL = ∑ p(i)c(i)(i=1,2,3,…,n)
    • 其中P(i)為查詢表中第i個數據元素的概率,C(i)為找到第i個數據元素時已經比較過的次數.
    • 在查詢表中查詢不到待查元素,但是找到待查元素應該在表中存在的位置的平均查詢次數稱為查詢不成功時的平均查詢長度
  • 線性查詢演算法的ASL:如果每個關鍵字查詢概率相同,則ASL = (n+1)/2;時間複雜度為O(n)
  • 二分(折半)查詢演算法的ASL:如圖所示,時間複雜度為O(log2(n))

  • 分塊(索引順序)演算法的ASL:因為分塊查詢是先折半查詢再線性查詢,故假設序列分成了n塊,每塊k個元素,那麼ASL = LB + LA
    那麼ASL = (1+n)/2 + (1+k)/2
  • 雜湊表ASL:雜湊表(Hash Table)也叫散列表,是依據關鍵碼值(Key Value)而直接進行訪問的資料結構。它通過把關鍵碼值對映到雜湊表中的一個位置來訪問記錄,以加快查詢的速度。這個對映函式就做雜湊函式。存放記錄的陣列叫做散列表。
  • 查詢技術一般基於待查關鍵字和資料項關鍵字的比較,基於關鍵字的比較,其時間複雜度為O(log2(n)~O(n),而雜湊表查詢可以直接通過關鍵字找到儲存地址,使得查詢時間可以是常數級。
  • 雜湊表儲存的是鍵值對,其查詢的時間複雜度與元素數量多少無關。雜湊表在查詢元素時是通過計算雜湊碼值來定位元素的位置從而直接訪問元素的,因此,雜湊表查詢的時間複雜度為O(1)。

  • 雜湊衝突的處理方法

1、開放定址法——線性探測法

線性探測法的地址增量di = 1, 2, ... , m-1,當中,i為探測次數。該方法一次探測下一個地址。知道有空的地址後插入。若整個空間都找不到空餘的地址,則產生溢位。

線性探測法容易產生“衝突”現象。當表中的第i、i+1、i+2的位置上已經儲存某些keyword,則下一次雜湊地址為i、i+1、i+2、i+3的keyword都將企圖填入到i+3的位置上,這樣的多個雜湊地址不同的keyword爭奪同一個後繼雜湊地址的現象稱為“衝突”。

2、開放地址法——二次探測法

二次探測法的地址增量序列為 di = 12, -12, 22。 -22,… 。 q2, -q2 (q <= m/2)。二次探測能有效避免“聚集”現象,可是不可以探測到雜湊表上全部的儲存單元,可是至少可以探測到一半。

3、鏈地址法——拉鍊法

其基本思路是:將全部具有同樣雜湊地址的而不同keyword的資料元素連線到同一個單鏈表中。假設選定的雜湊表長度為m,則可將雜湊表定義為一個有m個頭指標組成的指標陣列T[0..m-1]。凡是雜湊地址為i的資料元素,均以節點的形式插入到T[i]為頭指標的單鏈表中。而且新的元素插入到連結串列的前端,這不僅由於方便。還由於常常發生這種事實:新近插入的元素最優可能不久又被訪問。

鏈地址法特點:

(1)拉鍊法處理衝突簡單。且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
(2)因為拉鍊法中各連結串列上的結點空間是動態申請的。故它更適合於造表前無法確定表長的情況。
(3)開放定址法為降低衝突。要求裝填因子α較小。故當結點規模較大時會浪費非常多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中新增的指標域可忽略不計,因此節省空間;
(4)在用拉鍊法構造的散列表中,刪除結點的操作易於實現。僅僅要簡單地刪去連結串列上對應的結點就可以。而對開放地址法構造的散列表,刪除結點不能簡單地將被刪結點的空間置為空,否則將截斷在它之後填人散列表的同義詞結點的查詢路徑。這是由於各種開放地址法中,空地址單元(即開放地址)都是查詢失敗的條件。

因此在用開放地址法處理衝突的散列表上執行刪除操作。僅僅能在被刪結點上做刪除標記,而不能真正刪除結點。

四、雜湊表的裝填因子α

裝填因子(α) = (雜湊表中的記錄數) / (雜湊表的長度)

裝填因子是雜湊表裝滿程度的標記因子。值越大。填入表中的資料元素越多,產生衝突的可能性越大。

二、實驗題目及解答過程

給定關鍵字序列11,78,10,1,3,2,4,21,試分別用順序查詢、折半查詢、雜湊查詢(用線性探查法和鏈地址法)來實現查詢。
請畫出他們的對應儲存形式(順序查詢的順序表和兩種雜湊查詢的散列表),並求出每一種查詢的成功平均查詢長度。其中,散列表H(k)= k%11

課堂上做的答案如圖所示:

需要改正的內容是線性探查法部分

  • 對於錯誤的理解:

關於這個問題,讓我對Hash表查詢有了更清楚的認識。

首先,我們是在記錄的儲存地址中查詢的,是要在儲存地址和關鍵字序列建立一個確定的對應關係,這樣通過一次存取就能得到所查元素的查詢方法

其次,衝突也是有順序的,當關鍵值序列一個一個往雜湊序列中放的時候,衝突要一個一個解決,而不是把能重複的拋在一遍,最後填完了所有出現的H(k)再去解決衝突。

其他(感悟、思考等)

第一次寫課堂錯誤改正部落格,感覺有點開心???哈哈,希望是最後一次啦!不過認識的更加深刻啦,也算是好事呀!

四、參考資料