DBS note6:Hashing(哈希存储)

目录

一、一般策略

二、算法简述

三、哈希缺点(Drawbacks of Hashing)

四、举例

五、外部哈希的分析


一、一般策略

由于我们无法一次性将所有数据放入内存中,我们需要构建多个不同的哈希表并将它们连接在一起。然而,这个想法存在一个问题。

如果我们构建了两个分开的哈希表,它们中都包含相同的值(例如,“Brian” 同时出现在两个表中),那么连接这两个表将导致一些 “Brian” 并非相邻。

为了解决这个问题,在将内存中的数据构建成哈希表之前,我们需要确保如果某个特定值存在于内存中,那么它的所有出现也都在内存中。换句话说,如果 “Brian” 至少在内存中出现一次,那么只有当我们的数据中的每个 “Brian” 出现都在内存中时,我们才能构建哈希表。这确保了值只能出现在一个哈希表中,使得哈希表可以安全连接。

二、算法简述

我们将使用分治算法来解决这个问题。在 “divide” 阶段,我们执行分区传递,在 “conquer” 阶段,我们构建哈希表。就像在排序笔记中一样,我们假设有 B 个可用的缓冲帧。在对数据进行哈希时,我们将使用其中 1 个缓冲区作为输入缓冲区,剩下的 B-1 个缓冲区作为输出缓冲区。

我们开始将数据从磁盘流式传输到一个输入缓冲区。有了这些输入数据后,我们希望将它们分成几个部分。每个部分都是一组页面,这些页面上的值通过特定的哈希函数都被映射到相同的哈希值。在第一轮分割中,我们会将输入缓冲区中的每条记录通过哈希函数分到 B-1 个部分中,每个部分对应 B-1 个输出缓冲区中的一个。如果某个输出缓冲区已满,相应的页面就会被写入磁盘,然后哈希过程继续。所有来自同一缓冲区的刷新页面都会在磁盘上相邻存储。第一轮分割结束时,我们在磁盘上存储了 B-1 个部分,每个部分的数据都是连续存储的。

分区的一个重要特性是,如果某个值出现在一个分区中,我们数据中所有该值的出现都会位于同一个分区。这是因为相同的值将被哈希到相同的位置。例如,如果 “Brian” 出现在一个分区中, “Brian” 将不会出现在任何其他分区中。

在第一轮分割后,我们得到了 B-1 个大小不同的分区。对于能够放入内存的分区(分区的大小小于或等于 B 页),我们可以直接进入“conquer ”阶段,开始构建哈希表。对于太大的分区,我们需要使用不同于第一轮中使用的哈希函数进行递归分区。为什么要使用不同的哈希函数呢?如果我们重复使用原始函数,每个值都将哈希到其原始分区,因此分区的大小不会减小。我们可以使用不同的哈希函数进行递归分区,直到所有分区最多有 B 页为止。

一旦所有的分区都能够放入内存,并且相同的值都出现在同一个分区中(根据分区的特性),我们就可以开始 “conquer” 阶段。首先,我们为构建最终哈希表选择一个新的哈希函数。然后,对于每个分区,我们将分区流式传输到内存中,使用新的哈希函数创建哈希表,并将生成的哈希表刷新回磁盘。

三、哈希缺点(Drawbacks of Hashing)

需要注意的是,哈希对数据倾斜非常敏感。数据倾斜发生在我们进行哈希的值不符合均匀分布的情况下。由于哈希分区的特性(相同值的所有哈希最终都会在同一个分区中),数据倾斜可能导致分区大小非常不均匀,这对我们的目的来说是不理想的。此外,并非所有的哈希函数都是相同的。在最理想的情况下,我们的哈希函数是一个均匀的哈希函数,将数据分成“均匀”的大小相等的分区。然而,哈希函数通常是非均匀的,会在所有分区之间不均匀地分布数据。在本课程中,除非另有说明,我们将使用均匀哈希函数。在下面的两个图像中,圆柱体表示在磁盘上发生的步骤,正方形表示在内存中发生的步骤,两者之间的线表示数据在磁盘和内存之间的流动。

下面的图像展示了哈希的两个阶段 - divide 和 conquer - 当不需要递归分区时。这意味着在初始分区后,所有分区都适合于 B 页内。请注意,在 “divide ” 阶段中,1 个缓冲页专用于输入缓冲区,其余的 B-1 个用于分区。然后,在 “conquer ” 阶段中,对每个单独的分区使用不同的哈希函数 h_r 来形成内存中的哈希表。

下面的图像显示了递归分区。请注意,附加的阶段仅适用于大小大于 B 页的分区(灰色分区)。

