[译]C语言实现一个简易的Hash table(1)

26次阅读

共计 934 个字符,预计需要花费 3 分钟才能阅读完成。

说明
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 表结构

正文完
 0