CMU 15-445 -- Hash Tables - 04

news2024/11/15 13:58:58

CMU 15-445 -- Hash Tables - 04

  • 引言
  • Hash Tables
    • Hash Functions
    • Hashing Scheme
    • 小结
  • Dynamic Hash Tables
    • Chained Hashing (链式哈希)
    • Extendible Hashing(可扩展哈希)
    • Linear Hashing(线性哈希)
  • 总结


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。


本节开始之前,先看一下目前课程的进度状态:
在这里插入图片描述
为了支持 DBMS 更高效地从 pages 中读取数据,DBMS 的设计者需要灵活运用一些数据结构及算法,其中对于 DBMS 最重要的两个是:

  • Hash Tables
  • Trees

它们可能被用在 DBMS 的多个地方,包括:

  • Internal Meta-data
  • Core Data Storage
  • Temporary Data Structures
  • Table Indexes

在做相关的设计决定时,通常需要考虑两个因素:

  • Data Organization:如何将这些数据结构合理地放入 memory/pages 中,以及为了支持更高效的访问,应当存储哪些信息
  • Concurrency:如何支持数据的并发访问

Hash Tables

Hash Table 主要分为两部分:

  • Hash Function:
    • How to map a large key space into a smaller domain
    • Trade-off between being fast vs. collision rate
  • Hashing Scheme:
    • How to handle key collisions after hashing
    • Trade-off between allocating a large hash table vs. additional instructions to find/insert keys

Hash Functions

由于 DBMS 内使用的 Hash Function 并不会暴露在外,因此没必要使用加密(cryptographic)哈希函数,我们希望它速度越快,collision rate 越低越好。目前各 DBMS 主要在用的 Hash Functions 包括:

  • MurmurHash (2008)
  • Google CityHash (2011)
  • Google FarmHash (2014)
  • CLHash (2016)

Hashing Scheme

  • Linear Probe Hashing (线性探测法) :就是在发生冲突的时候,找到最近的下一个空闲位置,将 item 插入。

当 keys 可能出现重复,但 value 不同时,有两种做法:

  • Separate Linked List(分离链表):这种方法使用链表来处理哈希表中冲突的情况。当发生冲突时,即多个键被映射到同一个哈希桶(存储位置),它们将被存储在一个链表中。每个节点包含键和对应的值。通过遍历链表,可以在哈希表中找到具有相同键的不同值。这样,即使键相同,不同的值也可以被存储和访问。
  • Redundant Keys(冗余键):这种方法在哈希表中允许存储相同的键,但每个键都关联着不同的值。当发生冲突时,新的键值对可以被插入到相同的哈希桶中,作为已有键的一个冗余副本。通过遍历哈希桶中的冗余键,可以找到具有相同键的不同值。

如下图所示:
在这里插入图片描述
通常为了减少 collision 和 comparisons,Hash Table 的大小应当是 table 中元素量的两倍以上。


  • Robin Hood Hashing: 是 Linear Probe Hashing 的变种,为了防止 Linear Probe Hashing 出现连续区域导致频繁的 probe 操作。基本思路是 “劫富济贫”,即每次比较的时候,同时需要比较每个 key 距离其原本位置的距离(越近越富余,越远越贫穷),如果遇到一个已经被占用的 slot,如果它比自己富余,则可以直接替代它的位置,然后把它顺延到新的位置。
    在这里插入图片描述

  • Cuckoo Hashing (布谷鸟哈希)

本部分参考: 布谷鸟哈希(Cuckoo hash)

首先要理解布谷鸟的行为,这也是算法的核心:

  • 布谷鸟妈妈从不筑巢,它将自己的鸟蛋生在其他鸟类的巢穴里,要别的鸟给它孵蛋
  • 新出生的布谷鸟会本能地将巢穴里的其他蛋踢开(kick out ),推出鸟巢,以确保自己在鸟巢里可以独享宠爱

布谷鸟哈希有几种变种,先介绍一个哈希桶和两个哈希函数的版本:

insert逻辑

  1. 若值x已存在哈希表中,则直接返回
  2. 若insert后哈希表空间会不够,则先进行扩容,再rehash,再继续3、4、5
  3. 用哈希函数h1(x)计算出下标i1,当bucket[i1]为空时,说明鸟巢可用,插入x
  4. 若bucket[i1]非空,用新值x将bucket[i1]上的老值x’踢开(kick out),对应小布谷鸟将老蛋踢出巢穴,老蛋当然也不能坐以待毙,继续kick out别的蛋,老值x’的下一个位置用哈希函数h2(x)寻找
  5. 重复2,直到达到最大循环次数MaxLoop(插入失败);或者所有被踢开的值都找到新位置(插入完成)

lookup逻辑:查找逻辑非常简单,去可能的两个巢穴里寻找,即去下标h1(x)和h2(x)寻找,若没有匹配上,则不存在(从这里可以发现查找是非常快的,且时间复杂度稳定是O(1))

