【Database System Concept 7th】Chapter 24 Advanced Indexing Techniques 读书笔记

news2024/11/25 15:27:31

Chapter 24 Advanced Indexing Techniques

  • 24.5 Hash Indices
    • 24.5.1 Static Hashing
    • 24.5.2 Dynamic Hashing
      • 24.5.2.1 Data Structure
      • 24.5.2.2 Queries and Updates

24.5 Hash Indices

24.5.1 Static Hashing

这一部分就不介绍了,在14.5中已经介绍过了。

24.5.2 Dynamic Hashing

主要介绍下动态散列的一种方案,称为可扩展散列

24.5.2.1 Data Structure

可扩展散列的基本数据结构如下图所示,主要包括两部分:

  • bucket address table:桶地址表,类似目录,用于存放桶地址
  • bucket:一个一个的桶,用于存放记录

可以注意下图中,桶地址表上方与每个桶的上方都标有一个整数,其中,桶地址表上方的整数 i i i称为全局位深度(grobal depth),每个桶 j j j上方的整数 i j i_j ij称为局部位深度(local depth)。
关于全局位深度 i i i和桶 j j j的局部位深度 i j i_j ij有以下性质:

  • 桶地址表中,指向桶 j j j的表项数为 2 i − i j 2^{i-i_j} 2iij
  • 存放于桶 j j j中的记录,他们搜索码的哈希值二进制 i j i_j ij都一样

这个结构是如何建立出来的、两个位深度分别有什么用处、以及为什么会有以上性质,我们先不管,下一节中会细说,先了解基本概念即可。
在这里插入图片描述

24.5.2.2 Queries and Updates

本节主要介绍可扩展散列的记录查询与插入过程,删除过程暂时还没了解,后续补上。
首先是查询过程,当查询包含某个搜索码Key的记录时,首先使用哈希函数 h h hKey取哈希值 h ( K e y ) h(Key) h(Key),再取出这个哈希值二进制位中的低 i i i(这里的 i i i表示全局位深度),由桶地址表得到对应的桶地址,从而查询到对应的记录。
一个具体的例子如下图所示,假设某条记录的搜索码哈希值为0010,由于全局位深度为2,则对应的表项为00,获取到Bucket 1的地址,从而进入bucket 1查找到对应记录。可以看到,Bucket 1中记录的搜索码对应哈希值的低2位都一致。
在这里插入图片描述

查询过程相对比较简单,接下来我们来看相对复杂的插入记录过程。当插入一条新的记录时,首先同查询过程一致,根据搜索码找到对应的桶 j j j,然后分为以下情况:

  • 若桶 j j j仍有空间,则直接将记录插入该桶
  • 若桶 j j j已满,则需要分裂这个桶并将桶中现有记录加上新纪录重新分配,分为以下两种情况:
    • 如果 i = i j i=i_j i=ij,根据上一节的性质可以知道,桶地址表中只有一个表项指向桶 j j j(让我们假设这个表项为 T E j TE_j TEj),此时需要增加桶地址表的规模,使得桶地址表可以容纳由于桶 j j j分裂产生的两个桶指针。具体的做法是, i i i加1,这将使得桶地址表的容量翻倍,原来的每个表项都产生出自己的一个副本,新的表项包含和原始表项一样的指针(我们令 T E j TE_j TEj的副本表项为 T E k TE_k TEk,则 T E k TE_k TEk也指向 j j j)。然后,系统会分配一个新的桶 k k k,让新表项副本 T E k TE_k TEk指向 k k k,并将 i j i_j ij i k i_k ik都置为 i i i。最后,将 j j j中的所有记录与新记录重新分配,根据记录搜索码哈希值二进制的后 i i i位确定放入桶 j j j中还是放入桶 k k k中。一个具体的例子如下图所示,当在之前的图中插入一条搜索码哈希值二进制为1000的记录时,Bucket 1将溢出,故将Global Depth增大1,增加一个新的桶Bucket 4,并将记录根据二进制后三位重新散列。
    • 在这里插入图片描述
    • 如果 i > i j i>i_j i>ij,那么根据上一节中的性质,桶地址表中不止一个表项指向桶 j j j,会有 2 i − i j 2^{i-i_j} 2iij个表项指向桶 j j j,此时不需要增加桶地址表的容量,直接分裂桶 j j j即可。具体做法是,系统分配一个新的桶 k k k,将指向 j j j 2 i − i j − 1 2^{i-i_j-1} 2iij1个表项修改为指向 k k k,并设置 i j i_j ij i k i_k ik i j + 1 i_j + 1 ij+1,最后重新散列 j j j中的记录与新纪录。一个具体的例子如下图所示,当向Bucket 2插入两个记录之后,再插入一个记录,这时Bucket 2溢出;由于Bucket 2Local Depth小于Global Depth,于是不需增大Global Depth,直接将表项 110 110 110指向的桶修改为新增桶Bucket 5即可,然后重新散列Bucket 2与新纪录。
      在这里插入图片描述
      在这里插入图片描述

