教你從零開始寫乙個雜湊表 導讀

2021-09-02 23:51:32 字數 921 閱讀 4541

雜湊表是乙個可以提供快速實現關聯陣列api的資料結構。跟「雜湊表」有關的一些術語也許有些讓人產生困惑,因此我在下文列了一些摘要。

雜湊表由一系列的桶組成,每乙個桶儲存乙個鍵值對。為了找到存放鍵值對的桶,關鍵字要傳遞給雜湊函式。雜湊函式返回乙個指明桶陣列下標的整數。當我們想要查詢乙個鍵值對時,我們對雜湊函式使用同樣的關鍵字,接收雜湊函式返回的陣列下標,再使用下標找到鍵值對在桶陣列的位置。

陣列定址的演算法複雜度是o(1),這使得雜湊表在儲存和查詢資料時非常的快。

我們的雜湊表將會把字串關鍵字對映為字串的(ascii碼中對應的)值,但理論上雜湊表可以將任意的關鍵字對映為任意的值型別。我們這裡只支援ascii字串,支援unicode並不是關鍵的點,而且也超出了本教程的討論範圍。

關聯陣列是無序鍵值對的集合。它不允許出現重複的關鍵字。受支援的操作如下:

安裝c語言(開發環境),請參考daniel holden的《build your own lisp》一書給出的指引。這本書非常的棒,我建議你通讀全書。

**放在以下目錄結構:

.

├── build

└── src

├── hash_table.c

├── hash_table.h

├── prime.c

└── prime.h

src目錄包含了所有**,build目錄包含了我們編譯後的二進位制檔案。

這裡有一些可以互相替換的名詞。具體如下:

關聯陣列可以通過許多不同的底層資料結構來實現。乙個(不考慮效能的)實現是通過簡單的把資料儲存在資料中,然後通過遍歷陣列來搜尋。關聯陣列和雜湊表往往會讓人產生困惑,因為關聯陣列一般是由雜湊表實現的。

教你從零開始寫乙個雜湊表

教你從零開始寫乙個雜湊表–雜湊表結構

教你從零開始寫乙個雜湊表 雜湊函式

在這一節,我們來編寫雜湊函式。我們選擇的雜湊函式應該具有 以下特性 我們使用的是常見的字串雜湊函式,偽 的表達如下 function hash string,a,num buckets hash 0 string len length string for i 0,1,string len hash...

教你從零開始寫乙個雜湊表 雜湊衝突

雜湊函式把乙個無窮大的輸入集合對映到乙個有限大小的輸出集合。不同的關鍵字可能會被對映到同乙個陣列下標,如此一來就導致了雜湊衝突。雜湊表必須實現解決衝突的方法。我們的雜湊表將使用開放位址法和再雜湊法。在桶索引衝突後,再雜湊法會使用兩個雜湊函式來計算鍵值對將要儲存的桶索引值。有關其他雜湊衝突的解決方法,...

從零開始寫乙個Redis 1

為了學習redis和更好地理解redis,決定自己寫乙個c 版本的redis 2.redis協議解析 第一,我這裡僅僅只是學習redis的思想。所以使用的是c 而且很多資料結構使用stl。第二,我這裡不追求效能,所以不會極致地去考慮效能問題,而是以實現功能為主。對於看過redis原始碼的我來說,實際...