演算法 雜湊表

2022-08-22 09:36:09 字數 3013 閱讀 6150

定義

雜湊函式「將輸入對映到數字」。即無論你給它什麼資料,它都還你乙個數字。

雜湊函式必須滿足一些要求

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...