專業開發雜湊競猜遊戲系統《定製》

VX_owlishy發表於2022-06-24

雜湊競猜遊戲系統開發  

基本概念

  雜湊表(Hash Table)是一種根據關鍵字直接訪問記憶體儲存位置的資料結構。(I3I-掂Z6o5-微8883電)通過雜湊表,數 據元素的存放位置和資料元素的關鍵字之間建立起某種對應關係,建立這種對應關係的函式稱為雜湊函式(如圖)。


  雜湊函式構造方法


  雜湊表的構造方法是:假設要儲存的資料元素個數為n,設定一個長度為m(m≥n)的連續儲存單元,分別以每個資料元素的


關鍵字為自變數,通過雜湊函式,把對映為記憶體單元的某個地址,並將該資料元素儲存在該記憶體單元中。


  從數學的角度來看,雜湊函式實際上是關鍵字到記憶體單元的對映,因此我們希望通過雜湊函式通過儘量簡單的運算使得通過


雜湊函式計算出的雜湊地址儘量均勻地被對映到一系列的記憶體單元中。構造雜湊函式有三個要點:第一,運算過程要儘量簡單高


效,以提高雜湊表的插入和檢索效率;第二,雜湊函式應該具有較好的雜湊性,以降低雜湊衝突的概率;第三,雜湊函式應具有


較大的壓縮性,以節省記憶體。一般有以下幾種常見的方法:


  直接定址法,該方法是曲關鍵字的某個線性函式值為雜湊地址。可以簡單的表示為:,優點是不會產生衝突,但缺點空間復


雜度可能會很高,適用於元素較少的情況下;


  除留餘數法,它是用資料元素關鍵字除以某個常數所得的餘數作為雜湊地址,該方法計算簡單,適用範圍廣,是最經常使用


的一種雜湊函式,可以表示為:,該方法的關鍵是常數的選取,一般要求是接近或等於雜湊表本身的長度,理論研究表明,該常


數取素數時效果最好。


  數字分析法:該方法是取資料元素關鍵字中某些取值較均勻的數字位來作為雜湊地址的方法,這樣可以儘量避免衝突,但是


該方法只適合於所有關鍵字已知的情況。對於想要設計出更加通用的雜湊表並不適用。


  雜湊衝突解決辦法


  在構造雜湊表時,存在這樣的問題,對於兩個不同的關鍵字,通過我們的雜湊函式計算雜湊地址時卻得到了相同的雜湊地址


,我們將這種現象稱為雜湊衝突(如圖):


  雜湊衝突主要與兩個因素相關:第一,填裝因子,所謂的填裝因子是指雜湊表中已存入的資料元素個數與雜湊地址空間大小


的比值,即α=n/m,α越小,衝突的可能性就越小,相反則衝突可能性越大;但是α越小,雜湊表的儲存空間利用率也就很低,


α越大,儲存空間的利用率也就越高,為了兼顧雜湊衝突和儲存空間利用率,通常將α控制在0.6-0.9之間,而.NET中的


Hashtable則直接將α的最大值定義為0.72(注:雖然微軟官方MSDN中宣告Hashtable預設填裝因子為1.0,事實上所有的填裝因子


都為0.72的倍數);第二,與所用的雜湊函式有關,如果雜湊函式選擇得當,就可以使雜湊地址儘可能的均勻分佈在雜湊地址空


間上,從而減少衝突的產生,但一個良好的雜湊函式的得來很大程度上取決於大量的實踐,不過幸好前人已經總結實踐了很多高


效的雜湊函式,可以參考園子裡大牛Lucifer的文章:資料結構:Hash Table<I>。


  雜湊衝突通常是很難避免的,解決雜湊衝突有很多種方法,通常分為兩大類:


  開放定址法,它是一類以發生雜湊衝突的雜湊地址為自變數,通過某種雜湊函式得到一個新的空閒記憶體單元地址的方法(如


圖),開放定址法的雜湊衝突函式通常是一組;


  連結串列法,當未發生衝突時,則直接存放該資料元素;當衝突產生時,把產生衝突的資料元素另外存放在單連結串列中。


  Hashtable和Dictionary


  .NET中實現了雜湊表的類分別是Hashtable和Dictionary<TKey,TValue>,Hashtable由包含集合元素的儲存桶組成,存


儲桶是Hashtable中各元素的虛擬子組,與大多數集合中進行的搜尋相比,儲存桶可使搜尋更為便捷。Dictionary則是泛型版本的


雜湊表,與Hashtable的功能相同,對於值型別,特定型別(不包括Object)的效能優先於Hashtable,這是因為Hashtable的元素


屬於Object型別,所以在儲存或者檢索型別時通常發生裝箱和拆箱操作;除此之外,雖然微軟宣稱Hashtable是執行緒安全的,可以


允許多個讀執行緒或一個寫執行緒訪問,但是事實是它也並非執行緒安全,在.NET Framework 2.0新引入的Dictionary仍舊為解決這個


問題,其中限於公共靜態方法是執行緒安全的,因此可以說Dictionary是非執行緒安全的,而且對整個集合的列舉過程對二者而言都


不是執行緒安全的,因為當出現列舉與寫訪問互相爭用這種情況發生時,則必須在整個列舉過程中對整個集合加鎖。如果我們在使


用.NET Framework 4.0以上版本,我們可以使用執行緒安全的ConcurrentDictionary;另一個比較重要的區別在於,雖然它們都實


現了雜湊表,但是二者卻使用了完全不同的雜湊衝突解決方法,Hashtable解決衝突的方式是開放定址法,而Dictionary則採用了


連結串列法。


  Hashtable的實現原理


  Hashtable類中雜湊函式的定義可以用如下遞推公式來表示:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016749/viewspace-2902672/,如需轉載,請註明出處,否則將追究法律責任。

相關文章