哈希表-(精品课件).pptVIP

  • 212
  • 0
  • 约4.87千字
  • 约 24页
  • 2018-10-14 发布于广西
  • 举报
* 9.4 哈希表(散列查找 ) 一 基本概念 散列查找,也称为哈希查找。它既是一种查找方法,又是一种存贮方法,称为散列存贮。散列存贮的内存存放形式也称为哈希表或散列表。 散列查找,与前面介绍的查找方法完全不同,前面介绍的所有查找都是基于待查关键字与表中元素进行比较而实现的查找方法,而散列查找是通过构造哈希函数来得到待查关键字的地址,按理论分析真正不需要用到比较的一种查找方法。 例如,要找关键字为k的元素,则只需求出函数值H(k),H(k)为给定的哈希函数,代表关键字k在存贮区中的地址,而存贮区为一块连续的内存单元,可用一个一维数组(或链表)来表示。 例,假设有一批关键字序列18,75,60,43,54,90,46,给定哈希函数H(k)=k%13,存贮区的内存地址从0到15,则可以得到每个关键字的散列地址为: H(18)=18%13=5 H(75)=75%13=10 H(60)=60%13=8 H(43)=43%13=4 H(54)=54%13=2 H(90)=90%13=12 H(46)=46%13=7 于是,根据散列地址,可以将左边7个关键字序列存贮到一个一维数组HT(哈希表或散列表)中,具体表示为: 其中HT就是散列存贮的表,称为散列表或哈希表。从哈希表中查找一个元素相当方便,例如,查找75,只需计算出H(75)=75%13=10,则可以在HT[10]中找到75。 为了保证哈希表查找得以实现,必须使记录的存放规则和查找规则一致,即:使用同样的哈希函数。在存储时,以每个记录的关键字为自变量,通过哈希函数计算出存储地址,将该记录存放在存储地址对应的存储单元中。在查找时,以查找值为自变量,通过哈希函数计算出地址,从该地址所对应的存储单元中取出记录数据。 上面讨论的哈希表是一种理想的情形,即每一个关键字对应一个唯一的地址。但是有可能出现这样的情形,两个不同的关键字有可能对应同一个内存地址,即两个记录的关键值不等,但它们的哈希函数的值相同,这样,将导致后放的关键字无法存贮,我们把这种现象叫做冲突(collision)。在散列存贮中,冲突是很难避免的,除非构造出的哈希函数为线性函数。哈希函数选得比较差,则发生冲突的可能性越大。我们把相互发生冲突的关键字互称为“同义词”。 使用哈希方法,首先要选择一个好的哈希函数,使一组关键值所得到的哈希地址能均匀分布在整个地址空间中,并且冲突次数尽可能地少。 在哈希存贮中,若发生冲突,则必须采取特殊的方法来解决冲突问题,才能使哈希查找能顺利进行。虽然冲突不可避免,但发生冲突的可能性却与三个方面因素有关。 第一:是与装填因子α有关,所谓装填因子是指哈希表中 己存入的元素个数n与哈希表的大小m的比值,即 α=n/m。当α越小时,发生冲突的可能性越小,α越 大(最大为1)时,发生冲突的可能性就越大。但是, 为了减少冲突的发生,不能将α变得太小,这样将会 造成大量存贮空间的浪费,因此必须兼顾存储空间和 冲突两个方面。 第二:是与所构造的哈希函数有关(前面己介绍)。 第三:是与解决冲突的方法有关。 哈希表的定义: 根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。 二、 哈希函数的构造 哈希函数的构造目标是使哈希地址尽可能均匀地分布在散列空间上,同时使计算尽可能简单,冲突次数少。具体常用的构造方法有如下几种: 1.直接定址法 可表示为H(k)=a.k+b,其中a、b均为常数。 这种方法计算特别简单,并且不会发生冲突,但当关键字分布不连续时,会出现很多空闲单元,将造成大量存贮单元的浪费。 2.数字分析法 对关键字序列进行分析,取那些位上数字变化多的、频率大的作为哈希函数地址。 例如,对如下的关键字序列: 9 9 3 4 6 5 3 2 9 9 3 7 2 2 4 2 9 9 3 8 7 4 3 3 9 9 3 0 1 3 6 7 9 9 3 2 2 8 1 7 9 9 3 3 8 9 6 7 9 9 3 5 4 1 5 7 9 9 3 6 8 5 3 7 9 9 3 6 8 5 3 2 ...... 通过对上述关键字序列分析,发现前3位相同,第8位只可取2、3、7,因此,这四位不可取。中间的四位的数字变化多些,可看成是随机的,若规定地址取3位,则哈希函

文档评论(0)

1亿VIP精品文档

相关文档