数据结构:散列表

散列表是一种通过散列函数将关键码映射到存储位置的数据结构,用于快速查找。常见散列函数包括直接定址法、除留余数法等。冲突处理方法有开放定址法(如线性探测、二次探测)和拉链法。散列表适用于单个记录的关键码查找,但不适用于范围查找或存在相同关键码的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.散列表的定义


  元素的存储位置和它的关键码之间建立一个确定的对应关系H,使得每个关键码key和唯一的存储位置H(key)相对应。在查找时,根据这个确定的对应关系找到给定值k的映射H(k),若查找集合中存在这个记录,则必定在H(k)的位置上,这种查找技术称为散列技术。

  采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表,也称为哈希表(Hash)。


  散列既是一种存储方法,也是一种查找方法。散列不是一种完整的存储结构,主要是面向查找的存储结构。

  散列方法一般不适用于多个记录有同样关键码的情况。不适用于范围查找。


  对于两个不同的关键码k1≠k2,有H(k1)=H(k2),即两个不同的记录需要存放在同一个存储位置中,这种现象称为冲突。


2.常见的散列函数


  1>直接定址法

     直接定址法的散列函数是关键码的线性函数:H(key) = a * key + b (a, b为常数)

     特点:单调,均匀,不会产生冲突,但实际中使用这种散列函数的情况很少。

     适用:事先知道关键码的分布,且关键码集合不是很大而连续性较好的情况。


  2>除留余数法

     基本思想:选择某个适当的正整数p,以关键码除以p的余数作为散列地址,即:H(key) = key mod p;

     一般情况下,散列表表长为m,通常p为小于或等于表长(最好接近m)的最小素数或不包含小于20质因子的合数。


  3>数字分析法

     根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成散列地址。


  4>平方取中法

     对关键码平方后,按散列表大小,取中间的若干位作为散列地址(平方后截取)。


  5>折叠法

     将关键码从左到右分割成位数相等的几部分,最后一部分位数可以短些,然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。


3.处理冲突的方法


  1>开放定址法:由关键码得到的散列地址一旦产生了冲突,就去寻找下一个空的散列地址,只要散列地址足够大,空的散列地址总能找到。

    1)线性探测法:当发生冲突时,线性探测法从冲突位置的下一个位置起,依次寻找空的散列地址

    2)二次探测法

  2>拉链法:将所有散列地址相同的记录,存储在一个单链表中。在散列表中存储的是所有字表的头指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值