哈希表, 也叫散列表, 是數組的一種擴展
把關鍵字或者鍵轉換為數組下標的方法叫做散列函數
散列函數計算得到的值也叫做散列值或hash值
散列沖突
解決散列沖突的方法: 開放尋址法 和 鏈表法
開放尋址法
-
線性探測
如果數據經過散列函數散列后, 存儲位置被占用了, 我們就從當前位置開始, 依
次往后查找, 看是否有空閑位置, 直到找到為止對于刪除操作, 不能單純地把要刪除的元素置位空, 因為如果這個空閑的位置是
后來刪除的, 就會導致原來的查找算法失效, 本來存在的數據, 會認定為不存在,
這個問題的話, 我們可以將刪除的元素特殊標記為 deleted, 遇到標記 deleted的
空間, 并不是停下來, 而是繼續往下探測所以, 散列表插入的數據越來越多時, 散列沖突發生的可能性就會越來越大, 空
閑的位置會越來越少, 線性探測的時間會越來越久. 極端情況下, 需要探測整個
散列表, 所以最壞情況下的時間復雜度是 O(n) 二次探測
線性探測每次探測的步長是 1, hash(key) + 0, hash(key) + 1, 二次探測的步長變為二次方, hash(key) + 0, hash(key) + 1^2, hash(key) + 2^2雙重散列
不僅使用一個散列函數, 還要使用一組散列函數 hash1(key), hash2(key), hash3(key).... 優先使用第一個函數, 如果有沖突, 就用第二個散列函數
不管哪種探測方法, 散列表中空閑位置不多的時候, 散列沖突概率會大大提高。 需要盡可能保證散列表的操作效率, 一般情況下, 保證一定比例的空閑槽位。用裝載因子來表示空位的多少
裝載因子 = 填入表的元素個數 / 散列表的長度
鏈表法
所有散列值相同的元素都放到相同槽位對應的鏈表中, 插入的時候只需要通過散列函數計算出對應的槽位, 將其插入到對應的鏈表中即可, 所以插入的時間復雜度是 O(1)