1. 程式人生 > >資料結構與演算法學習筆記—— 散列表

資料結構與演算法學習筆記—— 散列表

 

什麼是散列表:

散列表用的是陣列支援按照下標隨機訪問資料的特性,所以散列表其實就是陣列的一種擴充套件,由陣列演化而來。可以說,如果沒有陣列,就沒有散列表。

原理:

散列表用的就是陣列支援按照下標隨機訪問的時候,時間複雜度是0(1)的特性。我們通過雜湊函式把元素的鍵值對映為下標,然後將資料儲存在陣列中對應下標的位置。當我們按照鍵值查詢元素時,我們用同樣的雜湊函式,將鍵值轉化陣列標標,從對應的陣列下標的位置取資料。

雜湊函式的設計要求:

雜湊函式計算得到的雜湊值是一個非負整數;.
如果key1 = key2,那hash(key1) == hash(key2);
如果key1 != key2,那hash(key1)  !=  hash(key2),
雜湊函式的設計不能太複雜,雜湊函式生成值要儘可能隨機並且均勻分佈

如果不符合3 那麼就出現了雜湊衝突,雜湊衝突是無法避免的

解決雜湊衝突的方法有兩種: 

開放定址法(open addressing)和連結串列法(chaining)

開放定址法:如果出現了雜湊衝突,我們就重新探測一個空閒位置,將其插入。

裝在因子:  散列表中一定比例的空閒槽位。公式: 散列表的裝載因子 = 填入表中的元素個數 / 散列表的長度

裝載因子越大,說明空閒位置越少,衝突越多,散列表的效能會下降。

連結串列法:

連結串列法是一種更加常用的雜湊衝突解決辦法,相比開放定址法,它要簡單很多。我們來看這個圖,在散列表中,每個"桶(bucket) "或者"槽(slot) "會對應一條連結串列,所有雜湊值相同的元素我們都放到相同槽位對應的連結串列中。