首先什么是哈希表?
哈希表就是一个有哈希算法和冲突处理函数构造出来的数据存储表。
创建哈希表的用意:将数据元素中的关键字作为哈希算法+冲突处理方法的处理对象,得到唯一的存储位置,这样在进行查找的时候,可以方便的通过计算得到数据存储地址,而不需要像顺序表那样一个一个的比较。
怎么构建哈希表呢?
常用的构建方法:直接定址法、数字分析法、平方取中法、折叠法、除留余数法
直接定制法求地址D = H(key) = key或H(key) = a * key + b;key为数据关键字, 通过这样线性的方法求哈希地址
数字分析法:比如有5个数:10032185、10034145、10033275、10032415、100326725 这样的8位数据需要存储,使用第一种方法就不方便了,对存储地址要求较大。观察这几个数字,前三位都相同,不方便用于区别数据元素,所以取后5位中的几位,进行构建哈希表(构建方法:比如选十位百位,作为H(key)中的key,以此来求得数据元素地址),因为它们更加随机,能更好的分布在存储空间并能较好减少冲突。
平方取中法:针对像1001、1000、1010、1100、1101的数,因为每一位数不是1就是0,比较缺少随机性,所以对这类数先进行平方,在将平方得到的数,采用数字分析法进行计算数据元素地址。
折叠法:有移位叠加和间界叠加。
比如移位叠加:12123151,将数分为三份,每部分最低为对齐12 123 151进行相加得到 286 再进行H(key)计算
间接移位:就好像折纸一样 同样12123151为例,这里以百位和千位中间为折痕,得到472(21) 括号中表示“纸”这过来多的部分,然后再将这部分折叠回去得到484, 再对计算H(484)
除留余数法: H(key) = key MOD p(表长为m, p <= m),p的选择对冲突出现的次数有较大的影响,通常选p为小于m的最大质数或不包含小于20的质数因子的合数。
知道了构建,那如果遇到冲途怎么办?
常用的冲突处理方法有:开放定址法、链表地址法
以下是链表地址法,使用哈希表指向H(key)相同的链表,如果需要插入,则将数字加在链表后端。此方法比较灵活
开放定址法:Hi = (H(key) + di) MOD m i = 1, 2, ..., k(k <= m - 1)
di 有三种取法:1,2,3,...m-1,称线性探测再散列 (2)1的平方,负1的平方,2的平法,负2的平方...k <= m / 2 (3)伪随机序列,称伪随机探测再散列