【数据库】基于散列的两趟算法原理,以及集合与包的并,差,交,连接操作实现原理,执行代价以及优化

基于散列的两趟算法

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 基于散列的两趟算法
  • 前言
  • 概述
  • 原理
  • 流程
  • 基于散列的去重
  • 基于散列的分组聚集
  • 基于散列的并、交和差
  • 基于散列的连接
  • 代价分析
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

概述

前面两篇博客分享了基于排序的两趟算法,那么还有其它类型的两趟算法吗?

答案是肯定的,当然有。

本文就来分享一种基于散列的两趟算法。

原理

如果数据量太大以至于不能一次装入内存缓冲区中,基于散列的两趟算法中,采用一个合适的hash算法,将表划分为M-1个hash桶,这样操作对象一样的元组就在相同的桶中,然后就可以依次处理各桶中的数据。

实际上,经过hash处理之后,我们将操作对象的大小减小了,减小的比例等于桶的数目,它的数量大致为可用缓冲区大小M。这与我们介绍的基于排序的两趟算法有点类似,有同样的因子,但是两种方法执行的过程完全不同。

流程

第一趟hash散列处理:

  • 假设hash函数为h,并且h将表R的整个元组作为参数,同时将每个一个hash桶与一个缓冲区块联系起来。
  • 每次加载表R的一个数据块,将块中的元组按hash函数h进行处理,输出到桶对应的缓冲区中;
  • 如查某个桶对应的缓冲区满了,将它写到磁盘上;
  • 重复以上步骤,直到表R处理完成;
  • 最后一个桶的缓冲区也写到磁盘上;

第二趟处理,就需要结合具体的某个操作,我们之前介绍过去重,分组聚集,并集,差集,交集,连接等;

基于散列的去重

在第一趟hash散列结束后,对于hash相同的元组都在一个桶中,那么相同的元组也在一个桶中,我们每次处理一个桶。

  • 读取第一个桶的数据块到缓冲区中;
  • 将第一条元组输出到结果缓冲区中,对于它的副本忽略;
  • 依次处理下一个桶中的数据块;
    直到所有桶中的数据块处理完成;

基于散列的分组聚集

执行分组操作的话,在第一趟将表R的数据hash成M个桶的进候,hash的键值要使用分组属性列,这样相同分组属性的元组会被分配到相同的桶中。

在第二趟时,依次加载每个桶的数据块,计算分组数据,如行数,求和等,每个桶为一个分组,直到所有桶处理完毕。

最后计算分组结果,输出结果。

基于散列的并、交和差

第一趟,将表R和表S分别采用相同的hash函数h,分别hash到数量相等的桶中,那么桶的数量为2M;

第二趟时,对于不同操作:

  • 对于集合的并,因为相同的元组分配在相同的桶中,比如表R的每i个桶记为Ri,而表S的第i个桶记为Si;那么取Ri和Si执行并集操作,对于两个中都出现的元组,重复元组只输出一次到结果缓冲区块上;这样依次对应取两个桶,直到所有桶处理完毕。

  • 对于包的并,也是对应的取Ri和Si两个桶的数据块,将两个桶中的数据,输出到结果缓冲区中;其实一趟算法就足够了;

  • 对于集合交,也是对应的取Ri和Si两个桶的数据块,对于两个桶中都出现的元组输出到结果缓冲区中;

  • 对于包的交,加载对应的取Ri和Si两个桶的数据块,对于出现次数相同的元组,输出到结果缓冲区中;

基于散列的连接

假设表R(X,Y)与表S(Y,Z)进行等值连接;

第一趟,将表R和表S分别采用相同的hash函数h,分别hash到数量相等的桶中,那么桶的数量为2M,而hash键值采用两表的连接属性列,这样对于属性列Y相同的元组都在Ri与Si桶中。

第二趟时,对于对应的Ri与Si桶加载到内存中,采用一趟散连连接算法就可以完成。

代价分析

将表R,在第一趟hash成M个桶时,会读取表R的所有数据块B,然后将各个桶对应的数据块写到磁盘上,写磁盘的数据块也近似为B;

在第二趟中,会将各桶的数据块读出,数据块数为B;如果不计结果的写入。

那么在整个基于散列的两趟算法中,磁盘IO的数量为表R的数据块的数量的3倍。

总结

对于大表来讲,不能一次性加载到内存,那么我们可以采用基于散列的两趟操作,实现一元操作去重,分组和聚集,二元操作并,差,交,连接等。

