1. 程式人生 > >為什麼使用了雜湊演算法的字典查集合找速度比全域性遍歷字典查集合速度快?

為什麼使用了雜湊演算法的字典查集合找速度比全域性遍歷字典查集合速度快?

我們都使用過字典,如英漢字典、成語字典,圖書的檢索目錄、電話簿等也可以看作廣義上的字典。在電腦科學中,把字典也當成一種資料結構。
我們把字典定義為“鍵- 值對” (Key-Value Pair) 的集合。根據不同的問題,我們為名字和值賦予不同的含義,比如,在英漢字典中,英文單詞是名字,此單詞的中文解釋條目是值;在電話簿中,人名是名字,此人名對應的電話號碼是值。
字典最基本的操作包括:find( 查詢 ) 、 add( 插入 ) 、 remove( 刪除 ) ,分別用來從字典中檢索資料、插入資料和刪除資料。在實際儲存中,我們將“鍵 - 值對”儲存於記錄中,通過鍵 ( 也就是“鍵 - 值對”中的名字 ) 來標識該“鍵 - 值對”。“鍵 - 值對”的存放位置和其鍵之間的對應關係用一個二元組表示: ( 鍵 , 值的位置 ) 。


從字典中查詢“鍵- 值對”的最簡單方法就是使用陣列儲存,然後在查詢的時候遍歷此陣列,當遍歷到和被查詢的“鍵 - 值對”的名字相同項的時候,這個“鍵 - 值對”就被找到了。這種最樸實的方式肯定是不能滿足實際要求的,因此人們發明了一種檢索效率非常高的組織字典資料的方法 ,即雜湊表結構。


雜湊表與雜湊方法


雜湊方法在“鍵- 值對”的儲存位置與它的鍵之間建立一個確定的對應函式關係 hash() ,使得每一個鍵與結構中的一個唯一的儲存位置相對應:
儲存位置=hash( 鍵 )
在搜尋時,首先對鍵進行hash 運算,把求得的值當做“鍵 - 值對”的儲存位置,在結構中按照此位置取“鍵 - 值對”,若鍵相等,則表示搜尋成功。在儲存“鍵 - 值對”的時候,依照相同的 hash 函式計算儲存位置,並按此位置存放,這種方法就叫做雜湊方法,也叫做雜湊方法。在雜湊方法中使用的轉換函式 hash 被稱作雜湊函式 ( 或者雜湊函式 ) 。按照此演算法構造出來的表叫做雜湊表 ( 或者散列表 ) 。
雜湊函式建立了從“鍵- 值對”到雜湊表地址集合的一個對映,有了雜湊函式,我們就可以根據鍵來確定“鍵 - 值對”在雜湊表中的位置的地址。使用這種方法由於不必進行多次鍵的比較,所以其搜尋速度非常快,很多系統都使用這種方法進行資料的組織和檢索。


舉一個例子,有一組“鍵值對”:<5, ” tom ” >、 <8, ” Jane ” >、 <12, ” Bit ” >、 <17, ” Lily ” >、 <20, ” sunny ” >,我們按照如下雜湊函式對鍵進行計算 :hash(x)=x%17+3 ,得出如下結果: hash(5)=8 、 hash(8)=11 、 hash(12)=15 、 hash(17)=3 、 hash(20)=6 。我們把 <5, ” tom ” >、 <8, ” Jane ” >、 <12, ” Bit ” >、 <17, ” Lily ” >、 <20, ” sunny ” >分別放到地址為 8 、 11 、 15 、 3 、 6 的位置上。當要檢索 17 對應的值的時候,只要首先計算 17 的雜湊值為 3 ,然後到地址為 3 的地方去取資料就可以找到 17 對應的資料是“ Lily ”了,可見檢索速度是非常快的。