定義
雜湊函式「將輸入對映到數字」。即無論你給它什麼資料,它都還你乙個數字。
雜湊函式必須滿足一些要求
l 它應將不同的輸入對映到不同的數字。 例如, 如果乙個雜湊函式不管輸入是什麼都返回1,它就不是好的雜湊函式。最理想的情況是,將不同的輸入對映到不同的數字。
雜湊函式準確地指出了儲存位置,具體原因如下:
l 雜湊函式總是將同樣的輸入對映到相同的索引。
l 雜湊函式將不同的輸入對映到不同的索引。
l 雜湊函式知道陣列有多大,只返回有效的索引。
l 使用雜湊函式和陣列建立了一種被稱為雜湊表(hashtable)的資料結構。
l 雜湊表是一種包含額外邏輯的資料結構。陣列和鍊錶都被直接對映到記憶體,但雜湊表更複雜,它使用雜湊函式來確定元素的儲存位置。
l 雜湊表也使用陣列來儲存資料,因此其獲取元素的速度與陣列一樣快
python使用字典來實現雜湊表功能,可使用函式dict建立雜湊表
應用將雜湊表用於查詢
示例:l 建立對映。
l 查詢。
>>> phonebook={}>>> phonebook['li']=123456
>>> phonebook['p']=987654
>>> print(phonebook['p'])
987654
防止重複
示例:檢查是否存在某個元素
voted={}def check_voter(name):
if voted.get(name): #使用函式get來返回是否存在。不存在返回none
print('kick them out!')
else:
voted[name]=true
print('let them vote')
check_voter('tom')
check_voter('jerry')
check_voter('jerry')
將雜湊表用作快取
快取的工作原理:**將資料記住,而不再重新計算。
快取優點
l 使用者能夠更快地看到網頁
l 需要做的工作更少。
快取是一種常用的加速方式,所有大型**都使用快取,而快取的資料則儲存在雜湊表中!
訪問過程
cache={}def get_page(url):
if cache.get(url): #檢查快取中是否儲存了該頁面
return cache[url] #儲存了,即返回它
else:
data=get_data_from_server(url) #沒儲存,從伺服器呼叫
cache[url]=data #將其儲存到快取中
return data #返回該頁面
小結雜湊表適合用於:
l 模擬對映關係;
l 防止重複;
l 快取/記住資料,以免伺服器再通過處理來生成它們
定義給兩個鍵分配的位置相同。
處理衝突的方式
如果兩個鍵對映到了同乙個位置,就在這個位置儲存乙個鍊錶。
經驗l 雜湊函式很重要。避免雜湊函式將所有的鍵都對映到乙個位置,而最理想的情況是,雜湊函式將鍵均勻地對映到雜湊表的不同位置。
l 如果雜湊表儲存的鍊錶很長,雜湊表的速度將急劇下降。然而, 如果使用的雜湊函式很好,這些鍊錶就不會很長!
雜湊函式很重要,好的雜湊函式很少導致衝突。
在平均情況下,雜湊表執行各種操作的時間都為o(1)。o(1)被稱為常量時間。
雜湊表的效能
操作平均情況
最糟情況
查詢o(1)
o(n)
插入o(1)
o(n)
刪除o(1)
o(n)
雜湊表同陣列和鍊錶比較
操作平均情況
最糟情況
陣列鍊錶
查詢o(1)
o(n)
o(1)
o(n)
插入o(1)
o(n)
o(n)
o(1)
刪除o(1)
o(n)
o(n)
o(1)
在平均情況下,雜湊表的查詢(獲取給定索引處的值)速度與陣列一樣快,而插入和刪除速度與鍊錶一樣快,因此它兼具兩者的優點!
但在最糟情況下,雜湊表的各種操作的速度都很慢。
在使用雜湊表時,避開最糟情況至關重要。需要有:
l 較低的填裝因子
l 良好的雜湊函式。
填裝因子
計算公式
雜湊表的填裝因子=雜湊表包含的元素數/位置總數
調整長度(resizing)
填裝因子大於1意味著元素數量超過了陣列的位置數。
一旦填裝因子開始增大,就需要在雜湊表中新增位置,這被稱為調整長度(resizing)
經驗填裝因子越低,發生衝突的可能性越小,雜湊表的效能越高。
乙個不錯的經驗規則是:一旦填裝因子大於0.7,就調整雜湊表的長度。
良好的雜湊函式
良好的雜湊函式讓陣列中的值呈均勻分布。
糟糕的雜湊函式讓值扎堆,導致大量的衝突。
l 可以結合雜湊函式和陣列來建立雜湊表。
l 衝突很糟糕,應使用可以最大限度減少衝突的雜湊函式。
l 雜湊表的查詢、插入和刪除速度都非常快。
l 雜湊表適合用於模擬對映關係。
l 一旦填裝因子超過0.7,就該調整雜湊表的長度。
l 雜湊錶可用於快取資料(例如,在web伺服器上)。
l 雜湊表非常適合用於防止重複。
雜湊表演算法
雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...
雜湊表演算法
今天大概講一講雜湊表的原理,構造,衝突等。雜湊 hash 是什麼,其實雜湊就是一種對映,將一些線性資料通過乙個函式 h算出乙個值作為下表,定義乙個 a陣列單元來按照下標儲存資料。舉例 離散優化就是一種特殊的雜湊,它的函式比較簡單。如圖,如果這個陣列的資料下標不大的話,我們就可以直接排序算出距離,但當...
演算法 雜湊表
如果能在關鍵字與記錄儲存的位置之間建立一種聯絡,則可以不經過比較,直接對關鍵字進行計算得出記錄的位置,再到相應位置去讀取資料即可。將這種關鍵字與記錄儲存位置之間的對應關係稱為雜湊函式,將這種方式建立的表稱為雜湊表。include define hash len 13 define table len...