哈希表
哈希表
哈希表是一种用于存储键值对
哈希表是除了数组之外,最常见的数据结构,几乎所有的语言都会有数组和哈希表这两种集合元素,有的语言将数组实现成列表,有的语言将哈希表称作结构体或者字典,但是它们其实就是两种设计集合元素的思路,数组用于表示一个元素的序列,而哈希表示的是键值对之间映射关系。当然,数组也可以看做是一个特殊的哈希表,数组中的“键”即为数组索引,值为相应的数组元素。也就是说,当哈希表中所有的键都是较小的整数时,我们可以使用数组来实现哈希表,将数组的索引作为键,而索引处的数组元素即为键对应的值,但是这一表示仅限于所有的键都是比较小的整数时,否则可能会使用一个非常大的数组。
对于基于哈希实现的哈希表,若我们要在其中查找一个键,需要进行以下步骤:
- 首先我们使用散列函数将给定键转化为一个“数组的索引”,理想情况下,不同的
key 会被转为不同的索引,但在实际应用中我们会遇到不同的键转为相同的索引的情况,这种情况叫做碰撞。 - 得到了索引后,我们就可以像访问数组一样,通过这个索引访问到相应的键值对。
以上就是哈希表的核心思想,哈希表是时空权衡的经典例子。当我们的空间无限大时,我们可以直接使用一个很大的数组来保存键值对,并用
- 哈希表查找步骤
- 哈希函数构建方法
- 直接定址法
- 数字分析法
- 折叠法
- 除法散列法
- 乘法散列法
- 平方取中法
- 随机数法
- 处理哈希碰撞的方法
- 线性探测法
- 二次探测法
- 随机探测法
- 再哈希法
- 链地址法
- 公共溢出法
- 算法实现
- 哈希表性能分析
- 哈希函数是否均匀
- 处理冲突方法
- 哈希表的装填因子
哈希表的缺陷
查找限制
比如那种同样的关键字,它能对应很多记录的情况,却不适合用散列技术。一个班级几十个学生,他们的性别有男有女,你用关键字“男”去査找,对应的有 许多学生的记录,这显然是不合适的。这个时候可以用班级学生的学号或者身份证号来散列存储,此时一个号码唯一对应一个学生才比较合适。同样哈希表也不适合范围查找,比如査找一个班级
哈希冲突
另一个问题是冲突。在理想的情况下,每一个关键字,通过散列函数计算出来的地址都是不一样的,可现实中,这只是一个理想。我们时常会碰到两个关键字