1. 程式人生 > 程式設計 >認識演演算法之資料結構(六)雜湊表

認識演演算法之資料結構(六)雜湊表

雜湊表(Hash tables)

什麼是雜湊表

在介紹雜湊表的時候,先回顧一下前幾章的內容,再來比較下陣列和連結串列的優缺點。

陣列:定址容易,但插入和刪除元素比較麻煩; 連結串列:插入和刪除元素容易,但定址比較麻煩。

那麼有沒有一種資料結構是既能結合這兩種的優點同時也能避免這兩種資料結構所帶來的缺點呢?答案是有的,那就是現在所講的雜湊表。
雜湊表又稱為散列表,是根據關鍵碼值(Key,value)而直接進行訪問的資料結構。  
它提供了快速的插入操作和查詢操作,無論雜湊表總中有多少條資料,  
插入和查詢的時間複雜度都是為O(1)
複製程式碼
以上是雜湊表的定義,其結構示意圖如下所示:

從上述結構中我 最左邊的為key,通過中間的雜湊運算(hash function)從而形成一個有意義的數字下標陣列,從而與右邊的value/buckets即元素內容形成了一個確定的對應關係。
似乎很難懂這三者(Keys,hash function,buckets)之間的關係,那麼就舉個例子?吧:???

怎麼正確建立學號(Key)與Value之間的對映關係呢? 我們可以通過這樣的雜湊運算 學號(key) - 201735020330 所得出的結果即作為存放Value的陣列中,比如這個池早香,她的學號是201735020336,通過我們的雜湊運算得陣列下標值為6,那麼我們就可以將其姓名和電話號碼放進這個下標值為6的陣列中。這樣一個簡單的雜湊表就完成了。

❓ 雜湊運算(hash funchion)有特定的運算方式嗎?

沒有,但為了構造一個好的雜湊函式:我們希望hash函式作用在不同的key時,所得到的value能夠均勻的分佈在hash表中,即能儘可能少的減少地址衝突。比較常見的hash函式的構造方法有:
1)直接定址法 2)數字分析法3)平方取中 4)摺疊法5)除留餘數法

❓ 剛剛提到了地址衝突,什麼是地址衝突?

當你用hash函式作用在兩個互不相同的key上,得到的value值相等。這就好比“下面有請王先生上臺演講”,但底下那麼多姓王的,不知道叫的是哪個王先生,只好一起上臺了。因此正如上面所說,好的雜湊運算需要慎重考慮其運算方法,避免出現地址衝突。但萬一真的發生怎麼辦呢?通常有兩個辦法解決:
  1. 鏈地址法:
如圖所示,採用連結串列的辦法,將衝突的地址內容通過線性表的方式串聯起來,然後在這個地址裡通過順序檢索查找出我們想要的值。
  1. 開放地址法:
其方法就是找到一個未被佔用地址的陣列,並將元素儲存進去,尋找空地址的方法有很多,而上圖的方法就是較為簡單線性查詢法,從衝突的地址開始,往下搜尋空地址。

為什麼要用雜湊表

1)索引速度快。2)方便資料的增刪改查

相比于于陣列和連結串列,如果我們以連結串列的方式依次查詢,面對企業級的上千萬的資料是非常耗時耗記憶體的。而如果我們使用陣列的結構進行業務操作也會因刪除和插入而浪費很多時間。

雜湊表簡單的實現