Linux中的雜湊表概念

2022-07-25 13:42:13 字數 2578 閱讀 1134

一.雜湊表

雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

當使用雜湊表進行查詢的時候,就是再次使用雜湊函式將key轉換為對應的陣列下標,並定位到該空間獲取value,如此一來,就可以充分利用到陣列的定位效能進行資料定位。

陣列的特點是:定址容易,插入和刪除困難

而鍊錶的特點是:定址困難,插入和刪除容易

雜湊表有多種不同的實現方法,我接下來解釋的是最常用的一種方法——拉鍊法,我們可以理解為「鍊錶的陣列」

左邊很明顯是個陣列,陣列的每個成員包括乙個指標,指向乙個鍊錶的頭,當然這個鍊錶可能為空,也可能元素很多。我們根據元素的一些特徵把元素分配到不同的鍊錶中去,也是根據這些特徵,找到正確的鍊錶,再從鍊錶中找出這個元素。

舉乙個例子,假如我的陣列a中,第i個元素裡面裝的key就是i,那麼數字3肯定是在第3個位置,數字10肯定是在第10個位置。雜湊表就是利用利用這種基本的思想,建立乙個從key到位置的函式,然後進行直接計算查詢。

好的雜湊函式=計算簡單+分布均勻(計算得到的雜湊位址分布均勻)

二.linux核心裡面雜湊表的實現

1.雜湊煉表表頭

2.雜湊鍊錶節點

因為雜湊鍊錶並不需要雙向迴圈的技能,它一般適用於單向雜湊的場景。所以,為了減少開銷,並沒有用struct hlist_node{}來代表雜湊表頭,而是重新設計struct hlist_head{}這個資料結構。此時,乙個雜湊表頭就只需要4byte了,相比於struct hlist_node{}來說,儲存空間已經減少了一半。這樣一來,在需要大量用到雜湊鍊錶的場景,其儲存空間的節約是非常明顯的,特別是在嵌入式裝置領域。

3.兩級指標pprev的目的及意義

a.如果沒有pprev

顯然鍊錶結構會變成單鏈表的結構,對於節點插入還好,但是對於節點刪除便無法直接刪除,需要遍歷鍊錶才能找到刪除節點的前乙個節點,造成效率降低

b.如果pprev為一級指標

則結構變為

在往雜湊鏈myhlist裡插入node1時

在插入node2~node4以及後續其他節點時

顯然在表頭的第乙個位置上插入元素,和插入在雜湊鍊錶的其他位置上的**處理邏輯是不一樣的,因為雜湊表頭是list_head型別,而其他節點都是list_node型別,這是linux核心設計者不能容忍的

c.採用二級指標pprev的方案後

還是以刪除節點為例,如果要刪除首節點,因為node1->pprev裡儲存的是myhlist的位址,而myhlist.first永遠都指向雜湊鍊錶的第乙個節點,我們要間接改變表頭里的hlist_node型別的first指標的值,能想到的最直接的辦法當然是二級指標,這是兩級指標的宿命所決定的,為了間接改變一級指標所指的記憶體位址的場景。這樣一來,node節點裡的pprev其實指向的是其前乙個節點裡的第乙個指標元素的位址。對於hlist_head來說,它裡面只有乙個指標元素,就是first指標;而對於hlist_node來說,第乙個指標元素就是next。具體如下所示:

當我們在**中看到類似與*(hlist_node->pprev)這樣的**時,此時正在雜湊表裡操作當前節點前乙個節點裡的第乙個指標元素所指向的記憶體位址,只是以間接的方式實現罷了

刪除首節點時:

刪除非首節點的情況也一樣:

下面為linux核心中刪除節點的**

在頭指標後新增節點

連續新增節點效果圖如下

以上參考:

雜湊表概念

一般的線性表 樹中,記錄在結構中的相對位置是隨機的即和記錄的關鍵字之間不存在確定的關係,在結構中查詢記錄時需進行一系列和關鍵字的比較。這一類查詢方法建立在 比較 的基礎上,查詢的效率與比較次數密切相關。理想的情況是能直接找到需要的記錄,因此必須在記錄的儲存位置和它的關鍵字之間建立一確定的對應關係f,...

雜湊表mysql MySQL中雜湊表

也稱為雜湊表 由直接定址表改進而來.先看直接定址表 當關鍵字的全域u比較小時,直接定址是一種簡單而有效的技術。加入某應用要用到乙個動態集合,其中每個元素都有乙個取自全域u 的關鍵字。同時假設沒有兩個元素具有相同的關鍵字 用乙個陣列 即直接定址表 t 0.m 1 表示動態集合,其中每個位置 或稱槽或桶...

雜湊表 基本概念

雜湊表,又稱為雜湊表,是一種根據鍵來直接訪問記憶體位置的一種資料結構。它通過乙個計算鍵值的函式 雜湊函式 來將所查詢的資料對映到雜湊表中的乙個位置來查詢該位置的內容,從而達到快速查詢的目的。存放記錄的陣列就稱為雜湊表 若關鍵字為k,則其值就存放在f k 對應的位置上,這樣可以實現不用比較就可以直接找...