以下是使用访问者模式编写输出"Hello World"的C语言代码:

#include <stdio.h>// 定义抽象数据类型
typedef struct {void (*accept)(void *data, void (*print)(void *data));
} Visitor;// 定义具体数据类型
typedef struct {char message[100];
} Data;// 定义访问者函数
void printVisitor(void *data) {Data *myData = (Data *)data;printf("%s\n", myData->message);
}// 定义具体数据类型的构造函数和访问者函数调用
Visitor visitor = { .accept = printVisitor };
Data data = { .message = "Hello World" };
data.accept(&visitor, printVisitor);

在上述代码中,我们定义了一个抽象数据类型Visitor,其中包含一个accept方法,用于接受具体数据类型的实例并调用其访问者方法。接着,我们定义了一个具体数据类型Data,其中包含一个字符串消息。然后,我们定义了一个访问者函数printVisitor,用于输出具体数据类型的字符串消息。最后,我们定义了一个具体数据类型的构造函数和访问者函数调用,创建了一个Data实例并使用accept方法将其传递给访问者对象,并调用访问者函数输出字符串消息。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

你真的掌握结构体了么?结构体习题(C语言)

前言 上一期博客我们学习了结构体的相关知识&#xff08;上期链接&#xff09;&#xff0c;但是学了不练也是不行的&#xff0c;我们今天讲给大家分享两道有点恶心的题目&#xff0c;让大家来加深对结构体的理解&#xff0c;那么话不多说我们现在开始吧&#xff01; 第一题 有…

基于HSV空间色彩的图像分割方法(代码实现)

文章目录 1. 分割图片示例&#xff1a;2. 代码实现&#xff1a;3. 运行结果&#xff1a; 1. 分割图片示例&#xff1a; 2. 代码实现&#xff1a; from skimage.io import imread, imshow from skimage import img_as_ubyte # For converting the float image to uint8 from s…

浏览器开发者工具使用(F12)

F12 第一个按钮&#xff1a;停止和开启按钮&#xff0c;默认是开启抓包 第二个按钮&#xff1a;清空抓包记录 第三个按钮&#xff1a;过滤器&#xff0c;可以通过搜索想要的关键字 第四个按钮&#xff1a;保留日志&#xff08;建议必须勾上&#xff0c;不然有些跳转页面无法…

数字工厂时代,如何实现3D数据访问与发布、WEB大模型可视化?

Tech Soft 3D的HOOPS 3D CAD SDK为现代工厂工作流程奠定了基础&#xff0c;通过最快、最准确的CAD数据访问和动态3D可视化支持数字孪生、机器人仿真、设计、流程和规划、IIoT和操作辅助应用程序。 本文将和您详细探讨。如何利用HOOPS技术来增强您的应用程序。 HOOPS_HOOPS试…

OpenAI 在中国申请 GPT-6、GPT-7 商标;Google 推迟发布 OpenAI 竞品 Gemini 至明年 1 月【无际Ai资讯】

天眼查 app 显示&#xff0c;近日&#xff0c;欧爱运营有限责任公司&#xff08;OPENAI OPCO&#xff0c;LLC&#xff09;申请多枚「GPT-6」「GPT-7」商标&#xff0c;国际分类为科学仪器、网站服务&#xff0c;当前商标状态均为等待实质审查。 此前 OpenAI CEO Sam Altman 在接…

【laBVIEW学习】4.声音播放,自定义图标,滚动条设置,保存参数以及恢复参数

一。声音播放&#xff08;报错&#xff0c;未实现&#xff09; 1.报错4810 2.解决方法&#xff1a; 暂时未解决。 二。图片修改 1.目标&#xff1a;灯泡---》自定义灯泡 2.步骤&#xff1a; 1.右键点击--》自定义运行 表示可以制作自定义类型 2.右键--》打开自定义类型 这样就…

UVM验证平台中加入sequencer

sequence机制用于产生激励&#xff0c;它是UVM中最重要的机制之一。在 一个规范化的UVM验证平台中&#xff0c;driver只负责驱动transaction&#xff0c;而不负责产生transaction。sequence机制有两大组成部分&#xff0c;一是 sequence&#xff0c;二是sequencer。如何在验证平…

常用功能测试的检查点与用例设计思路

