哈希表小结

  • 什么是哈希表?

理想情况是希望不经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置 f(k) 和它的关键字 k 之间建立一个确定的关系 f 。使每个关键字,通过f(k)找到对应的存储位置。因此不需要任何比较便能得到所查记录。为此,我们称这个对应关系 f 为哈希函数(Hash),按这个思想建立的表为哈希表

哈希函数就像在新华字典查找一个字,按拼音或笔画(key) 先查到页数( f(key) 地址) ,再去对应页数找对应的字(记录)。

如果不是按这样来,那就需要从字典的第一个字开始比较,直到比较得到一个字与你要的字相等,这样也太麻烦了。

 

  • 哈希碰撞/冲突

我们的理想是对于同一个key只有一个哈希地址与之对应。但现实不是这样的,可能不同的key,却可以得到相同的哈希地址,因为 f(key) 它只能保证你输入一个key,它能给你一个哈希地址。但是并不能保证 f(k1) != f(k2)。就像查字典,你并不能保证按不同的拼音查可以得到不同的页数,因为也可以得到相同的页数,就比如多音字。这一现象称为冲突/哈希碰撞。冲突只能尽可能地少,不能完全避免。

 

  • 哈希表

用哈希函数 H(key) 将一组关键字映像到一个有限的连续的地址集上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表。这个过程称为哈希造表散列,所得的储存位置称哈希地址散列地址。所以哈希表也称散列表

 

  • 哈希函数的构造方法

直接定址法   H(key) = key 或 H(key) = a*key + b

数字分析法

平方取中法

折叠法

除留余数法   H(key) = key MOD p ,p <= m (m为哈希表长)

随机数法

一个好的哈希表取决于好的哈希函数,好的哈希函数取决于好的构造方法。这里不详细介绍构造方法了。

 

  • 处理哈希碰撞的方法

1.开放定址法   

H(i) = ( H(key) + d_{i} ) MOD m    ,【 i=1,2,...,k  (k<= m-1) 】

H(key) 为哈希函数(发生碰撞时则使用H(i))   m为哈希表表长    d_{i}为增量序列   MOD是取余

所以根据 增量序列 的不同表示,又分三种:

d_{i}  = 1,2,3,...,m-1 时,称线性探测再散列

d_{i} = 1^{2},2^{2},3^{2},...,,-1^{2},2^{2},3^{2},...,2^{2},-2^{2},...,\pm k^{2} 时,称二次探测再散列

d_{i}  = 伪随机序列 时,称随机探测再散列

至于上面说的是啥意思,看一个例子:

2.再哈希法

H(i) = RH(key)   ,i=1,2,...,k

R 和 H 均是不同的哈希函数,当H(key)产生的地址冲突时,用H(i)计算得到新的哈希地址,直到不发生冲突。

3.链地址法

将所有关键字为同义词的记录存储在同一线性链表中。看一个例子:

4.建立一个公共溢出区 不详细介绍了

 

 

 

 

 

 

哈希表是一种重要的数据结构,用于实现快速查找。在电话簿查询系统中,哈希表可用于存储电话号码和对应的联系人姓名等信息。本次实验中,我们采用了线性探测法解决哈希表中的冲突问题。 线性探测法是指当哈希表中某个槽已经被占用时,继续往后探测,直到找到一个空槽为止。我们可以通过一个叫做“探测长度”的变量来记录需要探测的距离,以免陷入死循环。 在实现哈希表时,我们需要考虑以下几个问题: 1. 哈希函数的设计:哈希函数决定了元素在哈希表中的位置。一个好的哈希函数需要满足以下几个条件:均匀性、高效性、容易实现。 2. 哈希表的大小:哈希表的大小需要根据实际情况进行调整,通常需要考虑数据规模和内存限制等因素。 3. 冲突解决方法:哈希表中可能会存在冲突,我们需要采用合适的方法解决。 在本次实验中,我们使用了C语言实现了一个简单的电话簿查询系统。具体实现过程如下: 1. 定义了一个哈希表结构体,包含了哈希表的大小、元素个数、哈希函数和数据数组等信息。 2. 实现了一个简单的哈希函数,将字符串转换为一个整数作为哈希值。 3. 采用线性探测法解决了哈希表中的冲突问题。 4. 实现了插入、删除和查找等操作。 5. 最后,我们对实验进行了测试,并得出了一些结论。例如,随着哈希表大小的增加,查询时间逐渐减少,但空间占用也会增加。 总的来说,本次实验让我们更加深入地理解了哈希表和线性探测法,并提高了我们的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值