[譯]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表
會使用字串作為key
和value
,這種方法也適用於任意其他型別的key
和value
。本教程只支援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