算法从简单开始 - 哈希算法/哈希表

哈希算法/哈希表

我们在生活中背诵古诗,通常会整段记忆,对于计算机来说这样通段的搜索实在是太累了。
如果存在一串数字,然后通过某种算法可以将一首古诗变成这串数字,那么计算机要搜索这首古诗是否存在,只需要确认这串数字是否存在就行了。我们通常就是由哈希算法来得到这串数字的。但是实际使用中也不能排除两首古诗计算出同一串数字的可能,哈希冲突也就这么来了。

现在我们来看看几个概念


哈希表

Hash Table, 也叫散列表,是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数(或散列函数),存放记录的数组称做哈希表(散列表)。


哈希函数

定义成 hash(key) ,其中 key 表示元素的键值,则 hash(key) 的值表示经过散列函数计算得到的散列值。

哈希函数特点

  • 确定性
    如果 key1 不同于 key2, 则 hash(key1) 也不同于 hash(key2)
    但哈希函数无法绝对达到这种要求,于是产生了哈希冲突。
    因为你的(哈希)水桶不够多,又总会有新的水产生,于是总会有一部分水装不下,于是总会有新的水装到旧的桶中。

  • 哈希冲突(collision)
    哈希函数的输入和输出不是唯一对应关系的,如果两个哈希值相同,两个Key值很可能是相同的,但也可能不同。

  • 不可逆性
    一个哈希值你不能确认它到底是什么,在哪里


常见的哈希函数

  • MD5 算法

Message-Digest Algorithm 5(信息-摘要算法5)
用于确保信息传输完整一致,MD5 广泛应用于错误检查。
MD5 是输入不定长度信息,输出固定长度 128-bits 的算法。它会生成四个32位数据,最后联合起来成为一个 128-bits 散列。

  • SHA1 算法

Secure Hash Algorithm 1(安全散列算法1)是一种密码散列函数
SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

  • SHA2 算法

Secure Hash Algorithm 2(安全散列算法2)
SHA算法之一,是SHA-1的后继者。
SHA-2下又可再分为六个不同的算法标准,包括 SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256


哈希冲突的解决方法

通常有两类解决方法,一个是开放寻址方法,一个链表方法。

开放寻址方法

使用开放寻址法插入一个元素,需要连续的检查哈希表,直到找到一个空槽来放置待插入的关键字为止。检查的顺序不一定是0,1,2…m的顺序序列,而是依赖于待插入的关键字。也就是一个待插入的关键字,如果 hash(key, K) 为空,则插入 K 的位置,如果 hash(key, K) 不为空,探查 hash(key, K+1)的位置是否为空,依次类推。

线性寻址

顾名思义,就是按顺序一个一个找空位。
线性寻址很大的一个缺陷就是当哈希表中插入的数据越来越多时,哈希冲突发生的可能性就会越来越大,空闲位置会越来越少,线性探测的时间就会越来越久。

二次探测寻址

我们可以定义一个二次散列的增量序列,0,12,-12,… n2,-n2
二次探测寻址就是将探测的下标序列为 hash(key)+0,hash(key)+12或hash(key)-12,…,直到找到空置的哈希表位置。

双重散列寻址

双重散列是不只使用一个哈希函数,而是使用一组哈希函数 hash1(key),hash2(key),…。
先用第一个哈希函数,如果计算得到的存储位置已经被占用,再用第二个哈希函数,依次类推,直到找到空置的哈希表位置。

链表法

链表法是一种更加常用的哈希冲突解决办法,在哈希表中,每个位置对应一条链表,所有哈希值相同的元素都放到相同位置对应的链表中。如下图
在这里插入图片描述


哈希函数练习

哈希表有 16 个桶,哈希函数为 hash(key) = key % 13, 表中现有数据 14,34,61,39,如果使用二次探测再散列处理冲突,则 48 应该位于第几个桶内?

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值