散列表

散列表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过映射函数把关键字值映射到表中的某一个位置来访问记录,以加快查找的速度。散列技术就是在记录的关键字和存储位置之间建立一个确定的对应关系f,使得每个关键字,对应一个存储位置。这种对应关系f叫做散列函数或哈希函数,采用散列技术将记录存储在一块连续的存储空间中,这块存储记录的...
摘要由CSDN通过智能技术生成

散列表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过映射函数把关键字值映射到表中的某一个位置来访问记录,以加快查找的速度。

散列技术就是在记录的关键字和存储位置之间建立一个确定的对应关系f,使得每个关键字,对应一个存储位置。这种对应关系f叫做散列函数或哈希函数,采用散列技术将记录存储在一块连续的存储空间中,这块存储记录的连续的存储空间叫做散列表或哈希表。

散列表是一种面向查找的存储结构,与链表、树、图的不同点在于,散列表存储记录之间没有任何逻辑关系,而其他的记录之间都存在着某种逻辑关系。

散列表是一种既适用于静态查找问题,又适用于动态查找问题,并且查找效率非常高的存储结构。哈希查找的主要问题在于哈希表的设计。

Hash函数

理想情况下,即在查找时不经过任何比较,一次就可以直接从哈希表中拿到要搜索的值。此时,存在 Hash()函数,使得每个关键码(key)与结构中的一个唯一的存储位置(Address)相对应。
A d d r e s s = H a s h ( k e y ) Address = Hash(key) Address=Hash(key)
但是实际情况并非如此,在使用哈希表时,数据寻址过程中不可避免的会发生哈希冲突。因此哈希函数的设计至关重要。

hash函数设计的准则:

  • 分布均匀:哈希函数计算出来的地址尽可能的在存储空间范围内分布均匀
  • 尽可能的简单:算法不能太过复杂,其哈希函数的复杂度不能超过其他查找技术与关键字比较的时间
  • 能够解决哈希冲突

常见的散列函数:

(1)直接定址法: 取关键字的某个线性函数值作为散列地址,简单的说就是通过关键字的加减乘除来得到一个散列地址。
f ( k e y ) = a ∗ k e y + b f(key) = a * key + b f(key)=akey+b
(2)数字分析法: 通常用于处理关键字位数比较大的情况,抽取关键字的某几位数来求散列地址。

(3)平方取中法: 将关键字平方之后取中间若干位数字作为散列地址。

(4)折叠法: 将关键字从左到右分割成位数相等的几部分,然后将这几部分叠加求和,并按散列表表长取后几位作为散列地址。

(5)除留余数法: 最常用的散列函数,对于散列表长为m的散列函数计算公式为:
f ( k e y ) = k e y % p ( p &lt; = m ) ( p 为 小 于 或 等 于 m 的 最 小 质 数 ) f(key) = key \% p (p &lt;= m) (p为小于或等于m的最小质数) f(key)=key%p(p<=m)pm
关于p的选取,书中提到p应为小于或等于m的最小质数,但是在实际中我们发现当 m=12 时,p应该取11,但是当p=11时,索引为11的地址是不可达的。因此散列表中桶的数量的选取也需要注意。

事实上,这个方法不仅可以对关键字直接取模, 也可以通过折叠、平方取中后再取模。

(6)随机数法:选择一个随机数,取关键字的随机函数值为它的散列地址。
f ( k e y ) = r a n d o m ( k e y ) ( r a n d o m 是 随 机 函 数 , 当 关 键 字 长 度 不 等 时 , 采 用 这 个 方 法 比 较 合 适 ) f(key) = random(key)(random是随机函数,当关键字长度不等时,采用这个方法比较合适) f(key)=

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值