1. 程式人生 > >OPEN雜湊表實現單詞本

OPEN雜湊表實現單詞本

一、演算法思想

雜湊表是根據關鍵碼值而直接進行訪問的資料結構,也就是說它可以通過對關鍵字進行某種函式對映直接找到其對應的表中的位置,這個對映函式叫做雜湊函式。

由於雜湊表中不需要比較即可找到所需元素,能夠極大節省查詢所需時間,但雜湊表中在儲存的時候可能會出現不同關鍵字通過函式對映卻對應雜湊表中同一位置的情況,這種情況我們稱之為衝突。人們對此提出了兩種解決方法,開放定址法(OpenAddressHash)和封閉定址法(CloseAddressHash),此次作業主要應用開放定址法來解決衝突。

開放定址法即如果一個元素的Hash地址對應的Hash單元已被另一個元素佔有(衝突),我們需定義一個候選地址序列,每當發生衝突時,就選擇下一個地址去試探,迴圈重複此過程。

二、設計思路

由於在題目中已經給出要儲存的資料大小和型別,因此首先最重要的應該是確定合適的雜湊表容量。效率較高的雜湊表資料容量一般為待存資料量的2倍,且為素數。因為本作業要求儲存1000個單詞,所以選擇雜湊表容量大小為2729 其次要確定合適的雜湊函式,根據題目確定了關鍵字為單詞的前三個字母,此函式同時要較好地適應雜湊表大小,因此最終決定採用編碼方式,即先計算首字母的ASCI碼值*26*26、次字母的ASCI碼值*26、再次字母的ASCI碼值的總和,再用此總和對雜湊表大小(即2729)取模。最終能夠達到較好的存取效率。

三、程式程式碼




四、測試例

手工輸入了21個單詞作為測試,結果中將輸出單詞和該單詞在雜湊表中的位置。


五、執行結果

結果中顯示出單詞以及該單詞在雜湊表中所在位置。


六、分析

本作業中對於雜湊函式的設計主要受到了二進位制編碼方式的啟發,對於關鍵字,即單詞中三個字母的選擇是有關於雜湊表大小的考慮,如果關鍵字定義為兩個字母,按編碼方式所需要的最大的地址空間為26*26+26=702,小於雜湊表的資料容量大小。而選擇三個字母時,按該編碼方式所需要的最大的地址空間為26*26*26+26*26+26=18278,大於雜湊表的資料容量大小,最終只需要再將其取模變成適合雜湊表大小即可。

本作業中最大的問題在於單詞輸入時需要手工輸入,費時費力,如果能夠改寫為從文字中讀取,將節省很多人工輸入單詞的時間。