四、举例

在以下示例中,我们假设我们有 B=3 个缓冲页可用。我们还假设对于第一个哈希函数,Brian 和 Eric 哈希到相同的值,但对于第二个哈希函数,它们哈希到不同的值,而 Jamie 和 Lakshya 对于第一个哈希函数哈希到相同的值。

在第一次分区传递(分区传递 1)后,分区 0 有 4 页,分区 1 有 2 页。分区 1 可以放入内存,但分区 0 不能。这意味着我们必须对分区 0 进行递归分区。

经过第二次分区传递后,分区 0 被分为两部分:分区 0.a 有 2 页,分区 0.b 有 2 页。由于分区 1 已经适应内存,所以在第二次分区传递期间它没有被分区。

一旦所有分区(0.a、0.b、1)适应内存,我们执行 "conquer" 并构建哈希表。可以看到在最终的 "conquer" 后,所有相同值都在一起,这是我们的最终目标。

五、外部哈希的分析

我们无法像排序算法中那样简单地创建一个计算I/O数量的公式,因为我们不知道分区的大小。我们首先需要认识到的一件事是,在分区后表的页数可能会增加。为了理解这一点,考虑下面的表,我们可以在一页上容纳两个整数:

[1, 2] [1, 4] [3, 4]

假设B=3,因此我们只将数据分为2个分区。假设1和3散列到分区1,2和4散列到分区2。分区后,分区1将包含:

[1, 1],[3]

而分区2将包含:

[4, 2],[4]

请注意,我们现在有4页,而我们一开始只有3页。因此,计算 I/O 数量的唯一可靠方法是查看每个阶段,看看将读取什么和将写入什么。设 m 为所需的总分区次数,r_i为第 i 个分区阶段需要读取的页数,w_i 为第 i 个分区阶段需要写出的页数,X 为分区后我们需要构建哈希表的总页数。以下是 I/O 数量的公式:

$(\sum_{i=1}^{m}r_i+w_i)+2X$

这个求和并没有告诉我们任何我们之前不知道的东西;我们需要逐个阶段地查看并弄清楚究竟读取了什么和写入了什么。最后的2X部分表示,为了构建我们的哈希表,我们需要读取和写入分区后拥有的每一页。

以下是一些重要的性质:

  1. r_0 = N
  2. r_i \leq w_i
  3. w_i \geq r_i+1
  4. X \geq N

性质 1 表示我们在第一次分区时必须读取每一页。这直接来自算法。

性质 2 表示在分区期间,我们将写出至少与读入的页数相同的页面。这直接来自上面的解释 - 我们可能在分区 partitioning pass 期间创建额外的页面。

性质 3 表示我们在分区通行期间读入的页面数不会超过之前写出的页面数。在最坏的情况下,第 i 次通行的每个分区都需要重新分区,因此这将要求我们读入每一页。然而,在大多数情况下,某些分区将足够小以适应内存,因此我们可以读入比上一次通行期间产生的页面更少的页面。

性质 4 表示我们用于构建哈希表的页面数至少与我们开始时的数据页面数一样多。这源于分区pass期间只能增加数据页数,而不能减少。

以上,DBS note6:Hashing(哈希存储)

祝好。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Threa…

如何提高3D建模技能?

无论是制作影视动画还是视频游戏,提高3D建模技能对于你的工作都至关重要的。那么如何能创建出精美的3D模型呢?本文给大家一些3D建模技能方面的建议。 3D建模通过专门的软件完成,涉及制作三维对象。这项技能在视频游戏开发、建筑、动画和产品…

18、串口通信

串口介绍 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机,单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围&…

大模型能否生成搜索引擎的未来?

文|郝 鑫 编|刘雨琦 ChatGPT火爆之前,水面下,也有中国公司也在朝着智能助手的方向努力。夸克便是其中之一。在GPT风靡科技圈后,国内就开始陆续冒出一些大模型厂商。对当时夸克而言,做大模型毋庸置疑&am…

Python list列表添加元素的3种方法及删除元素的3种方法

Python list列表添加元素的3种方法 Python list 列表增加元素可调用列表的 append() 方法,该方法会把传入的参数追加到列表的最后面。 append() 方法既可接收单个值,也可接收元组、列表等,但该方法只是把元组、列表当成单个元素,这…

“逆风飞翔·事实孤儿同行计划”成长陪伴主题区域陪伴培训会

为推进各机构更好地开展事实孤儿成长陪伴工作,促进事实孤儿成长陪伴实施成效,搭建各机构间事实孤儿成长陪伴方式方法交流平台。11月26日,在中国乡村发展基金会、中国民生银行的支持下,由湖南省大爱无疆青少年公益发展中心主办&…

