哈希表(hash)又称散列表,是除顺序表存储结构、链表存储结构和索引表存储结构之外的又一种存储线性表的存储结构。设要存储的对象为n个,在内存中长度为m的连续存储单元,对象的关键字key为索引,通过hash函数hash(key)映射到相应的存储空间存储。
hash的两个主要问题:(1)设计好的hash函数;(2)设计好的冲突解决办法。
散列函数的构造方法
那么怎么样才是好的hash函数,一句话,保证散列之后的地址呈均匀分布,不要产生冲突,不要产生堆积。
(1)直接定址法:f(key) = a*key+b,这种定址法由于是线性的,不存在hash冲突。但是我们需要事先知道关键字的分布情况,适合关键字范围较小且几乎连续的情况。
(2)数字分析法:如果我们的关键字是位数较多的数字,而且某几位固定,例如我们的电话号码。那么我们就可以分析数字的规律,取不固定的且分布均匀的那几位做hash。这里用到了一个抽取的方法,这也是在计算hash中经常用到的。这种方法适合关键字的某几位分布均匀,而某几位不均匀。
(3)平方取中法:方法很简单,假设关键字是1234,平方后为1522756,我们可以抽取中间的三位数作为hash,即227。平方取中法适合不知道关键字的分布情况,而位数又不大。
(4)折叠法:将关键字从左到右分割成位数相等的部分然后求和,例