以上就是基本的查询操作与插入操作的过程,但插入操作并不是很完善。考虑这样一种情况,假设每个桶的容量为 2 2 2,当我们存在3条记录均包含相同的搜索码时,就会造成桶溢出,此时使用溢出桶方式来解决,即串链表形式,在14.5中已经叙述过,这里就不再赘述了。

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

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

相关文章

攻击者滥用日历服务作为 C2 基础设施

谷歌警告多个威胁参与者正在利用其日历服务作为命令和控制(C2)基础设施。 谷歌警告 称,多个威胁参与者共享一个名为“Google Calendar RAT”的公共概念验证(PoC)漏洞,该漏洞依赖日历服务来托管命令和控制&…

SpringCloud——消息驱动——Stream

1.什么是消息驱动 消息驱动就是屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。目前仅支持RabbitMQ、Kafka。 2.消息中间件有什么问题,stream靠什么实现? 如果我们项目用到了RabbitMQ和Kafka,由于这两个…

大数据毕业设计选题推荐-超级英雄运营数据监控平台-Hadoop-Spark-Hive

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

torch.cuda.is_available()=false的原因

1、检查是否为nvidia显卡; 2、检查GPU是否支持cuda; 3、命令行cmd输入nvidia-smi(中间没有空格),查看显卡信息,cuda9.2版本只支持Driver Version>396.26;如果小于这个值,那么你就需要更新显…

NCV7721D2R2G一款完全保护的双半桥驱动器 专为汽车工业运动控制解决方案

NCV7721D2R2G是一款完全保护的双半桥驱动器,专为汽车和工业运动控制应用而设计。两个半桥驱动器具有独立控制。这允许高侧、低侧和H桥控制。H桥控制提供正向、反向、制动和高阻抗状态。驱动器通过逻辑电平输入进行控制。 特性: 1.睡眠模式下的超低静态电…

多测师肖sir___ddt讲解(辅助框架)

ddt数据驱动 1、ddt定义:全称data-driver tests ,数据驱动测试,可以实现不同数据运行同一个测试用例。 ddt本质是一个装饰器,一组数据一个场景 主要核心:把业务逻辑装成关键字,在调用关键字 2、为什么要使…

EasyExcel 导出冻结指定行

导出的实体类 package org.jeecg.modules.eis.test;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.*; import lombok.Getter; import lombok.Setter; import org.apache.poi.ss.usermodel.HorizontalAlignment;import…

C语言面试

数据类型(基本内置类型) char //字符数据类型 short //短整型 int //整型 long //长整型 long long //更长的整型 float //单精度浮点数 double //双精度浮点数 类型的基本归类 整形家族: …

redis笔记 三 redis持久化

文章目录 Redis持久化RDB持久化执行时机RDB原理小结 AOF持久化AOF原理AOF配置AOF文件重写 RDB与AOF对比 Redis持久化 redis持久化是为了解决redis宕机时丢失数据的问题,Redis有两种持久化方案: RDB持久化AOF持久化 RDB持久化 RDB全称Redis Database …

避免重复请求:接口重试机制最佳实践

