數據結構 --- 散列表

Why

散列表是數組的升級版, 在數組中, 我們可以使用整數索引作爲key, 而在散列表中, 我們可以使用任意的類型作爲key.

當然這其中需要一個轉化: AnyType –> Int, 而這個轉化函數就是散列函數.

散列衝突

AnyType –> Int 這個散列函數中, 由於數組是定長的, 而AnyType是無限的, 所以可能出現不同的AnyType 會散列到相同的 Int, 解決衝突的最簡單的兩種方法是:

分離鏈表法

分離鏈表法

在衝突的位置創建新的鏈表, 這樣一次查表就轉化爲hash + 遍歷.

探測法

這裏寫圖片描述

如C所示, 如果發生衝突, 那麼就從衝突的位置開始接着往下找, 直到出現空位.

再散列

類似與列表的擴容, 當table 中的數據過多時, 衝突會越來越頻繁, 所以在裝填一定的數據後我們需要把table 擴容, 然後把數據拷貝到新table中