雜湊表 字典

2021-10-02 05:05:09 字數 3409 閱讀 8149

衝突效能

你在一家雜貨店上班。有顧客來買東西時,你得在乙個本子中查詢**。(n

)o(n)

o(n)

。如果本子的內容是按字母順序排列的,可使用二分查詢來找出蘋果的**,這需要的時間更短,為o(l

ogn)

o(log n)

o(logn

)。前面介紹了兩種用於查詢的資料結構:陣列鍊錶,為了針對上面的問題,有個更快的查詢方式,引入雜湊表。查詢時使用雜湊函式

雜湊函式是這樣的函式,即無論你給它什麼資料,它都還你乙個數字。用專業術語來表達的話,我們會說,雜湊函式「將輸入對映到數字」。

需要滿足的要求:

雜湊函式準確地指出了**的儲存位置,你根本不用查詢!之所以能做到,原因有:

不同於陣列鍊錶都被直接對映到記憶體,雜湊表更複雜,它使用雜湊函式來確定元素的儲存位置。

雜湊表也被稱為雜湊對映、對映、字典和關聯陣列。

建立乙個話簿,每個姓名都有對應的**號碼,需要提供如下功能:

這非常適合使用雜湊表來實現!在下述情況下,使用雜湊表是很不錯的選擇。

建立**簿非常容易。首先,新建乙個雜湊表。

phone_book =

dict

()

python還提供了一種建立雜湊表的快捷方式——使用一對大括號。

phonr_book =

#與phone_book = dict()等效

下面在**簿中新增一些聯絡人的**號碼:

phone_book[

"jenny"]=

8675309

phone_book[

"emergency"]=

120

現在,假設你要查詢jenny的**號碼,為此只需向雜湊表傳入相應的鍵.

>>

>

print phone_book[

"jenny"

]8675309

雜湊表被用***撈針式的查詢。例如,你在訪問像這樣的**時,計算機必須將adit.io轉換為ip位址。這個過程被稱為dns解析(dns resolution),這不是將**對映到ip位址嗎?雜湊表是提供這種功能的方式之一.

假設你負責管理乙個投票站。顯然,每人只能投一票,但如何避免重複投票呢?有人來投票時,你詢問他的全名,並將其與已投票者名單進行比對。

為此,首先建立乙個雜湊表,用於記錄已投票的人。

voted =

有人來投票時,檢查他是否在雜湊表中。

value = voted.get(

"tom"

)

如果「tom」在雜湊表中,函式get將返回它;否則返回none。你可使用這個函式檢查來投票的人是否投過票!

**如下:

voted =

defcheck_voter

(name)

:if voted.get(name)

:print

"kick them out!"

else

: voted[name]

=true

print

"let them vote!"

使用雜湊表來檢查是否重複,速度非常快。

假設你訪問**facebook.com:

你向facebook的伺服器發出請求。

伺服器做些處理,生成乙個網頁並將其傳送給你。

你獲得乙個網頁。

facebook的伺服器處理需要時間,為了少做工作,提高facebook**的訪問速度,伺服器使用快取,對於經常使用的主頁等,不讓伺服器生成它,而是將主頁儲存起來,在需要時直接傳送給使用者。快取具有如下優點:

快取是一種常用的加速方式,所有大型**都使用快取,而快取的資料則儲存在雜湊表中!

facebook不僅快取主頁,還快取about頁面、contact頁面、terms and conditions頁面等眾多其他的頁面。因此,它需要將頁面url對映到頁面資料

當你訪問facebook的頁面時,它首先檢查雜湊表中是否儲存了該頁面。

**如下:

cache =

defget_page

(url)

:if cache.get(url)

:return cache[url]

else

: data = get_data_from_server(url)

cache[url]

= data

return data

僅當url不在快取中時,你才讓伺服器做些處理,並將處理生成的資料儲存到快取中,再返回它。這樣,當下次有人請求該url時,你就可以直接傳送快取中的資料,而不用再讓伺服器進行處理了。

前面講到,雜湊函式最好是可逆函式,其總是將不同的鍵對映到陣列的不同位置。實際上,幾乎不可能編寫出這樣的雜湊函式。

當給兩個鍵分配的位置相同時,就會產生衝突(collision),不同的輸入得到相同的對映值。衝突很糟糕,必須要避免。處理衝突的方式很多,最簡單的辦法如下:如果兩個鍵對映到了同乙個位置,就在這個位置儲存乙個鍊錶

如何選擇好的雜湊函式呢?

在平均情況下,雜湊表的查詢(獲取給定索引處的值)速度與陣列一樣快,而插入和刪除速度與鍊錶一樣快,因此它兼具兩者的優點!但在最糟情況下,雜湊表的各種操作的速度都很慢。因此,在使用雜湊表時,避開最糟情況至關重要。為此,需要避免衝突。而要避免衝突,需要有:

裝 填因

子=雜湊

表中包含

的元素數

/位置總

數裝填因子=雜湊表中包含的元素數/位置總數

裝填因子=散

列表中包

含的元素

數/位置

總數一旦填裝因子開始增大,你就需要在雜湊表中新增位置,這被稱為調整長度(resizing)

填裝因子越低,發生衝突的可能性越小,雜湊表的效能越高。乙個不錯的經驗規則是:一旦填裝因子大於0.7,就調整雜湊表的長度。調整長度的開銷很大,因此你不會希望頻繁地這樣做。

良好的雜湊函式讓陣列中的值呈均勻分布,糟糕的雜湊函式讓值扎堆,導致大量的衝突。

雜湊表是一種功能強大的資料結構,其操作速度快,還能讓你以不同的方式建立資料模型。

雜湊表 字典

1.能夠超快速的檢索效能 2.優化演算法 在不同語言中,雜湊表的叫法不一樣 以 鍵 值對 儲存資料的結構 我們使用雜湊表來儲存鍵值對,假如我們要儲存乙個員工列表,並能夠根據員工編號快速查詢員工,每乙個員工都有唯一的員工編號,我們可以使用這個員工編號作為鍵,使用員工編號的值作為值 現在要在雜湊表中儲存...

C 雜湊表 字典

簡介 雜湊表又稱雜湊表,是根據關鍵碼值 key value 而直接進行訪問的資料結構。用於 因為給定了key value值,用於快速查詢資料。語法 foreach 集合中單個的型別 區域性變數名in 集合物件 foreach 集合中單個的型別 區域性變數名in 集合物件 迴圈過程 總是從開始,一直到...

關於雜湊表(字典)

摘至本人有道雲筆記 關於雜湊表 字典 a 雜湊表的速度很塊,當輸入key時可以很快地返回value,這只需要很短的時間,相當於乙個對映,將輸入的key對映成value值。可用於很快的查詢出資料。比如,將資料存入列表,將key對應的value存為對應資料列表中的下標,當輸入key時,很快的得到乙個下標...