哈希函数

来源:互联网 发布:c语言结构体数组 编辑:程序博客网 时间:2024/05/16 00:57

一、哈希表的概念及作用

一般的线性表,树中,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较“的基础上,查找的效率依赖于查找过程中所进行的比较次数。

  理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。

  哈希表中元素是由哈希函数确定的。将数据元素的关键字K作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。表示为:

  Addr = H(key)

  为此在建立一个哈希表之前需要解决两个主要问题:

  ⑴构造一个合适的哈希函数

  均匀性 H(key)的值均匀分布在哈希表中;

  简单 以提高地址计算的速度

  ⑵冲突的处理

  冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。即关键字K1≠K2,但H(K1)= H(K2)。均匀的哈希函数可以减少冲突,但不能避免冲突。发生冲突后,必须解决;也即必须寻找下一个可用地址。

 

二、哈希表的构造方法

1、直接定址法


  例如:有一个从1到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身。

  

2、数字分析法


  有学生的生日数据如下:

  年.月.日

  75.10.03

  75.11.23

  76.03.02

  76.07.12

  75.04.21

  76.02.15

  ...

  经分析,第一位,第二位,第三位重复的可能性大,取这三位造成冲突的机会增加,所以尽量不取前三位,取后三位比较好。

  

3、平方取中法


  取关键字平方后的中间几位为哈希地址。

  

4、折叠法


  将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法。

  例如:每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,当馆藏书种类不到10,000时,可采用此法构造一个四位数的哈希函数。

  

5、除留余数法


  取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。

  H(key)=key MOD p (p<=m)

  

6、随机数法


  选择一个随机函数,取关键字的随机函数值为它的哈希地址,即

  H(key)=random(key) ,其中random为随机函数。通常用于关键字长度不等时采用此法。

  若已知哈希函数及冲突处理方法,哈希表的建立步骤如下:

  Step1. 取出一个数据元素的关键字key,计算其则哈希表中的存储地址D=H(key)。若存储地址为D的存储空间还没有被占用,则将该数据元素存入;否则发生冲突,执行Step2。

  Step2. 根据规定的冲突处理方法,计算关键字为key的数据元素之下一个存储地址。若该存储地址的存储空间没有被占用,则存入;否则继续执行Step2,直到找出一个存储空间没有被占用的存储地址为止。

 

URL:http://baike.baidu.com/view/549615.htm