雜貨店商品對應的**舉例:
簡單查詢就是拿出商品價目本,這個價目本並不是有序的,顧客問蘋果多少錢,需要乙個乙個去查詢某乙個商品的**,需要o(n)時間。
同樣是乙個價目本,但是按商品名稱字母排序的,這樣需要的時候更短為o(logn)。
但這樣我還是覺得查詢太慢,怎麼辦,這時候需要一名能記住所有商品**的員工,這樣一問評價**便知,只需要o(1)。
從資料結構的角度來看
你可使用陣列來實現記錄商品**的本子,的每個元素包含兩項內容:商品名和**。
如果將這個陣列按商品名排序,就可使用二分查詢在其中查詢商品的**。這樣查詢**的時間將為o(log n)。
然而,我希望查詢商品**的時間為o(1),這是雜湊函式的用武之地。
無論你給雜湊函式什麼資料,它都還你乙個數字,專業點說:雜湊函式「將輸入對映到數字」
特點:
簡單實現商品價目本:
準備乙個空列表,將蘋果輸入雜湊函式,輸出4,那麼列表的索引4就存蘋果**¥2.1,依次類存。。。行程價目本。
這樣我們想知道商品名(蘋果)**,直接把蘋果給雜湊函式,輸出的就是價目表的索引4位置的**(¥2.1)。
注意:雜湊函式知道陣列有多大,只返回有效的索引。如果陣列包含5個元素,雜湊函式就不會
返回無效索引100。
雜湊表複雜資料結構中,雜湊表可能是最有用的,也被稱為雜湊對映、對映、字典和關聯陣列。雜湊表的速度很快!和陣列一樣快。
python提供的雜湊表實現為字典,你可使用函式dict來建立雜湊表。
雜湊表的應用
將雜湊表用於查詢
比如**本
>>
> phone_book =
>>
> phone_book[
"小明"]=
8675309
>>
> phone_book[
"火警"]=
119>>
>
print phone_book[
"小明"
]# 查詢jenny的**
防止重複比如投票機制:已經投過票的不能再投了
voted =
# 雜湊表查詢元素非常快
defcheck_voter
(name)
:if voted.get(name)
:print
"kick them out!"
else
: voted[name]
=true
print
"let them vote!"
如果將已投票者的姓名儲存在列表中,這個函式的速度終將變得非常慢,因為它必須使用簡單查詢搜尋整個列表。
作為快取
你登入了facebook,你看到的所有內容都是為你定製的。你每次訪問facebook.com,其伺服器都需考慮你感興趣的是什麼內容。但如果你沒有登入,看到的將是登入頁面。每個人看到的登入頁面都相同。 facebook被反覆要求做同樣的事情:「當我登出時,請向我顯示主頁。」有鑑於此,它不讓伺服器去生成主頁,而是將主頁儲存起來,並在需要時將其直接傳送給使用者。
facebook不僅快取主頁,還快取about頁面、 contact頁面等眾多其他的頁面。因此,它需要將頁面url對映到頁面資料。
也就是乙個字典中key是url,value是網頁資料data
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時,你就可以直接傳送快取中的資料,而不用再讓伺服器進行處理了。
這裡總結一下,雜湊表適合用於:
雜湊表 學習
看了幾篇文章,主要意思就是用簡單的值index,去索引複雜的值key,進而找到想要的值value.雜湊演算法主旨 index f key 資料存放格式 key.value 但是存在問題是,1.雜湊演算法使不同的key產生相同的index 2.分配給雜湊表的記憶體滿了之後,整個雜湊表的遷移太累贅了。針...
雜湊表學習總結
1.雜湊函式 雜湊函式可能會將兩個以上的的關鍵字對映到同乙個位址上,稱這種情況為衝突。應注意任何設計出來的雜湊函式都不能避免衝突 2.雜湊函式的構造方法 直接定址法 適用於關鍵字的分布基本連續的情況 除留餘數法 最簡單,最常用的情況 數字分析法 適用於已知的關鍵字集合,若更換了關鍵字,則需要重新構造...
學習筆記 雜湊表
最近開始把之前欠的noip基礎知識點刷一下 2333其實我的作業還沒有寫完 做到雜湊表的時候,我有點懵,顯然前幾次講課的時候我沒有聽 於是lbmttw lx就開始在網上學習了 啊啊啊 沙雕橘貓真心可愛,愛了愛了 發現其實hash表是個比較有趣的東西 一種典型的空間換時間的資料結構,也叫雜湊表 時間複...