1 功能测试 1.1 用户登录 1.1.1 数据输入 1. 帐号或密码为空。 2. 帐号或密码长度超长。 3. 帐号或密码不符合格式要求。 4. 帐号在数据库中不存在。 5. 密码在数据库中不存在。 6. 密码在数据库中存在&#xff0c;但与帐号不匹配。 7. 正确的帐号和正确的密码。 8. …

揭秘:软件测试中Web请求的完整流程!

在软件开发的过程中&#xff0c;测试是一个至关重要的环节。而在现代互联网应用中&#xff0c;Web请求是很常见的一个测试需求。本文将介绍Web请求的完整测试流程&#xff0c;帮助读者更好地理解软件测试的关键步骤。 一、测试准备阶段 在进行Web请求测试之前&#xff0c;测试团…

创意云×四川永辉直播首秀顺利开播,vLive助力本地生活直播玩转“双12”

12月5日&#xff0c;“四川永辉超市双12特惠”直播首秀顺利开播&#xff0c;蓝海创意云为此次直播提供了虚拟场景制作和全程的技术支持。蓝海创意云使用自主研发的vLive虚拟直播系统&#xff0c;将其应用到整个直播过程中。这种独特的视觉新体验成功吸引了众多观众的关注和参与…

Java jdk和jre的区别

jdk和jre的区别为&#xff1a;JRE是java运行时环境而JDK是java开发工具包&#xff0c;JDK包含JRE&#xff0c;但是JRE可以独立安装。 JDK&#xff1a; java development kit (java开发工具)&#xff0c;JDK 是用于开发 Java 程序的最小环境。 JRE&#xff1a; java runtime e…

【动态规划】LeetCode-64.最小路径和

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

一线大厂Redis高并发缓存架构

场景1&#xff1a;秒杀库存场景&#xff0c; 10000人抢100个商品 如果用普通的分布式锁实现&#xff0c; 最后抢到的人&#xff0c;要等前面99个人抢完 优化方案&#xff1a;可用分段锁&#xff0c; 降低锁的粒度&#xff0c; 比如1-10库存用锁product:101_1,11-20库存用锁pr…

C++红黑树封装set和map(很详细)

前言 在前面&#xff0c;我们学习了红黑树。&#xff08;没学过红黑树直接看会很吃力&#xff09;set和map的底层就是红黑树&#xff0c;现在我们要用这棵树来封装STL里面的容器&#xff1a;set和map。 下面是之前讲过的红黑树&#xff0c;他只是普通的“Key”模型,适合封装set…

BabyLIN产品如何轻松搞定K线协议实现?

来源&#xff1a;虹科汽车电子 虹科技术丨BabyLIN产品如何轻松搞定K线协议实现&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/LR7VHFQajjyw6s6bVDJmsg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 为了实现K线通信&#xff0c;SDF-V3在协议…

类的加载器

文章目录 1. 类加载器的分类2. 双亲委派模型3. 沙箱安全机制 1. 类加载器的分类 口述&#xff1a;启动类加载器加载jvm需要的核心的类库&#xff0c;扩展类加载器加载外部的jar包&#xff0c;应用程序加载器加载我们自己定义的类。 2. 双亲委派模型 规定了类加载的顺序是&a…

m1源码编译xgboost的动态链接库dylib

1、下载源码 git clone --recursive https://github.com/dmlc/xgboost cd xgboost拉取源码时候&#xff0c;一定要加"--recursive"这个命令。把它的字模块也要拉取下来&#xff0c;才能编译成功 2、安装c依赖 必要的依赖项(不然后续编译时报错)&#xff0c;包括CM…

用java比较两个二叉搜索树是否等价

一. 定义树的的节点 ​ 不同二叉树的叶节点上可以保存相同的值序列。例如&#xff0c;以下两个二叉树都保存了序列 1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13。 package com.wedoo.coderyeah.module.iot.algorithm;import lombok.…

【CentOS】配置 Apache 服务

yum install httpd -y# 查看是否安装成功 httpd -v # 出现版本号表示成功# 启动服务 systemctl start httpd# 查看状态 systemctl status httpd # running 即可成功 ● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disable…

Redlock算法实现Redis分布式锁

Redlock算法实现Redis分布式锁 为什么基于故障转移的实现还不够 使用 Redis 锁定资源的最简单方法是在实例中创建密钥。密钥通常是在有限的生存时间内创建的&#xff0c;使用 Redis 过期功能&#xff0c;以便最终它被释放&#xff08;我们列表中的属性 2&#xff09;。当客户…