下图展示的是两个哈希函数,两个哈希桶的版本:
在这里插入图片描述
为了防止我们不会陷入一个无限循环中,一旦我们发现了一个死循环或者达到最大循环次数,我们就需要对现有的hash table进行扩容。

  • 如果使用两个hash function,那么我们大概只需要当hash table达到50%容量左右时,才需要进行扩容重建
  • 如果使用三个hash function,那么我们大概需要当hash table达到90%容量的左右时,才需要进行扩容重建

小结

以上介绍的 Hash Tables 要求使用者能够预判所存数据的总量,否则每次数量超过范围时都需要重建 Hash Table。它可能被应用在 Hash Join 的场景下,如下图所示:
在这里插入图片描述
由于 A, B 表的大小都知道,我们就可以预判到 Hash Table 的大小。


Dynamic Hash Tables

与 Static Hash Tables 需要预判最终数据量大小的情况不同,Dynamic Hash Tables 可以按需扩容缩容,本节主要介绍 Chained Hashing,Extendible Hashing 和 Linear Hashing。

Chained Hashing (链式哈希)

Chained Hashing 是 Dynamic Hash Tables 的 HelloWorld 实现,每个 key 对应一个链表,每个节点是一个 bucket,装满了就再往后挂一个 bucket。需要写操作时,需要请求 latch。

在这里插入图片描述

  • 在查找元素时,根据元素的哈希键计算出对应的槽位,并遍历该槽位的链表桶,搜索具有相同哈希键的元素
  • 对于插入和删除操作,也可以看作是查找操作的一般化。在插入元素时,需要进行查找并确定插入位置;在删除元素时,也需要查找并删除相应元素

这么做的好处就是简单,坏处就是最坏的情况下 Hash Table 可能降级成链表,使得操作的时间复杂度降格为 。


Extendible Hashing(可扩展哈希)

在Chained Hashing中,一种可行的方法是在链表变得过长时,将桶(bucket)进行分割,而不是让链表无限增长。这种方法可以避免链表过长导致的性能问题,并且需要进行分割时,只需要对特定的桶进行重新分配。

JDK 1.8中当链表长度达到8时,就将链表转换为红黑树的操作,相信大家都已经背烂了,下面给出一种不同的实现思路。

Extendible Hashing 的基本思路是一边扩容,一边 rehash,如下图所示:

在这里插入图片描述


Linear Hashing(线性哈希)

基本思想:维护一个指针,指向下一个将被拆分的 bucket,每当任意一个 bucket 溢出(标准自定,如利用率到达阈值等)时,将指针指向的 bucket 拆分。

在这里插入图片描述


总结

Hash Tables 提供 O(1) 的访问效率,因此它被大量地应用于 DBMS 的内部实现中。即便如此,它并不适合作为 table index 的数据结构,而 table index 的首选就是下节将介绍的 B+ Tree。

本节参考课程PDF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/714089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IDA疑难杂症修复】

我们在使用IDA进行逆向分析的时候,会遇到一些问题,这篇文章来带领大家学习IDA中疑难杂症的修复:函数大小限制,栈不平衡,switch无法识别(跳转表修复),ida Decompile as call。 一.函…

Redis学习(一)数据类型、Java中使用redis、缓存概念

文章目录 常用数据结构String类型Hash类型List类型Set类型SortedSet 类型 通用命令key的层级结构 Spring Data Redis快速入门RedisTemplate的序列化方式StringRedisTemplateRedisTemplate的Hash类型操作 实战操作短信登录发送验证码校验登录信息校验登录状态 商家查询缓存缓存更…

antdesignpro组件Upload传excel文件到后端flask的两种方案

