Hash表以及应用

本文深入解析哈希表(散列表)的工作原理,包括如何通过关键码值进行快速访问,探讨解决哈希冲突的两种常见方法:开放定址法与拉链法,并简述哈希表的实际应用。

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

哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构。

哈希表的原理非常简单,通过一个固定的算法将Key转为一个数字,然后将该数字对数组长度取余,将取余结果作为数组下标,然后将Value存储在该数字为下标的数组里。

不过想要找到一个好的哈希表非常难。原因就是通过那个固定算法得出的数字有可能会相同。显然一个下标指向的数组空间里是没有办法存储两个元素的,只能通过一些其他方法来解决冲突。这些方法虽然能够解决冲突,但是会使得查询等操作的操作速度下降。所以一个好的哈希表这样的冲突应该是要很少的。

解决哈希冲突的常见方法有两种:

开放定址法

简单来说,通过一个固定算法得出另一个数字下标,如果该位置为空,就插入,不然就重复进行。

这个方法实现起来很复杂,至今没有去实现过。

拉链法

简单来说,就是将数组和链表结合起来。在冲突的位置拉出一条链表来。

这个方法实现比较简单,但代码我都不知道扔哪去了。

值得一提的是,开放定址法得出来的是闭散列表,拉链法得出的是开散列表。

 

以下是哈希表的应用

显然两个月前的我并不知道哈希表为何物,只是用了暴力法。

这里的代码没什么好说的,没必要说。

 

一开始我就想岔了,平方查字典,后来想想,好像根本没必要。但是又想想,能用,就留着了。

这里的思路就是,将每次'快乐'得出的数字用字典记录下来,如果这次'快乐'得出的数字已经存在在字典里了,就return False,不是return 0,return 0就错了。如果'快乐'得出的数字是1,就return True。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值