哈希表--HashTable(散列表)

哈希表定義

是根據關鍵字(key)而直接訪問內存存儲位置的一種數據結構
訪問數據的方法是通過一個函數,映射到key值對應的位置,進行數據訪問
這個映射函數成爲散列函數/哈希函數,存放記錄的數組稱爲散列表/哈希表


構造哈希表的幾種方法

一般常用的就是這兩種,其它的就不介紹了

  1. 直接定址法–取關鍵字的某個線性函數爲散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B爲常數。
  2. 除留餘數法–取關鍵值被某個不大於散列表長m的數p除後的所得的餘數爲散列地址。Hash(Key)= Key % P。

1)第一種方法很簡單,但是有很大的缺陷,
這裏寫圖片描述
當我們的數據特別的散列,數與數之間差距特別大時,就會造成許多的空間浪費,比如1,10000,400000只有三個數據,可是我們開空間卻需要開很多;
2)第二種就比第一種好,但又會有新的問題——“哈希衝突”
就是當我們取模後,兩個或多個數取模得到的數相同,那麼它們要對應的位置就衝突了,當然我們也有相應的辦法處理


解決哈希衝突的方法

1. 線性探測&二次探測

2.哈希桶——開鏈法


應用:位圖&布隆過濾器

如果想判斷一個元素是不是在一個集合裏,一般想到的是將集合中所有元素保存起來,然後通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash table)等等數據結構都是這種思路。但是隨着集合中元素的增加,我們需要的存儲空間越來越大。同時檢索速度也越來越慢。

那如何解決呢?

我們都知道一個字節=8個比特位,我們可以用比特位的0/1來標識這個元素在沒在集合裏。這樣可以節省很多空間,檢索時,我們只要看看對應位置是不是都是 1 就(大約)知道它在不在集合中了,而形成的這個位列表(Bit array),也就是位圖


發佈了78 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章