教你從零開始寫一個雜湊表--導讀
阿新 • • 發佈:2018-12-16
雜湊表是一個可以提供快速實現關聯陣列的資料結構。“雜湊”一詞會讓人產生困惑,下面我做了個總結。
雜湊表由一系列的桶組成,每一個桶儲存一個鍵值對。為了能夠確定一個鍵值對應該儲存在哪個桶裡,關鍵字要傳遞給雜湊函式。雜湊函式返回一個指明桶陣列索引的整數。當我們想要查詢一個鍵值對時,我們對關鍵字應用同樣的雜湊函式,查詢它的索引,然後使用索引找到鍵值對在桶陣列的位置。
陣列定址的演算法複雜度是O(1)
,這使得雜湊表在儲存和查詢資料時非常的快。
我們的雜湊表將會把字串關鍵字對映為字串的(ASCII碼中對應的)值,但理論上雜湊表可以將任意的關鍵字對映為任意的值型別。我們這裡只支援ASCII字串,支援unicode並不是關鍵的點,而且也超出了本教程的討論範圍。
API
關聯陣列是無序鍵值對的集合。它不允許出現重複的關鍵字。受支援的操作如下:
search(a, k)
:從關聯陣列a
中返回跟關鍵字k
關聯的值v
;如果關鍵字不存在,返回NULL
insert(a, k, v)
:將k:v
鍵值對儲存到關聯陣列a
中delete(a, k)
:刪除跟關鍵字k
關聯的鍵值對k:v
;如果關鍵字k
不存在,不做任何操作
安裝
安裝C語言(開發環境),請參考Daniel Holden的《Build Your Own Lisp》一書給出的指引。這本書非常的棒,我建議你通讀全書。
程式碼結構
程式碼放在以下目錄結構:
.
├── build
└── src
├── hash_table.c
├── hash_table.h
├── prime.c
└── prime.h
src
目錄包含了所有程式碼,build
目錄包含了我們編譯後的二進位制檔案。
術語
這裡有一些可以互相替換的名詞。具體如下:
- 關聯陣列:實現了上文所講的API的抽象資料結構。它也叫做對映、符號表或者字典。
- 雜湊表:關聯陣列使用雜湊函式的快速實現。它也叫做雜湊對映、雜湊或者字典。
關聯陣列可以通過許多不同的底層資料結構來實現。一個(不考慮效能的)實現是通過簡單的把資料儲存在資料中,然後通過遍歷陣列來搜尋。關聯陣列和雜湊表往往會讓人產生困惑,因為關聯陣列一般是由雜湊表實現的。
上一篇:教你從零開始寫一個雜湊表
下一篇:教你從零開始寫一個雜湊表–雜湊表結構