避免重复请求是设计接口重试机制时的重要考量之一。在实际的系统开发中,网络通信、服务调用等操作可能会面临重试的情况,而重试请求如果不加以处理可能导致重复执行业务逻辑、产生重复数据或是对服务端造成压力,因此如何有效避免重复请求成为…

Spring Boot项目中通过 Jasypt 对属性文件中的账号密码进行加密

下面是在Spring Boot项目中对属性文件中的账号密码进行加密的完整步骤&#xff0c;以MySQL的用户名为root&#xff0c;密码为123321为例&#xff1a; 步骤1&#xff1a;引入Jasypt依赖 在项目的pom.xml文件中&#xff0c;添加Jasypt依赖&#xff1a; <dependency><…

easyConnect虚拟网卡未安装,导致连接失败(虚拟网卡安装失败)

前言 使用easyConnect&#xff0c;但是一直连接失败&#xff0c;看到提示错误 虚拟网卡未安装&#xff0c;请确保虚拟网卡安装成功 我的错误原因是因为我自己装过VM虚拟机&#xff0c;用过虚拟网卡然后产生的虚拟网卡冲突 解决方式 1.打开网络设置2.选择你的网络&#xff08…

chatgpt升级啦,训练数据时间更新到2023年4月,支持tools(升级functionCall),128k上下文

&#xff08;2023年11月7日&#xff09; gpt-4-1106-preview https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo 训练数据日期升级到2023年四月 上线文增加到128k 调用一次chatgpt接口&#xff0c;可以得到多次函数调用 import OpenAI from "openai"…

1-前端基本知识-HTML

1-前端基本知识-HTML 文章目录 1-前端基本知识-HTML总体概述什么是HTML&#xff1f;超文本标记语言 HTML基础结构文档声明根标签头部元素主体元素注释 HTML概念词汇&#xff1a;标签、属性、文本、元素HTML基本语法规则HTML常见标签标题标签段落标签换行标签列表标签超链接标签…

华为取消6000万订单影响在扩大,高通嘴硬强调不受影响

高通公布了2023年第三季度的业绩&#xff0c;业绩显示营收下滑24%&#xff0c;净利润下滑36%&#xff0c;不过高通强调预计今年四季度业绩将回升&#xff0c;意思是说华为取消订单带来的影响较小。 一、高通处境不利已延续4年时间 2019年美国对华为采取措施&#xff0c;众多中国…

go程序获取工作目录及可执行程序存放目录的方法-linux

简介 工作目录 通常就是指用户启动应用程序时&#xff0c;用户当时所在的文件夹的绝对路径。 如&#xff1a;root用户登录到linux系统后&#xff0c;一顿cd&#xff08;change directory&#xff09;后, 到了/tmp文件夹下。此时&#xff0c;用户要启动某个应用程序&#xff0…

组成原理备考学习 day1 (第一章)

组成原理备考学习 day1 第一章 系统概述1.1 计算机发展史1.1.1 计算机软硬件的发展计算机硬件的发展计算机软件的发展 1.1.2 计算机的分类和发展方向 1.2 计算机系统层次结构1.2.1 计算机系统的组成1.2.2 CPU及工作过程取数指令 1.2.3 I/O设备1.2.4 软件系统计算机编程语言 1.2…

Android Studio新建项目下载依赖慢,只需一个操作解决

新建的安卓工程&#xff0c;下载依赖贼慢怎么办&#xff1f;水一篇吧。 首先新建工程&#xff0c;建好以后项目就自动开始下载了&#xff0c;底部开始出现进度条&#xff0c;但是进度条一直不怎么动&#xff0c;网速也就十几k&#xff0c;要是等他下载得下一天。 直入主题&…

html+css 通过div模拟出一个表格样式,优化多个边框导致的宽度计算问题

htmlcss 通过div模拟出一个表格样式&#xff0c;优化多个边框导致的宽度计算问题 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

json字符串转为开闭区间

1.需求背景 1.1 前端页面展示 1.2 前后端约定交互json 按照页面每一行的从左到右 * 示例 [{"leftSymbol":">","leftNum":100,"relation":"无","rightSymbol":null,"rightNum":0}, {"left…