1. 程式人生 > >教你從零開始寫一個雜湊表--導讀

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

  雜湊表是一個可以提供快速實現關聯陣列的資料結構。“雜湊”一詞會讓人產生困惑,下面我做了個總結。
  雜湊表由一系列的桶組成,每一個桶儲存一個鍵值對。為了能夠確定一個鍵值對應該儲存在哪個桶裡,關鍵字要傳遞給雜湊函式。雜湊函式返回一個指明桶陣列索引的整數。當我們想要查詢一個鍵值對時,我們對關鍵字應用同樣的雜湊函式,查詢它的索引,然後使用索引找到鍵值對在桶陣列的位置。
  陣列定址的演算法複雜度是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的抽象資料結構。它也叫做對映、符號表或者字典。
  • 雜湊表:關聯陣列使用雜湊函式的快速實現。它也叫做雜湊對映、雜湊或者字典。

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

上一篇:教你從零開始寫一個雜湊表
下一篇:教你從零開始寫一個雜湊表–雜湊表結構