简单介绍
- 哈希表 Hash table也称为散列表,它是可以根据关键字的值直接进行查询与访问的数据结构,我们通常通过映射函数将关键字直接对应到表中的某个位置,加快查找速度,这个映射函数叫做哈希函数。存放记录的数组叫哈希表
引出问题
- 从包含n个整数的数组a中查找整数key,存在返回1,否则返回0。用最朴素的方法就是循环遍历查找。
使用哈希表
- 加入要查找的数据范围是0到99并且类型是整型,这种情况可以直接使用数组下标来记录元素是否出现,这就是最简单的哈希思想
如上图,我们用一个初始化元素都为0的table数组记录a数组中所出现元素,例:a数组中第一个元素是7,那么我们就在table数组下标7的位置加1,依次往后。通过这种方法我们不仅可以用来查找,还能用来排序。
用哈希的思想实现排序
举个例子:如果数组a中有n个元素,n非常大,比如达到100W,但a中数据的取值范围非常小,比如从0到99,那么通过0到99长度的table,记录a中每个元素出现的次数,由于table[i]代表了数据i出现的次数,在排序时,从0到MAX_TABLE_LEN循环i,再将table[i]个i添加到a中就可以了。
但如果数组a中的数据范围不是0到99,而是int型的2的31次方或者是浮点数、字符串、甚至是数组、对象等等更复杂的元素应该怎么处理呢?这时就需要使用哈希函数了。
我们将待存储的数据转换为表长范围内的整数,然后再使用数组下标进行访问,对于整数数据可以直接取余表长,得到对应的哈希值,如果是字符串需要专门的设计哈希函数,最简单的比较遍历字符串中的字符,将它们的ASC2码相加得到整数,再取余表长得到哈希值。
例如:如果要将523插入到长度为100的table中,令523取余100得23,再将table[23]加1,那么table的下标23就记录了523这个数字。字符串abc的ASC2码分别是97 98 99,将它们相加得294取余100是94,那么table[94]就记录了abc是否出现。
哈希函数可能将不同的数据映射到同一个数组下标上,这样就发生了冲突
那么又应该如何解决哈希表的冲突问题呢?例如线性探测、拉链法