哈希表原理
| ?設想一下,你有一個包含約一千條記錄的數據文件,比如一個小企業的客戶記錄,還有一個程序,它把記錄讀到內存中進行處理。每個記錄包含一個唯一的五位數的客戶ID號、客戶名字、地址、帳戶結余等等。假設記錄不是按客戶ID號順序分類的,所以,如果程序要將客戶ID號作為“key”?來查找一個特殊的客戶記錄,唯一的查找方法就是連續地搜索每個記錄。有時侯,它會很快找到你需要的記錄;但有時侯,在程序找到你需要的記錄前,它幾乎已搜索到了最后一條記錄。如果要在1,000條記錄中搜索,那么查找任何一條記錄都需要程序平均查核500.5?((1000?+?1?)/2)條記錄。如果你常需要查找數據,你應該需要一個更快的方法來找到一條記錄。 |
????????一種加快搜索的方法就是把記錄分成幾段,這樣,你就不用搜索一個很大的列表了,而是搜索幾個短的列表。對于我們數字式的客戶ID號,你可以建10個列表,以0開頭的ID號組成一個列表,以1開頭的ID號組成一個列表,依此類推。那么要查找客戶ID號38016,你只需要搜索以3開頭的列表就行了。如果有1,000條記錄,每個列表的平均長度為100(1,000條記錄被分成10個列表),那么搜索一條記錄的平均比較次數就降到了約50。?
當然,如果約十分之一的客戶號是以0開頭的,另外十分之一是以1開頭的,等等,那么這種方法會很適合。如果90%的客戶號以0開頭,那么那個列表就會有900條記錄,每次查找平均需要進行450次比較。另外,程序需要執行的搜索有90%都是針對以0開頭的號碼的。因此,平均比較數就大大超過簡單數學運算的范圍了。?
???如果我們可以按這樣一種方式在我們的列表中分配記錄,情況就會好一些,即每個列表約有相同條目的記錄,而不管鍵值中數字的分布。我們需要一種方法能夠把客戶號碼混合到一起并更好地分布結果。例如,我們可以取號碼中的每位數,乘以某個大的數(隨著數字位置的不同而不同),?然后將結果相加產生一個總數,把這個數除以10,并將余數作為索引值(index)(除數相同的分到一組)。當讀入記錄時,程序在客戶號碼上運行這個哈希(hash)?函數來確定記錄屬于哪個列表。當用戶需要查詢時,將同一個哈希函數作為一個“key”用于客戶號碼,這樣就可以搜索正確的列表了。?像這樣的一個數據結構就稱為一個哈希表(hashtable)。?
總結
- 上一篇: 转:初学者简易 .vimrc编写指南
- 下一篇: Fedora17 开启ssh服务