Hash 雜湊介紹

2021-09-26 04:30:38 字數 2845 閱讀 3986

1)雜湊概念

在順序結構以及平衡樹中,元素關鍵碼與其儲存位置之間沒有對映關係,想要查詢乙個元素必須要關鍵碼之間進行多次比較,順序查詢的時間複雜度為o(n),在平衡二叉搜尋樹中查詢為o(logn),搜尋的效率取決於關鍵碼的比較次數

但是有沒有一種理想的搜尋方法可以實現不用關鍵碼之間的對比從而找到乙個元素呢?

方法就是構造某種函式來建立關鍵碼和儲存位置之間的對映的關係,在我們查詢某個值的時候就可以通過這個函式直接找到值的儲存位置

當插入乙個元素時:

根據插入元素的關鍵碼,用這個函式計算出插入元素的儲存位置,將其儲存

當搜尋乙個元素時:

同樣的方法找到關鍵碼的儲存位置,取出元素進行對比,關鍵碼相同說明搜尋成功,否則失敗

該種方式就是雜湊(雜湊)方法,雜湊方法使用的轉換函式稱為雜湊(雜湊)函式,構造出來的結構稱為雜湊表(hash table)或叫做雜湊表

2)雜湊衝突

使用該方法搜尋沒有了關鍵碼之間的多次比較,因此搜尋效率高,但是存在的問題也是很明顯的,我向雜湊表中儲存資料44,那麼44將儲存在**呢??這將會造成雜湊衝突

不同的關鍵字經過相同的雜湊函式計算得到相同的雜湊位址,這種現象稱為雜湊衝突或者雜湊碰撞,把具有不同關鍵碼卻具有相同雜湊位址的資料元素稱為"同義詞"

3)常見雜湊函式

1)直接定製法:2)除留餘數法:除此外還有:平方取中法、摺疊法、隨機數法、數學分析法等…

4)雜湊衝突的解決

解決雜湊衝突兩種常見的方法是:閉雜湊和開雜湊

1、閉雜湊

也叫開放定址法,當發生雜湊衝突時,如果雜湊表未被裝滿,說明在雜湊表中必然還有空位置,那麼可以把key存放到衝突位置中的"下乙個"空位置中去

那麼如何找尋下乙個位置呢?

1)線性探測

比如針對上圖中的場景,現在需要插入元素44,先通過雜湊函式計算雜湊位址,hashaddr為4,因此44理論上應該插在該位置,但是該位置已經放了值為4的元素,即發生雜湊衝突

線性探測將會從發生衝突的位置開始依次向後尋找,直到找到第乙個空位置為止

插入:

通過雜湊函式獲取待插入元素在雜湊表中的位置,如果該位置中沒有元素則直接插入新元素,如果該位置中有元素發生雜湊衝突,使用線性探測找到下乙個空位置,插入新元素

刪除:

採用閉雜湊解決雜湊衝突時,不能直接物理刪除雜湊表中已有的元素,因為這樣會為查詢其它元素帶來麻煩

例如我刪除元素4時採用物理刪除的方式,然後我查詢元素44,會出現問題,因為我首先找到的是4的位址位置,4位址位置沒有元素我將不繼續查詢,因此查詢不到元素44

因此線性探測採用標記的偽刪除法來刪除乙個元素

// 雜湊表每個空間給個標記

// empty標記此位置空, exist標記此位置已經有元素, delete標記元素已經刪除

enum state

擴容&&雜湊負載因子:隨著雜湊表中的資料增多,出現雜湊衝突的概率也就會越大,因此我們為了減少雜湊衝突應該保持雜湊表中的有效元素少於總容量的70%左右,0.7就是雜湊負載因子

線性探測的缺點:一旦發生雜湊衝突,所有的衝突連在一起,容易產生資料"堆積",使我們找某個關鍵碼的時候要比較很多次,導致搜尋效率降低

2)二次探測

線性探測的缺陷是產生衝突的資料堆積在一塊,這與其找下乙個空位置有關係,因為找空位置的方式就是挨著往後逐個去找,因此二次探測為了避免堆積問題,找下乙個空位置的方法為

其中:i = 1,2,3…, h0是通過雜湊函式hash(x)對元素的關鍵碼 key 進行計算得到的位置,m是表的大小

2、開雜湊

開雜湊法又叫鏈位址法(開鏈法),首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中,開雜湊中每個桶中放的都是發生雜湊衝突的元素

開雜湊的擴容

桶的個數是一定的,隨著元素的不斷插入,每個桶中元素的個數不斷增多,極端情況下,可能會導致乙個桶中煉表節點非常多,會影響的雜湊表的效能,因此在一定條件下需要對雜湊表進行增容,那該條件怎麼確認呢?

開雜湊最好的情況是:每個雜湊桶中剛好掛乙個節點,再繼續插入元素時,每一次都會發生雜湊衝突,因此,在元素個數剛好等於桶的個數時,給雜湊表增容

開雜湊與閉雜湊比較

應用鏈位址法處理溢位,需要增設鏈結指標,似乎增加了儲存開銷。

事實上: 由於開放位址法必須保持大量的空閒空間以確保搜尋效率,如二次探查法要求裝載因子a <= 0.7,而表項所佔空間又比指標大的多,所以使用鏈位址法反而比開位址法節省儲存空間

Hash 雜湊 雜湊

hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....

雜湊演算法(Hash函式)簡單介紹

雜湊演算法的定義和原理 將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則,就是雜湊演算法。而通過原始資料對映之後得到的二進位制值串就是雜湊值。設計乙個優秀的雜湊演算法,需要滿足下面幾點要求 a.從雜湊值不能反向推導出原始資料 所以雜湊演算法也叫單向雜湊演算法 b.對輸入的資料比較...

雜湊(hash 雜湊表)

可以認為雜湊有著陣列的思想,它將所有的資料段拼成乙個陣列 順序表 進行儲存,通過雜湊函式,可以基本上以o 1 的時間複雜度來查詢和儲存資料。通過資料段中的唯一關鍵字 key 經過某種演算法,得出此資料段在整個雜湊陣列 順序表 中的的下標,然後直接取元素即可。有資料結構如下 資料段 key,value...