定义
哈希表(Hash table,也叫散列表),是根据关键码值(key value)来直接进行访问数据的数据结构,也就是一个关键码值通过散列函数映射到表中一个位置来进行访问数据,来加快查找的速度。
数组的特点:寻址容易,插入和删除困难;
链表的特点:寻址困难,插入和删除困难。
而哈希表综合两者的特性,实现了寻址容易,插入删除也容易的数据结构。
实现方法
1:拉链法(链表的数组)
左边为一个数组,数组的每个成员包括一个指针,指向一个链表的头,我们根据元素的一些特性把元素分配到不同的链表中去,也是根据这些特性找到正确的链表,再从链表中找出这个元素。
Hash的应用
1、用于信息安全领域中加密算法,把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做hash值;
2、查找:当我们知道这个key值后,可以直接通过哈希函数计算出这个元素在集合中的地址,从而找到这个元素,不需要一次又一次地查找;
3、Hash表在海量数据处理中有着广泛应用
优缺点
优点:一对一的查找效率很高,查找,插入,删除只需要接近常量的时间
缺点:一个关键字可能对应多个地址,可能会产生冲突,基于数组的,创建后难于扩展,当某些哈希表被基本填满时,性能下降的非常严重。
冲突的解决方案
1、建立一个缓冲区,把凡是查找的结果全部放到缓冲区中,当通过键查找的结果不对时,直接在缓冲区里找。
2、进行再探测(在其他的位置查找)
(1)线性再探测:在找到查找位置的index的index-1,index+1位置查找,index-2,index+2查找,以此类推;
(2)随机再探测 :在查找位置index周围随机的查找;
(3)再哈希:就是当冲突产生时,采用另外一种映射函数来查找。
测试题
题目:海量日志数据,提取出某日访问百度次数最多的那个IP
方案:
IP的数目是有限的,最多为2^32个,所以可以考虑使用hash将IP直接存入内存,然后进行统计。