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

說明

Hash table翻譯過來就是Hash表,是一種提供了相似於關聯數組的數據結構,能夠經過key執行搜索、插入和刪除操做。Hash表由一些列桶(buckets)組成,而每個bucket都是由key-value的形式組成。存儲時都是以key-value存儲的,由於當要定位一個value時,須要把key傳給一個散列函數(hash函數),這個函數返回一個數(索引),表明查找的value位於哪個bucket中。同理,當咱們要從全部的buckets中取回key-value時,同樣是先把key傳給散列函數,再由返回的索引取到valuesegmentfault

在數組中,經過下標(索引)獲取值時,複雜度爲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 目錄存放編譯過的二進制文件。ui

教程中的一些名詞解釋

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

  • 關聯數組:實現了上面的API的一種抽象數據結構,也稱映射(Map)符號表(symbol table)字典(dictionary)
  • Hash表:使用了散列函數實現關聯數組的一種數據結構,也稱爲哈希映射,映射,哈希或字典

關聯數組能夠用許多不一樣的底層數據結構實現。能夠經過簡單地將值存儲在數組中並在搜索時迭代數組來實現(非高性能的)。關聯數組和散列表常常被混淆,由於關聯數組常常被實現爲散列表。翻譯

下一章:hash表結構code

相關文章
相關標籤/搜索