CMU15-445/645 Lecture#6 Hash Tables

Hash Tables

哈希表实现了将键映射到值的无序关联数组。它使用哈希函数为给定键计算数组的偏移量,从该偏移量可以
可以找到值。

空间复杂度:O(n)

操作复杂度:

→平均:O(1)

→最差:O(n)

Static Hash Tables

分配一个巨大的数组,该数组为您需要存储的每个元素分配一个插槽。

要查找条目,请通过%n以找到数组中的偏移量

1

前提

您会提前知道元素的数量

每个键都是唯一的

最完美的的哈希函数:

→ 如果key1key2,则 hash(key1)hash(key2)

Hash Funcations

对于任何输入key,返回该key的对应的整数。
我们不想对DBMS哈希表使用加密哈希函数。而且我们想要快速且碰撞率低的Hash算法。

CRC-64 (1975)

→ 在网络中用于错误检测

MurmurHash (2008)

→ 设计用于快速通用哈希函数

Google CityHash (2011)

→ 设计为了较短的key(<64 bytes).

Facebook XXHash (2012)

→ 来自zstd压缩的创建者

Google FarmHash (2014)

→ 较新版本的CityHash具有更低的冲突率

其中XXHash表现是最好的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XPGNBtQ-1589114718618)(./img/06-02.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oCYpNESj-1589114718621)(./img/06-03.png)]

静态哈希方案

开放地址Hash

插入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DvM2lknI-1589114718625)(./img/06-04.png)]

解决冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l5GIPv7c-1589114718628)(./img/06-05.png)]

删除

设置墓碑

如图想要删除C,避免当C被删除找不到D,需要在C的位置上设置一个标志(墓碑)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ld20kcT-1589114718629)(./img/06-06.png)]

移动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ps2PX2F0-1589114718631)(./img/06-07.png)]

非唯一性索引

选择1:单独的链表

→将每个键的值存储在单独的存储区中。

选择2:冗余密钥

→将重复的键条目存储在哈希表中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFVpmiDm-1589114718635)(./img/06-08.png)]

罗宾汉Hash

线性探针哈希的变体,可从“rich”key中窃取插槽并将其分配给“poor”key

→每个键从表中的最佳位置开始跟踪它们的位置数。

→插入时,如果第一个key比第二个key更远离其最佳位置,则一个key会占用另一个key的插槽。

插入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egH0vhNe-1589114718637)(./img/06-09.png)]

解决冲突

寻找插槽

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xNX5fCZ-1589114718638)(./img/06-10.png)]

调整位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ja109YjB-1589114718640)(./img/06-11.png)]

布谷鸟Hash

将多个哈希表与不同的哈希函数seed一起使用。

→在插入时,检查每张table并选择有空位的任何一个槽。

→如果没有表具有可用空间,请从其中一个表中逐出该元素,然后将其重新哈希以找到新位置。

查找和删除始终为O(1),因为每个哈希表仅检查一个位置。

插入

有两个空位

随便选择一个

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MT9LhSyL-1589114718643)(./img/06-12.png)]

有一个空位

插入到空位中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLPPQ9b2-1589114718645)(./img/06-13.png)]

解决冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dcirm2c4-1589114718647)(./img/06-14.png)]

动态哈希方案

先前的哈希表要求DBMS知道其要存储的元素数量

→否则,如果需要增加/缩小大小,它将重建表

动态哈希表可根据需要调整大小

→链式散列

→可扩展哈希

→线性散列

链式Hash

维护哈希表中每个插槽的存储桶的链表

通过将具有相同哈希键的所有元素放入同一存储桶中来解决冲突

→要确定是否存在某个元素,请哈希到其存储桶并对其进行扫描

→插入和删除是查找的概括

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCRYxEIm-1589114718649)(./img/06-15.png)]

对于链式Hash,如果没有空间剩余,将会分配overflow buckets, 用链表把它们连接起来。(长的链表降低了性能)

可扩展Hash

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtd8FDus-1589114718652)(./img/06-16.png)]

查找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ONCMeVNp-1589114718653)(./img/06-17.png)]

插入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WN7nRCrW-1589114718656)(./img/06-18.png)]

解决冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UfPQpjta-1589114718658)(./img/06-19.png)]

线性Hash

线性Hash相较于可扩展Hash最大不同就是,在可扩展Hash中遇到OverFlow需要将数组翻倍。而线性Hash只需要分裂Split指针指向的Bucket

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibu2D104-1589114718659)(./img/06-20.png)]

解决冲突

可见在发生OverFlow时,并不会拆分发生溢出的Buckets,而是拆分Split指针指向的值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C5HS6f9J-1589114718665)(./img/06-21.png)]

查找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ak9KSEFU-1589114718671)(./img/06-22.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12i7Gz84-1589114718675)(./img/06-23.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值