衝突效能
你在一家雜貨店上班。有顧客來買東西時,你得在乙個本子中查詢**。(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時,很快的得到乙個下標...