ZZULIOJ 2466: 楼上瞎说,楼下才是,Java

2466: 楼上瞎说,楼下才是 题目描述 《九章算术》的内容十分丰富,全书采用问题集的形式,收有246个与生产、生活实践有联系的应用问题,其中每道题有问(题目)、答(答案)、术&#xff…

MySQL事务详解

MySQL事务详解 数据库事务概述事务是如何实现的事务的ACID特性事务的状态 事务的使用显式事务隐式事务示例自动提交回滚回滚到保存点 事务的隔离级别数据并发问题MySQL 支持的四种隔离级别注意示例 设置隔离级别 事务的常见分类 数据库事务概述 数据库事务是数据库管理系统&am…

【Linux】:信号(一)产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.core文件 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 像这种程序在…

华为云之云桌面Workspace的使用体验

华为云之云桌面Workspace的使用体验 一、云桌面Workspace介绍1.云桌面简介2.云桌面特点3. 云桌面应用场景①远程移动办公②协同办公③安全办公④公用终端⑤图形制作渲染 二、本次实践介绍1. 本次实践目的2. 本次实践环境 三、购买云桌面1. 进入华为云的云桌面购买界面2. 选择购…

Linux下删除当前目录下的所有目录

Linux下删除当前目录下的所有目录 Linux下删除当前目录下的所有目录,可以使用命令:rm -rf ./* rm -rf ./*可以得知rm -rf ./命令是删除当前目录下的所有文件和文件夹,但不会删除根目录下的文件。其中,".“代表当前目录&…

ps 透明印章制作

ps 透明印章制作 1、打开不透明印章2、抠出红色印章3、新建图层4、填充红色印章到新图层5、导出透明印章 1、打开不透明印章 打开ps软件,菜单栏选择 文件-打开 选择本地不透明印章 打开 2、抠出红色印章 ps菜单栏 选择 选择-色彩范围 点击色彩范围 色彩范围窗口 取…

Python实现一箭穿心

文章目录 🎄效果🏳️‍🌈Turtle模块🌹代码🌺代码讲解 🎄效果 🏳️‍🌈Turtle模块 Turtle是一个绘图工具,是Python标准库中的一个模块。它提供了一种简单而直观的方式来创…

docker环境安装

环境 主机环境 1. 宿主机环境 ubuntu-22.04.3-live-server-amd64 ,下载地址: https://mirrors.aliyun.com/ubuntu-releases/22.04.3/ubuntu-22.04.3-live-server-amd64.iso 2. apt 包管理器,镜像源修改 : 将 http://cn.archive.ubunt…

【玩转 EdgeOne】| 腾讯云下一代边缘加速CDN EdgeOne 是安全加速界的未来吗?

目录 前言边缘加速与安全加固边缘计算与CDN的融合EdgeOne优秀的安全特性EdgeOne卓越的性能表现灵活的配置和管理生态系统的支持与发展技术创新与未来展望EdgeOne试用结束语 前言 在当下互联网的迅猛发展的时刻,云计算和边缘计算技术的快速发展为网络加速领域带来了…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线,并算出斜率、角度-判断时间,分针与时针 (度数)。数据可更换自己的,程序已调通,可直接运…

【WSA】无法打开 适用于 Android™ 的 Windows 子系统,因为它处于脱机状态。可能缺少存储设备,或者存储设备已断开连接。

问题描述 之前可以正常使用适用于 Android™ 的 Windows 子系统(WSA),但突然间无法启动了。 当尝试启动WSA中的软件时,都会出现以下错误提示: 无法打开 适用于 Android™ 的 Windows 子系统,因为它处于脱…

分块矩阵知识点整理:

1.分块方法:横竖线不能拐弯,思想为将矩阵分块看作向量计算 2.标准型 不一定是方的 特殊性:经过分块后会出现单位矩阵和0矩阵 3.分块矩阵的运算: 1.加减乘的运算与向量运算相同 4.分块矩阵求转置: 1.将子块看作普通元素求转置 2…

HarmonyOS开发准备(一) TypeScript基本语法

HarmonyOS开发准备(一) TypeScript基本语法 TypsScript官网:https://www.typescriptlang.org/play 可在官网 Playround 在线运行 Typescript 一、变量声明 // 创建 number(数值) 类型变量 let test_number: number 111 console.log(test_number:, tes…

python爬取robomaster论坛数据,作为后端数据

一. 内容简介 python爬取robomaster论坛数据,作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析 # 接口分析 # 全部数据 # https://bbs.robomaster.com/forum.php?modforumdisplay&fid63 2…