【CMU15-445 FALL 2022】Project #1 - Extendable Hashing

news2024/7/30 8:23:20

Reference & Thank & Related

  • CMU15445-project1-可扩展哈希表
  • 数据库——可拓展哈希(Extendable Hashing)
  • 【CMU15-445数据库】bustub Project #1:Buffer Pool
  • Extendible Hashing (Dynamic approach to DBMS)

Extendable Hashing

concept

什么是可扩展哈希?

Extendible Hashing is a dynamic hashing method wherein directories, and buckets are used to hash data. It is an aggressively flexible method in which the hash function also experiences dynamic changes. ——Extendible Hashing (Dynamic approach to DBMS)

  • 可扩展哈希是一种动态哈希方法,其中使用目录和桶对数据进行哈希。这是一种非常灵活的方法,其中哈希函数也会经历动态变化。

主要特点:

Directories: The directories store addresses of the buckets in pointers. An id is assigned to each directory which may change each time when Directory Expansion takes place.

  • 目录将桶的地址存储在指针中。 每个目录都会分配一个 ID,每次目录扩展时该 ID 都可能会发生变化。

Buckets: The buckets are used to hash the actual data.

  • 桶用于散列实际数据。

members

这里以cmu15-445 2022fall p1 buffer_pool为基础讲解,以下为涉及到的成员变量。

  • 全局深度global_depth_
    • 当前dir_的深度大小。
      • 这里的深度大小指的是: 取对应元素低多少位的二进制,用于将元素散列到不同的bucket。
  • 局部深度local_depth_
    • 特指某个桶的深度大小
      • 同上,指的就是当前该bucket所看元素二进制的位数。(ps: 每个元素低local_depth_位的二进制,肯定是相同的,才会被分到一个桶中。)
  • 桶bucket_
    • 真正存储元素的容器。
  • 目录dir_
    • 一个bucket*的数组,存储指向桶的指针,即根据元素{key,value},key的哈希值,选择对应的bucket,即散列到不同的bucket中,大小随着插入global_depth_ 与local_depth_ 大小关系进行扩容。详见下方说明
    • 要注意的是,dir _ 的大小和bucket桶的数量并不是一直对等的。因为同一个桶可能会被多个dir_指向。

Insert

下面开始进行插入元素函数的介绍,也仅仅介绍这一个函数。

  • 首先创建可扩展哈希,完成初始化(bucket的大小,local_depth,global_depth的大小)。
  • 插入元素,根据哈希函数,求得指向要映射桶的指针,即dir_[i],判断当前所指向bucket是否已经满了,没满,直接插入即可;
    • 反之,桶满了,判断当前global_depth _ 和桶的 local _ depth_ 的 大小关系。这个过程需要不断重复,直到元素可以顺利插入。
      • 如果global _ depth _ 等于local _ depth_ ,需要进行桶分裂和目录扩张
        • 目录扩张:
          • 目录扩张就是将当前的目录dir _ 大小翻倍,同时全局深度global _ depth_++。
            • 将原来的dir_ 在后面再push_back一遍。使得同一个bucket被重复指向。
              • 进一步理解,为什么扩展后,"两个"dir可以指向同一个bucket?我们会发现,当完成桶分裂后进行重新连接,这两个dir会根据二进制某位的不同,分别指向这两个bucket,之后同理。
              • 区分这两个bucket中元素的不同,就是根据某一位二进制,即,对应的dir_索引的二进制位。(带着这个想法,去看下方的插入示例),这个两个二进制位分别与那两个dir 索引对应的二进制位相同。
        • 桶分裂:
          • 桶分裂就是将当前这个满了的bucket重新进行散列到两个新桶中,通过再往左判断一个二进制位拆分(详见下方示例),这两个新桶的depth在原来的基础上+1,即通过1<<local_depth与哈希值按位与。
      • 如果global _ depth _ 大于local _ depth_,则,仅仅需要进行桶分裂即可。

example

下面以插入这几个数为例,其中元素仅仅声明了key,并未标注对应的value,因为是根据key进行插入,以及查找等操作的,在下面的示例中, 你也可以理解为key == value。

  • 初始化


  • ①插入16


  • ②插入4


  • ③插入6

发生溢出,判断global_ depth _ 与发生溢出的桶的depth_大小关系。如下图所示,二者相等,依次进行->目录扩张->桶分裂->重新连接

再次尝试插入6,还是溢出,再进行判断。

又尝试插入6,此时完成插入。

相关内容补充


  • ④插入22


  • ⑤插入24

发生溢出

再次尝试插入24


  • ⑥插入10