(特别提醒:后端xlrd新版本不支持xlsx文件,所以暂用xls文件进行上传) 1.第一种方案:组件接收到excel文件,然后解析成list数据,解析是要用到XLSX( 安装插件:npm i xlsx --save impor…

【Leetcode】21.合并两个有序链表

一、题目 1、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例2: 输入:l1 = [], l2 = [] 输出:[]示例3: 输入:l1 = [], l2 = [0] 输…

Cesium 常用标绘线、面、矩形、圆、曲面、曲线、攻击箭头、钳击箭头,标绘与修改。

前言:直接放效果图,符合就往下看,不符合出门右转。 由于篇幅有限,只贴出各个标绘的关键代码。 1、线段 基于坐标点,加载不同的材质。 //动态加载 const entity this._viewer.entities.add({polyline: {positions: …

K8S网络管理

这里写目录标题 1 网络管理1.1Service1.1.1 网络体系1.1.2 工作模型1.1.3 SVC实践1.1.4 IPVS实践 1.2 其他资源1.2.1 域名服务1.2.2 CoreDNS1.2.3 无头服务 1.3 flannel方案1.3.1 网络方案1.3.2 flannel1.3.3 主机网络 1 网络管理 1.1Service 1.1.1 网络体系 学习目标 这一…

Shell脚本 中运行sudo命令

在shell脚本中有时需要使用sudo进行提权,运行包含这类脚本的文件时通常需要我们在终端输入sudo密码,但是在一些无人值守的应用中显然就不太适合了。本文通过构建一个多用户的ubuntu操作环境,来展示脚本中需要使用sudo命令时的应用场景。 我们…

基于vue3+vite+ts,使用nexus发布组件库

1、前提条件 已部署nexus3,可参考: Ubuntu部署和体验Nexus3-腾讯云开发者社区-腾讯云 代理设置: 【Nexus】通过Nexus搭建Npm私库_猫巳的博客-CSDN博客 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一…

Java --- springboot3之可观测性

目录 一、可观测性 二、定制健康监控的端点 三、定制metrics 四、整合PrometheusGrafana 一、可观测性 导入pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></d…

如何从PCB上直接启动Power DC直流压降仿真分析工具

如何从PCB上直接启动Power DC直流压降仿真分析工具 POWER DC的启动除了可以通过POWER DC.exe直接启动外,还可以直接通过Allegro的PCB界面直接启动,二者软件是支持关联的。如何启动,具体操作如下 用166或者172版本打开PCB点击File点击Change Edi

JVM源码剖析之JVM层面调用Java方法

先看以下2个案例。 Runnable runnable () -> {System.out.println(1); }; new Thread(runnable).start(); 为什么调用Thread的start方法就能执行Runnable的代码&#xff1f; public static void main(String[] args) {System.out.println(1); } 作为Java开发者&#x…

基于差速驱动移动基座的三维变型机器人轨迹优化

在执行任务时&#xff0c;服务机器人的功能结构变化可能会限制其自主导航能力&#xff0c;从而影响其行动力。本文的研究&#xff0c;旨在解决复杂三维环境中可变形机器人的轨迹规划问题&#xff0c;特别是应用最为广泛的基于差速驱动移动基座的移动机器人的轨迹规划。 这种全…

如何下载一个网站的全部网页文件 如何极速下载网页上的文件

许多网站上都有非常多的内容&#xff0c;一个个下载比较麻烦&#xff0c;那么我们如何下载一个网站的全部网页文件&#xff1f;我们可以使用下载软件抓取整个站点上检索出所有内容&#xff0c;然后通过过滤器选择自己需要的内容。如何极速下载网页上的文件&#xff1f;我们可以…

电脑-问题

如果使用了小米路由器&#xff0c;有望 但是平凡跳转到miwifi进行检查&#xff0c;或者显示证书问题 在浏览器设置里搜索dns&#xff0c;将 确定如何通过安全连接来连接到网站后面部分改成自定义&#xff1a; https://dns.alidns.com/dns-query 主要原因是&#xff1a; edge新…

C++图形开发(4):下落的小球

文章目录 1.小球自上而下依次出现2.下落的小球低配版3.下落的小球高配版 1.小球自上而下依次出现 首先&#xff0c;我们来使小球自上而下依次出现&#xff1a; 分析&#xff1a;要使小球自上而下依次出现&#xff0c;也就是指在一个小球出现之后让程序暂停一段时间&#xff0c…

基于单片机电子密码锁射频卡识别指纹门禁密码锁系统的设计与实现

功能介绍 通过指纹进行开锁或者是按键输入当前的密码&#xff0c;修改密码&#xff0c;对IC卡可以进行注册&#xff0c;删除。当有RFID卡进入到读卡器的读卡范围内时&#xff0c;则会自动读取卡序列号&#xff0c;单片机根据卡的序列号对卡进行判断。若该卡是有效卡&#xff0c…

【 SVG 】二、SVG 容器元素

一、本文概述 本文所介绍的 svg 中元素&#xff0c;通常不会直接作为直接展示元素&#xff0c;而是配合其他基础元素&#xff0c;以实现指定功能的图层组&#xff0c;本文围绕 svg 常用容器元素&#xff0c;进行实战应用&#xff1b; 二、 SVG 容器元素&#xff08;常用&#x…

「软件测试」最全面试问题和回答,全文背熟不拿下offer算我输

一般要应聘关于测试的工作&#xff0c;面试题会不会很难?下面小编整理了软件测试面试题及答案&#xff0c;欢迎参考! 一、引言 1.1 文档目的 本次文档是为了收集在面试中遇到的一问题与常见的一些答案并不是唯一答案 二、职业规划 2.1 简单的自我介绍下 面试宫&#xff…

层层剥开Transformer;Windows Copilot初版非常简陋

&#x1f989; AI新闻 &#x1f680; 微软Win11引入Windows Copilot功能&#xff0c;但初版非常简陋 摘要&#xff1a;微软在Win11 Build 23493预览版更新中引入了Windows Copilot功能&#xff0c;该功能在任务栏上新增了一个图标按钮。点击按钮后&#xff0c;屏幕右侧会跳出…

10_Activiti7

工作流(workflow)系统 具有工作流的系统,使用的专门的建模语言(BPMN)定义 通过计算机对业务流程自动化执行管理 使用传统方式实现 ​ 代码工作量大,若流程发生改变的话,编写 的代码也会发生响应的改变 工作流引擎 按照BPMN规范进行部署,将业务和节点的流程进行分离 没有…