通俗理解「雜湊表」

2021-08-20 20:55:15 字數 1705 閱讀 8149

**:

今天聊聊「雜湊表」,「雜湊表」主要作用在於高效查詢。

在程式設計實現中,常常面臨著兩個問題:儲存和查詢,儲存和查詢的效率往往決定了整個程式的效率。

腦補下,你在家裡忘記了指甲刀放在**,通常要在你家所有抽屜中順序尋找,直到找到,最差情況下,有n個抽屜,你就要開啟n個抽屜。這種儲存方式叫陣列,查詢方法稱為「遍歷」。

腦補下,你是乙個整理控,所有物品必須分門別類放入整理箱,再將整理箱編號,比如1號放入針線,2號放入證件,3號放入細軟。這種儲存和查詢方式稱為「雜湊」,如果這個時候要查詢護照,你不許要再翻所有抽屜,直接可在2號整理箱中獲取,通常只用一次查詢即可,如何編號整理箱,稱為雜湊演算法。

同樣是查詢,差距怎麼那麼大涅~,假設我們有100億條資料記錄,那差距就變得明顯,遍歷需要查詢最多100億次,最少1次,雜湊只需1次。

讓我們正式介紹雜湊和雜湊演算法,雜湊也稱雜湊,雜湊表是一種與陣列、鍊錶等不同的資料結構,與他們需要不斷的遍歷比較來查詢的辦法,雜湊表設計了乙個對映關係f(key)= address,根據key來計算儲存位址address,這樣可以1次查詢,f既是儲存資料過程中用來指引資料儲存到什麼位置的函式,也是將來查詢這個位置的演算法,叫做雜湊演算法。

讓我們舉個例子,比如下面這幾個人物,按陣列儲存:

這樣我要找到大胸姐的**號碼,需要順序查詢對比整個陣列,第乙個餘罪,不是,第二個不是,第三個不是,直到第四個找到大胸姐。

如果以hash儲存呢?首先讓我們來看看如何設計雜湊演算法,雜湊演算法可以隨意設計,教科書上一般會說以下幾種方法:直接定址發,平方取中法,除數取餘法,雜湊演算法的本質上是計算乙個數字,如果用這幾種方法講解會稍顯晦澀,我們假設我們的雜湊演算法是取姓名的首字母。所以f(餘罪) = y, f(傅老大) = f,f(沈嘉文) = s,f(大胸姐) = d。

構建的hash表如下:

我們看到他們分別以姓名首字母的位置插入到這一張**中,這樣我們構建了這樣乙個key-value**,此表就是雜湊表,也稱為hash table。未來,當我們要查詢餘罪的時候,通過計算,餘罪在y位置,可以通過1次查詢,找到這條記錄,也即手機號。

這個時候有客官問了,那以首字母為雜湊函式的話,應該有很多比如以y的姓名啊,這個時候就不是一次查詢了吧,其實有很多條記錄都對映到乙個位置上,稱為雜湊衝突。

雜湊衝突是跟雜湊函式的設計正相關的,你的隨機性越大,那麼產生雜湊衝突的可能性越小,在小概率下,如果還有衝突怎麼辦,這個時候要做些有損的設計,比如如果有兩個首字母為y的姓名,那麼可以接到餘罪的後面,當查詢的時候,需要先查找到y,然後再順序查詢,如圖所示:

還有一些解決雜湊衝突的辦法叫「雜湊再雜湊」,也就是針對第一次雜湊的結果再進行一次hash來減小衝突的概率。

這就是hash表,首先ta是一種資料結構,是一種效率極高的查詢方式,雜湊表的核心在於雜湊函式的設計,雜湊衝突了不要緊,我們要增加隨機性以及對衝突進行適當的有損化的處理。

題圖來自pexels,基於cc0協議

本文**:

雜湊表作用的通俗理解

先來了解一下 hash 的基本思路 設要儲存物件的個數為 num,那麼我們就用 len個記憶體單元來儲存它們 len num 以每個物件 ki的關鍵字為自變數,用乙個函式 h ki 來對映出 ki的記憶體位址,也就是 ki的下標,將 ki物件的元素內容全部存入這個位址中就行了。這個就是 hash 的...

理解雜湊表

雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程式中,...

雜湊表的理解

因為在開發中經常用到hashmap,hashset等集合結構,但是一直對其中的hash的意思不太理解。今天抽空查了一下資料,順便記錄一下現在的理解。事先宣告一下,此文只介紹雜湊表的資料結構,不介紹具體的hash演算法 首先我們不要去想hash表是用來幹嘛的,先以實際問題著手。就是現在需要乙個能夠儲存...