教你從零開始寫一個哈希表--導讀

  哈希表是一個可以提供快速實現關聯數組API的數據結構。跟“哈希表”有關的一些術語也許有些讓人產生困惑,因此我在下文列了一些摘要。
  哈希表由一系列的桶組成,每一個桶保存一個鍵值對。爲了找到存放鍵值對的桶,關鍵字要傳遞給哈希函數。哈希函數返回一個指明桶數組下標的整數。當我們想要查詢一個鍵值對時,我們對哈希函數使用同樣的關鍵字,接收哈希函數返回的數組下標,再使用下標找到鍵值對在桶數組的位置。
  數組尋址的算法複雜度是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的抽象數據結構。它也叫做映射、符號表或者字典。
  • 哈希表:關聯數組使用哈希函數的快速實現。它也叫做哈希映射、哈希或者字典。

  關聯數組可以通過許多不同的底層數據結構來實現。一個(不考慮性能的)實現是通過簡單的把數據保存在數據中,然後通過遍歷數組來搜索。關聯數組和哈希表往往會讓人產生困惑,因爲關聯數組一般是由哈希表實現的。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章