哈希表
哈希表是一种数据结构,基于数组实现,但存取方式和数组不同。
哈希表可以认为是一种特殊的数组,一个重要的特性是“数据项的关键字与数组下标有关联”。(数据项的关键字经过简单计算便可得到数组下标,从而实现快速存取)
优点与缺点
- 优点
- 提供快速的插入操作和查找操作,时间复杂度接近O(1)。
- 编程实现相对容易。
- 缺点
- 基于数组,一是创建后难于扩展,二是基本填满时性能下降严重。
- 难以进行数据有序遍历。
因此,当可以提前预测数据量的大小且不需要有序地遍历数据时,使用哈希表具有巨大的优势。
哈希化
-
什么是哈希化?
- 哈希化概念:通过映射方法(即哈希函数)把一个巨大的整数范围转化为一个可接受的数组范围中。对哈希表来说是把较大的关键字值范围压缩成较小的数组下标范围。
- 哈希化过程(哈希函数步骤):
- 具有唯一标识作用的原始数据—s1—>合适的整数关键字—s2—>数组下标
- s1: 有些原始数据虽然具备唯一标识特征,但可能不是数字(如字符串),也有可能存在冗余数字位(如校验位),需要将其处理为合适的整数关键字。属于预处理过程。
- s2: 一般对整数关键字取余得到数组下标。
-
为什么要哈希化?
- 数据存储快速:
- 整数关键字与数组下标存在映射关系,可以通过关键字获取数组下标直接存取数据,而不用像普通数组那样通过遍历来存取数据。
- 节省空间:
- 将大范围整数压缩成小范围,需要的数组长度变小了。
- 数据存储快速:
-
哈希函数的要求:
- 能将整数关键字范围转化为数组下标值,即关键字要和数组下标要有关联。
- 简单能快速计算,即各种运算尽量要少。
- 大范围的数字经过哈希映射后应随机地分布在这个小的数字范围。
- 要保证大部分关键字不能被数组容量整除,否则关键字经哈希函数映射后容易在某处聚集,影响存取效率。
-
哈希函数的形式:
- 关键字范围足够小且组织比较连续时:
- 可以不用哈希函数映射,关键字直接作为数组的下标。
- 关键字随机分布时:
- key % arraySize(其中arraySize是数组容量),这种取余操作效果比较好。
- 关键字非随机分布时:(一般需要对关键字进行预处理,再取余)
- 不要使用关键字中无效的数据位。关键字一般是位数比较高的整数,有些位对唯一标识这个关键字不起作用,如校验位,应舍弃这些位。
- 折叠关键字。如哈希表数组容量为1000,对于一个原始关键字123456789,可折叠为123+456+789=1368,再对容量1000取余得到数组下标368。每组包含几个数字应该根据数组容量来选择。
- 关键字范围足够小且组织比较连续时:
-
举例说明:
- 有时候虽然整数范围很大,但实际的数据项个数却相对较少。比如说一组整数 0,100,1000&#x