哈希表(Hash table,也叫散列表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表
哈希表示意图
- 左侧是我们要处理的内容
- 中间是散列函数,其作用是根据传进来的key,来生成一个index
- 右侧是一个数组,称之为散列表,其作用是存储内容。散列函数生成的index 就是散列表中存储内容的index(查询的时候根据index就能快速查到)
-
当散列函数生成的index出现重复时,称为 哈希冲突。所以散列函数的质量,决定了整个哈希表的质量。
-
出现哈希冲突时,散列表就不能单纯的在index处存储key了,会在index出创建一个链表(拉链操作),key会依次存入到链表中。由于链表的查询时间复杂度为O(n),所以哈希表在最坏的情况下,查询的时间复杂度 = O(n)
哈希表的时间复杂度
| / | 查询(最优) | 插入(最优) | 删除(最优) | 查询(最差) | 插入(最差) | 删除(最差) |
|---|---|---|---|---|---|---|
| Hash table | O(1) | O(1) | O(1) | O(n) | O(n) | O(n) |
哈希表与其他数据结构的关系
很多数据结构底层都采用了哈希表来时间,例如Java的Map 和 Dictionary
参考代码
最后有一段个人实现的代码,感兴趣的可以参考