完成插入,后面越插入越复杂了,所以就到此为止了,注意: 不同的初始条件,插入元素得到的结果不同。

  • 实际上我们要插入元素的key并不都是整型,具体实现中我们会通过其中的hash函数求得对应key的哈希值来进行散列。

Q & A

有关桶分裂后的重新指向问题

详见上方插入过程中,有一段红字标注。

  • 即,一个桶分裂到两个桶,根据一位二进制位是0还是1,同样的,多个指向同一个bucket的dir[i]重新指向,也需要判断桶分裂区分的那位二进制位,对应目录索引的二进制是0还是1。原来指向同一个桶的dir[i],它们索引i的对应二进制位,此位的右边所有位是相同的。
    • 根据这个意思,自己模拟一下插入,就可以理解了。

Complement

vector 的 resize 与 reserve 区别

  • resize方法会改变vector的大小,如果的新的大小比原来的更大,则会在vector末尾添加元素,调用默认构造函数。
  • reserve只会预分配空间,即调整capacity的大小,但是如果reserve()的参数值小于当前size的大小,vector的容量并不会发生变化,capacity在任何时候,容量都是大于等于size

代码示例

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

class A{
public:
	A(){
		cout <<"structure"<<endl;
		m_d = 999;
	}
	~A(){
		cout <<"distructure"<<endl;
	}
	int m_d;
};


int main(void){
	
	vector<A>v1;
	vector<A>v2;
	
	// 给一个比当前元素数量大的数
	v1.resize(2);// 调用A默认构造,插入v1尾部
	cout << "v1 capacity: "<<v1.capacity()<<endl; // 2
	cout << "v1 size: "<<v1.size();// 2
	cout <<endl;
	v1[0].m_d = 0;
	v1[1].m_d = 1;
	
	v2.reserve(2);
	cout << "v2 capacity: "<<v2.capacity()<<endl;// 2
	cout << "v2 size: "<<v2.size();// 2
	cout <<endl;
	
	// 给一个比当前元素数量小的数,测试是否能删除调用析构函数,
	v2.push_back(A());// 给v2两个
	v2.push_back(A());
	
	cout <<"test distructure"<<endl;
	v1.resize(1);
	v2.reserve(1);// reserve一个比当前小的值,容量不会变化
	
	cout << "v1 capacity: "<<v1.capacity()<<endl; // 2
	cout << "v1 size: "<<v1.size();// 1
	cout <<endl;
		
	cout << "v2 capacity: "<<v2.capacity()<<endl;// 2
	cout << "v2 size: "<<v2.size();// 2
	cout <<endl;
	
	cout <<	v1[1].m_d<< endl;// vector的[]并没有越界访问判断
	
	system("pause");
	
	return 0;
}

Last

  • (PS: 本来开始用表格画图的,后来越画越乱,中间错了几次,于是就放弃了o(╥﹏╥)o,感兴趣的小伙伴可以试下。)

  • 代码实现的时候参考了github搜到的一个老哥的实现,感谢老哥分享,但是出于课程要求,我就不贴链接啦~

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

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

相关文章

链表问题——长整数加法运算题解【双向链表】

长整数加法运算 问题描述 假设2个任意长度的整数x、y分别用链表A和B存储&#xff0c;现要求设计一个算法&#xff0c;实现xy。计算结果存储在链表C中。 说明&#xff1a; 链表A、B、C可以是单向链表或双向链表&#xff0c;但由于A和B输出时需要从头至尾遍历&#xff0c;而做…

Git提交项目到服务器上

目录 第一步&#xff1a;git status第二步&#xff1a;git pull第三步&#xff1a;git status第四步&#xff1a;git add第五步&#xff1a;git commit第六步&#xff1a;git push 第一步&#xff1a;git status git status 看一下你这个项目里&#xff0c;修改过什么公版的东西…

性能优化(一)JMeter使用

简介&#xff1a; jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须…

Django_模板(四)

目录 一、模板 创建模板文件 定义模板 视图调用模板 简写视图调用的模板 二、去除模板中的硬编码 URL 三、为 URL 名称添加命名空间 四、生成模板渲染后的静态文件 源码等资料获取方法 一、模板 如何向请求者返回一个漂亮的页面呢&#xff1f; 肯定需要用到html、css…

多元分类预测 | Matlab基于鲸鱼优化深度置信网络(WOA-DBN)的分类预测,多输入单输出模型,多特征输入模型,WOA-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于鲸鱼优化深度置信网络(WOA-DBN)的分类预测,多输入单输出模型,多特征输入模型,WOA-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语…

