很多语言都提供map的数据类型,map一个很常用的功能,那就是key-value的存储和查找功能。这种数据类型的实现原理就是通过哈希表来实现快速查找。
哈希表的基本原理:原本无序的集合经过哈希算法被重新调整位置,排列成新序列,也就是hashtable(与其说是表,不如说是某种数据结构的数组)。
以某string集合为例,如图:
原始序列 hash算法 关键字 取模(10) 重排后的数组(somestructurea[])
string1------------>> 24 ----->>4 --------->>a[4]
string2------------>> 2940 ---->>0 --------->>a[0]
string3------------>> 598 ---->>8 --------->>a[8]
string4------------>> 97 ----->>7 --------->> a[7]
此处hash算法其实包括了两部分,(1)把字符串压缩成一个整数关键字(2)对关键字取模,将2^32的整数范围压缩成10。当然由于压缩率太大,所以发生冲突的概率是很高的,实际问题的解决中不会采用这么大的压缩率。如果有冲突,参见哈希表如何解决冲突。
ok,现在来了一个新的元素string_x,我们要判断此元素是否在先前的string集合中。那么:
addr = hash(string_x)
if(a[addr].data==string_x)
return1;//找到了
else
ruturn 0;//没找到