Hash table
翻译过来就是Hash表
,是一种提供了相似于关联数组的数据结构,能够经过key
执行搜索、插入和删除操做。Hash表
由一些列桶(buckets)
组成,而每个bucket
都是由key-value
的形式组成。存储时都是以key-value
存储的,由于当要定位一个value
时,须要把key
传给一个散列函数(hash函数)
,这个函数返回一个数(索引),表明查找的value
位于哪个bucket
中。同理,当咱们要从全部的buckets
中取回key-value
时,同样是先把key
传给散列函数
,再由返回的索引取到value
。segmentfault
在数组中,经过下标(索引)获取值时,复杂度为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
目录存放编译过的二进制文件。ui
本文中所涉及到的一些名词解释:spa
映射(Map)
、符号表(symbol table)
或字典(dictionary)
关联数组能够用许多不一样的底层数据结构实现。能够经过简单地将值存储在数组中并在搜索时迭代数组来实现(非高性能的)。关联数组和散列表常常被混淆,由于关联数组常常被实现为散列表。翻译
下一章:hash表结构code