1. 程式人生 > >[譯]C語言實現一個簡易的Hash table(1)

[譯]C語言實現一個簡易的Hash table(1)

說明

Hash table翻譯過來就是Hash表,是一種提供了類似於關聯陣列的資料結構,可以通過key執行搜尋、插入和刪除操作。Hash表由一些列桶(buckets)組成,而每一個bucket都是由key-value的形式組成。儲存時都是以key-value儲存的,因為當要定位一個value時,需要把key傳給一個雜湊函式(hash函式),這個函式返回一個數(索引),代表查詢的value位於哪一個bucket中。同理,當我們要從所有的buckets中取回key-value時,一樣是先把key傳給雜湊函式,再由返回的索引取到value

在陣列中,通過下標(索引)獲取值時,複雜度為O(1)

,所以Hash表上查詢和儲存資料會很快。

我們這個簡易的Hash表會使用字串作為keyvalue,這種方法也適用於任意其他型別的keyvalue。本教程只支援ASCII中的字串,unicode型別比較複雜已經超出了本教程的範圍。

本教程中的Hash表支援的API

本教程中,關聯陣列是一個未排序過的key-value集合,不允許重複的key,支援一下操作:

  • search(a, k): 如果關聯陣列a中存在k對應的v,就返回v,不存在就返回NULL
  • insert(a, k, v): 向關聯陣列a中插入k-v
  • delete(a, k): 根據k刪除一條記錄,如果k不存在則什麼也不做

本教程程式碼目錄結構

本教程中所有的程式碼都會按如下目錄結構存放:

.
├── build
└── src
    ├── hash_table.c
    ├── hash_table.h
    ├── prime.c
    └── prime.h

src目錄存放我們的原始碼,build目錄存放編譯過的二進位制檔案。

教程中的一些名詞解釋

本文中所涉及到的一些名詞解釋:

  • 關聯陣列:實現了上面的API的一種抽象資料結構,也稱對映(Map)符號表(symbol table)字典(dictionary)

  • Hash表:使用了雜湊函式實現關聯陣列的一種資料結構,也稱為雜湊對映,對映,雜湊或字典

關聯陣列可以用許多不同的底層資料結構實現。可以通過簡單地將值儲存在陣列中並在搜尋時迭代陣列來實現(非高效能的)。關聯陣列和散列表經常被混淆,因為關聯陣列經常被實現為散列表。

下一章:hash表結構


原文地址:https://github.com/jamesroutley/write-a-hash-table/tree/master/01-introduction