定义(たぶん?):
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
——百度百科
不难看出:散列表(哈希表)是一种数据结构。它所达成的效能是找到所需的表的一个位置。
若关键字为k,则其值存放在f(k)的存储位置上。称这样的对应关系为散列函数(哈希函数)。
——百度百科
哈希函数是使得关键字能够和结构中一个唯一的存储位置相对应的关键。
补充一个概念——键值对(“key = value”)
Key,在此处被翻译为“键”。键值对声明了一个对应关系。举几个例子:键盘上的键按下后会在屏幕上输出对应的值;每个身份证号会对应一个中国国民。
值得注意的是:
哈希函数中存在的对应关系是输入与输出单一。也就是说,哈希函数本身依旧是一种函数关系,满足函数中x只能对应一个y的性质。
但键值对中的对应关系则不同于函数。一般来说,对于一个特定的键只会有一个对应的值(value),但是在更加高级的应用情况中,一个单一的键可以对应不同的、不唯一的值。
要求:
首先给出一个公式,方便下文使用:
Address = H(key)
key是哈希表的关键字,Address是根据哈希函数得到的元素储存地址。
1、 均匀
一个合适的哈希函数应当使得Address均匀的分布在哈希表中。
2、 简单
一个简单的哈希函数可以使得地址计算的速度提高。
表中存在冲突以及解决的方法:
从上文中关于哈希表以及其内部的原始关系哈希函数的性质我们可以得知,有时候会存在这样的情况:不同的关键字值对应到同一个存储位置。即k1 != k2,但有Address1 = H(1) = Address2 = H(2)的情况。这样的内存冲突可以通过一个较均匀的哈希函数进行减少,但是无法避免。并且冲突一旦发生,必须解决。
直接寻址法:
取关键字或关键字的某个线性函数值为散列地址(注意不是关键字)。即H(key) = key或H(key) = a * key + b,a和b为常数(自身函数)。若H(key)中已经有值了,就往下一个找,直到H(key)中没有值了,就放进去。
数字分析法:
分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址
平方取中法:
当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。
当然还有其他的方法,这里不做赘述。