Unity3d的智力拼图小游戏

Unity3d的智力拼图小游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88015674

关于async/await

async/await是什么&#xff1f; 简单来说async/await是Promise的语法糖&#xff0c;async是异步的意思&#xff0c;await是等待的意思。async function 声明一个函数里面可能有异步代码需要执行&#xff0c;await则可以认为是等待一个异步方法执行完成。 async/await的用法 …

创建台虚拟机并安装上window10系统(NETBASE 第一课)

虚拟机&#xff08;Virtual Machine&#xff09;是一种基于软件的模拟技术&#xff0c;它可以将一台物理计算机模拟成多个虚拟计算机运行不同的操作系统和应用程序&#xff0c;从而实现资源的虚拟化和隔离。在虚拟机中&#xff0c;每个虚拟计算机都拥有自己的独立的操作系统和应…

MySQL基础篇第1章(数据库概述)

文章目录 1、为什么要使用数据库2、数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库管理系统排名2.4 常见的数据库介绍 3、MySQL介绍3.1 概述3.2 MySQL发展史重大事件3.3 关于MySQL 8.03.4 Oracle VS MySQL 4、RDBMS 与 非RDBMS4…

java的void和Void

java 函数如果什么类型的值也不需要返回&#xff0c;用关键字void。 而Void是一个类&#xff0c;是一个不能实例化的占位符类&#xff0c;它持有对一个类对象的引用&#xff0c;这个类对象代表java关键字void。 如果函数返回值是Void&#xff0c;那么函数必须明确返回null。 J…

将 jar 构建成 docker 镜像实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

Java的数据结构

目录 数据结构: 1,数组 2,链表 3,哈希表 4,队列 5,堆 6,栈 7,树 8,图 数据结构: 1,数组 优点: 查找元素的速度很快; 按照索引来遍历数组的速度也很快。 缺点: 数组大小无法改变,一旦创建就无法扩容; 数组只能存储一种数据类型的数据; 插入、修改、删除时比较麻烦&…

1-软件测试答疑

目录 1.什么是软件测试&#xff1f; 1.1.生活中测试场景 1.2.软件测试定义 1.3.为什么要有软件测试&#xff1f;/重要性 1.4.练习&#xff1a;软件系统登录功能如何测试&#xff1f; 1.5.软件测试的特点 2.软件测试和开发的区别 2.1.工作内容 2.2.技能要求 2.3.难易程…

spring监视器actuator

引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…

第五章 神经网络与手写体识别

文章目录 第五章 神经网络5.1神经元模型5.2感知机与多层网络5.3误差逆传播算法5.4全局最小和局部最小5.5其他常见神经网络5.5.1RBF网络5.5.2ART网络5.5.3SOM网络5.5.4级联相关网络5.5.5Elman网络5.5.6Boltzmann机 5.6深度学习5.7实验&#xff1a;手写数字识别 第五章 神经网络 …

【QT】——QJson类的使用

目录 1.Json的格式 1.1.Json数组 1.2.Json对象 2.QJson 2.1 QJsonObject 2.2 QJsonValue 2.3 QJsonArray 2.4 QJsonDocument 3.示例 3.1 写操作 3.2 读操作 1.Json的格式 Json的基本概念 Json 是一种数据格式&#xff0c;和语言无关&#xff0c;在什么语言中都可以…

Host is not allowed to connect to this MySQL server

问题:win10 系统上运行node&#xff0c;运行提示&#xff1a;Host is not allowed to connect to this MySQL server。 在windows10上面装完MySQL8.0.28&#xff0c;发现本地可以使用Navicat进行连接 &#xff0c;但是在vue项目中调用node接口连接mysql却报错Host is not all…

Python学习笔记(十五)————文件操作相关

目录 1&#xff09;文件编码 2&#xff09; 文件的读取 ①open()打开函数 ② mode常用的三种基础访问模式 ③读操作相关方法 read()方法&#xff1a; readlines()方法&#xff1a; readline()方法&#xff1a;一次读取一行内容 for循环读取文件行 close() 关闭文件对象 wi…

simulink 结构体 bus creator

目录 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Concatenate 结构体数据存文件 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Co…

【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

分析慢SQL的步骤 慢查询的开启并捕获&#xff1a;开启慢查询日志&#xff0c;设置阈值&#xff0c;比如超过5秒钟的就是慢SQL&#xff0c;至少跑1天&#xff0c;看看生产的慢SQL情况&#xff0c;并将它抓取出来explain 慢SQL分析show Profile。&#xff08;比explain还要详细…