哈希表定義
是根據關鍵字(key)而直接訪問內存存儲位置的一種數據結構
訪問數據的方法是通過一個函數,映射到key值對應的位置,進行數據訪問
這個映射函數成爲散列函數/哈希函數,存放記錄的數組稱爲散列表/哈希表
構造哈希表的幾種方法
一般常用的就是這兩種,其它的就不介紹了
- 直接定址法–取關鍵字的某個線性函數爲散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B爲常數。
- 除留餘數法–取關鍵值被某個不大於散列表長m的數p除後的所得的餘數爲散列地址。Hash(Key)= Key % P。
1)第一種方法很簡單,但是有很大的缺陷,
當我們的數據特別的散列,數與數之間差距特別大時,就會造成許多的空間浪費,比如1,10000,400000只有三個數據,可是我們開空間卻需要開很多;
2)第二種就比第一種好,但又會有新的問題——“哈希衝突”
就是當我們取模後,兩個或多個數取模得到的數相同,那麼它們要對應的位置就衝突了,當然我們也有相應的辦法處理
解決哈希衝突的方法
1. 線性探測&二次探測
2.哈希桶——開鏈法
應用:位圖&布隆過濾器
如果想判斷一個元素是不是在一個集合裏,一般想到的是將集合中所有元素保存起來,然後通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash table)等等數據結構都是這種思路。但是隨着集合中元素的增加,我們需要的存儲空間越來越大。同時檢索速度也越來越慢。
那如何解決呢?
我們都知道一個字節=8個比特位,我們可以用比特位的0/1來標識這個元素在沒在集合裏。這樣可以節省很多空間,檢索時,我們只要看看對應位置是不是都是 1 就(大約)知道它在不在集合中了,而形成的這個位列表(Bit array),也就是位圖