散列表
散列表是一種數據結構。通過key value進行存儲。你可以先看下上面百度百科的解釋,注意其中這幾個關鍵字散列函數,沖突。
這樣一個需求
假如你是水果的銷售人員,那么你肯定要知道每種水果的價格,比如顧客來了說蘋果多少錢一斤,假如你有一個清單,也就是我們說的數組。
我們前面介紹了二分查找方法,比如我們要查找一個數組中的元素,需要的log2n。如果水果很多怎么辦,那么有的同學就說了,哪有這么難,我可以記住這些水果,確實我們也講過帶有緩存的函數,你可以記住那些你查找過的水果,如果不適用緩存函數那,我們想像數組那樣,比如我要下標為10的元素,我們就能立刻找到這個元素。所以我們要設法寫一個函數吧這些水果都映射到數組的下標中,比如蘋果我就要存到0的地方,香蕉我要存到1的地方等等,那么我們在找蘋果的時候,我們就要這個函數告訴我蘋果在數組的那個位置,我們就可以輕松的找到了蘋果的位置。
散列函數
我們通過散列函數將蘋果存放到數組下標為七的地方。大家肯定會說這個不就是字典嗎。我給一個key就得到一個value.對的字典就是散列表的一種實現。
用途
用于查找,散列表是key -> value所以查找速度很快。
防止重復,由于一個key -> value所以是一一對應關系
用于緩存,一定輸入對應一定輸出的函數,我們可以使用散列表進行緩存。
沖突
對于編寫的散列函數來說,我們希望能編寫出一個一一對應的關系,但是這樣的函數太難了。于是就會出現了一種情況就是我的處的下標上已經存在了元素。那么就會造成沖突。為了解決沖突我們有兩種解決方案
使用好的散列函數
key -> array 沒錯將我們以前的value改成數組這樣就可以是一對多的關系
性能
上面的沖突給我的性能帶來了一些性能的影響,如果一個不好的散列函數的出的數組同一位置上的元素越來越多,那么查找速度就會越來越慢,所以就會影響性能。
總結
每門編程語言都會編寫散列表的實現,所以你無須自己實現
注意使用的散列函數,它會影響你的性能
注意沖突
散列表的用途