【數據結構】hash算法!!!

Hash表是一種可以將查找元素的時間複雜度降爲O(1)的高效算法。
基本原理:將所有的數據通過hash函數映射到hash表裏面,如果需要查找元素的時候再通過hash函數來計算出來元素在hash表裏面的位置,從而一次將需要的元素找到。
這裏寫圖片描述

存在的問題
如果有兩個或者更多的元素通過hash函數映射的hash位置是相同的那麼就會出現問題。
解決辦法
線性探測:
這裏寫圖片描述

在產生hash衝突的時候,在hash表裏面依次查找下一個沒有填數據的位置,並且將產生衝突的數據填入。
問題:
如果當前面的數據產生hash衝突的時候會將後面的數據位置占上,那麼如果後面的數據進行填入的時候就沒有在應該在的位置上面,那麼就會在查找效率上面有所下降。
這裏寫圖片描述

二次探測:
爲了解決線性探測的缺點,那麼使用二次探測可以在一定的程度上面得到緩解。
index = di + i^2;
通過這裏的i^2可以曾加距離hash衝突的位置,這樣就可以減少後面的數據沒有出現在本來應該出現的位置上面。
這裏寫圖片描述

鏈地址法:
利用線性探測和二次探測都是避免不了會將後面的元素本來應該放置的位置侵佔。
如果將hash表裏面的元素換成鏈表的節點,那麼產生hash衝突的時候可以將產生衝突的數據依次加入到鏈表裏面,那麼無論多少的數據產生衝突 都可以將元素放到指定的鏈表裏面,那麼需要查找元素的時候就可以遍歷鏈表來查找。
這裏寫圖片描述

缺點:如果在一個固定的位置上面產生衝突的元素過多,那麼在查找一個元素的時候就相當於遍歷一個單鏈表,那麼效率依舊不太高。但是可以將單鏈表的數據結構改成AVL樹或者紅黑樹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章