25考研数据结构复习·7.4B树和B+树7.5散列(Hash)表

news2025/7/14 18:28:57

目录

B树和B+树

B树

m阶B树的核心特性

B树的插入

B树的删除

非终端结点关键字

终端结点关键字

低于下限

B+树

散列(Hash)表

基本概念

散列函数的构造

👩‍💻 除留余数法

直接定址法

数字分析法

平方取中法

处理冲突的方法——拉链法

插入操作

查找操作

删除操作

处理冲突的方法——开放定址法

基本原理

元素的操作

插入

查找

👩‍💻 删除

四种常用的“探测序列”

四种增量序列的“覆盖率


B树和B+树

B树

含n个关键字的m叉B树log_{m}(n+1)\leq h\leq log_{\left \lceil m/2 \right \rceil}\frac{n+1}{2}+1

m阶B树的核心特性

  1. 👩‍💻 (尽可能“满”)根节点的子树∈[2,m],关键字数∈[1,m-1]。其他结点的子树数∈[⌈m/2⌉,m];关键字∈[⌈m/2⌉-1,m-1]
  2. 👩‍💻(尽可能“平衡”)对任一结点,其所有子树高度都相同
  3. 关键字的值:子树0<关键字1<子树1<关键字2<子树2<……(类比二叉查找树 左<中<右)

B树的插入

  1. 通过“查找”确定插入位置(一定是在终端结点)
  2. 若插入后结点关键字个数未超过上限,则无需做其他处理
  3. 若插入后关键字个数超过上限,则需要将当前结点的中间元素放到父节点中,当前节点分裂为两个部分:该操作会导致父节点关键字个数+!,若父节点关键字个数也超过了上限,则需要再向上分裂;根节点的分裂会导致B树高度+1

B树的删除

非终端结点关键字
  1. 用其直接前驱或直接后继替代其位置,转化为对”终端结点“的删除
  2. 直接前驱:当前关键字左边指针所指子树中”最右下“的元素
  3. 直接后继:当前关键字右边指针所指子树中”最坐下“的元素

终端结点关键字

删除后结点关键字个数未低于下限,无需任何处理

低于下限
  1. 右兄弟够借,则用当前结点的后继、后继的后继依次顶替空缺
  2. 左兄弟够借,则用当前结点的前驱,前驱的前驱依次顶替空缺
  3. 左(右)兄弟不够借,则需要与父节点内的关键字、左(右)兄弟进行合并。合并后导致父节点关键字数量-1,可能需要继续合并。

B+树

m阶B树m阶B+树
类比二叉查找树的进化 → m叉查找树分块查找的进化 → 多级分块查找
关键字与分叉n个关键字对应n+1个分叉(子树)n个关键字对应n个分叉
结点包含的信息所有结点中都包含记录的信息只有最下层叶子节点才包含记录的信息(可使树更矮)
查找方式不支持顺序查找。查找成功时,可能停在任何一层结点,查找速度”不稳定“支持顺序查找。查找成功或失败都会到达最下一层结点,查找速度“稳定”
相同点除根节点外,最少⌈m/2⌉个分叉(确保结点不能太”空“)任何一个结点的子树都要一样高(确保”绝对平衡“)

散列(Hash)表

基本概念

  1. 散列表:又称哈希表,可以根据数据元素的关键字计算出它在散列表中的存储地址
  2. 散列函数:建立了“关键字”→“存储地址”的映射关系
  3. 同义词:若不同的关键字通过散列函数映射到同一个存储地址,则称它们为“同义词”
  4. 冲突(碰撞):在散列表中插入一个数据元素时,若插入的位置已经存储了其他元素,则这种情况视为“冲突(碰撞)”

散列函数的构造

👩‍💻 除留余数法

  1. 散列地址:H(key) = key % p 其中,p通常是不大于散列表表长的最大质数
  2. 适用场景:较为通用,只要关键字是整数即可

直接定址法

  1. 散列地址:H(key) = a * key + b 其中,a和b是常数
  2. 适用场景:关键字分布基本连续

数字分析法

  1. 选取数码分布较为均匀的若干位作为散列地址
  2. 适用场景:关键字集合已知,且关键字的某几个数码位分布均匀

平方取中法

  1. 计算关键字的平方,取中间几位作为散列地址
  2. 适用场景:关键字的每位取值都不够均匀

处理冲突的方法——拉链法

拉链法(又称链接法、链地址法):把所有“同义词”存储在一个链表中

插入操作

  1. 根据散列函数计算新元素的散列地址
  2. 将新元素插入散列地址对应的链表(可用头插法或尾插法)

查找操作

  1. 根据散列函数计算新元素的散列地址
  2. 顺序查找散列列表对应的链表,直到查找成功或查找失败
  3. 在分析查找长度时,通常只统计“关键字的对比次数”,而链表“空指针的对比次数”不计入查找长度

删除操作

  1. 根据散列函数计算新元素的散列地址
  2. 顺序查找散列地址对应的链表,若查找成功,将目标元素从链表中删除

处理冲突的方法——开放定址法

基本原理

当初始散列地址发生冲突时,根据“探测序列”d_i探测下一个地址Hi=(H(key)+di)%m

元素的操作
插入

根据散列函数算出初始散列地址,若发生冲突,就“探测”下一个地址,直到找到一个空闲地址,即可插入元素

查找

根据散列函数算出初始散列地址,对比关键字,若关键字不匹配,就“探测”下一个地址,直到关键字匹配(成功)或探测到一个空位置(失败)

👩‍💻 删除

先按照“查找操作”的规则找到目标元素,若查找成功,就把目标元素“逻辑删除”。注意不能“物理删除”。

四种常用的“探测序列”

1. 👩‍💻 线性探测法d_i=0,1,2,3,...,m-1

2. 平方探测法:d_i=0^2,1^2,-1^2,2^2,-2^2,...,k^2,-k^2,.其中k≤m/2

3. 双散列法:d_i=i*hash_2(key).其中hash_2(key)是另一散列函数

4. 伪随机序列法:d_i是一个伪随机序列,如d_i = 0,5,3,11,...

四种增量序列的“覆盖率”

  1. 线性探测率:经过m-1次冲突,一定能探测到散列表的所有单元。
  2. 平方探测法:一般来说,探测序列至少能覆盖到散列表的一半单元。若能保证表长m是一个可以表示成4x+3的素数,则可以探测到散列表的所有单元
  3. 双散列法:若能保证hash2(key)的值和表长m互质,则经过m-1次冲突,一定能探测到散列表的所有单元
  4. 伪随机序列法:只要伪随机序列设计和理论,就能 探测到全部单元

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

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

相关文章

动手学深度学习V2每日笔记(池化层)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1EV411j7nX/spm_id_from333.999.0.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&#xff0c;内容不会特别…

Linux基础环境开发工具(二)

目录 一、前言二、make和makefile工具1.快速认识一下2.依赖关系和依赖方法3.执行原理 三、Git工具1.快速认识一下2.git的使用 四、gdb工具1.快速认识一下2、类比Windows使用 一、前言 在开发工具第一篇中我们介绍了yum&#xff0c;vim&#xff0c;gcc/g编译器这几种工具&#…

C++ 继承 派生类的拷贝构造

继承 派生类的拷贝构造构造顺序拷贝构造 引例1: 当子类,不自实现拷贝构造时,默认调用父类的拷贝构造引例2: 子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.引例3: 显示的调用父类的拷贝构造器。案例: 内嵌函数的拷贝构造 引例1 :当内嵌子对象,子类不自实现拷贝构造时…

Netty二

Netty 问题分析 bootstrap serverBootstrap pipeline和channelPipeline EventLoopGroup和实现类NioEventLoopGroup

U2net论文复现-简单解读-以及奇奇怪怪的改进-测试roc以及pr

论文地址&#xff1a;U2net论文地址 显著性目标检测&#xff1a; Salient ObjectDetetion(SOD)显著性目标检测&#xff0c;就是要把图片中最显著的物体分割出来&#xff0c;所以是二分类任务&#xff0c;只需要背景和前景。 1、Introduce 1.1、目前存在的2个挑战&#xff1…

Day-11 员工管理案例 增删改查、配置文件

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在"新…

Midjourney、Sora和硅谷机密-《分析模式》漫谈15

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的Preface&#xff08;前言&#xff09;有这么一句&#xff1a; Kent Beck, Ward Cunningham, and Jim Coplein encouraged me to get involved with the commu…

《Advanced RAG》-02-揭开 PDF 解析的神秘面纱

摘要 PDF 文件是非结构化文档的代表&#xff0c;但从 PDF 文档中提取信息是一个具有挑战性的过程。 PDF 文件由一系列指令组成&#xff0c;这些指令指示 PDF 阅读器或打印机在屏幕或纸张上显示符号的位置和方式。与 HTML 和 docx 等文件格式不同&#xff0c;后者使用标记来组织…

8月2日,贪心-买卖股票的最佳时期

大家好呀&#xff0c;今天我们看两道用贪心算法解的两道题&#xff0c;150道经典面试题中的买卖股票的最佳时期1和2。 1.买卖股票的最佳时期1 . - 力扣&#xff08;LeetCode&#xff09; 思路 对于这题&#xff0c;我们其实很容易想出暴力解&#xff0c;那就是从后往前找值&…

【文件系统】抽象磁盘的存储结构 CHS寻址法 | sector数组 | LAB数组

目录 1.为什么要抽象 2.逻辑抽象_版本1 2.1sector数组 ​2.2index转化CHS 3.逻辑抽象_版本2 3.1LBA数组 3.2LAB下标转化sector下标 文件其实就是在磁盘中占有几个扇区的问题❗文件是很多个sector的数组下标❗文件是有很多块构成的❗❗文件由很多扇区构成------>文件…

C语言刷题小记3

题目1 序列中删除指定数字 分析&#xff1a;本题要求我们来删除一个序列中指定的数字&#xff0c;这里大家要注意我们要删除的数字可能不止出现一次&#xff0c;所以我们需要用两个变量来进行处理&#xff0c;一个变量来遍历数组&#xff0c;一个变量来存储数组的位置&#xff…

H5 上使用腾讯位置服务选择收货信息

效果图 首先需要在腾讯位置服务上申请你自己的key&#xff0c;可参考地图选点组件 // 点击打开地图 backurl 是点击选中的位置点后&#xff0c;页面跳转至要返回的地址&#xff08;backurl&#xff09;&#xff0c;会将位置信息添加到回跳地址&#xff08;backurl&#xff0…

【威胁情报】新的 BingoMod Android 安卓恶意软件伪装成安全应用程序,清除数据

关注公众号网络研究观获取更多内容。 小心 BingoMod&#xff01;这种危险的 Android 恶意软件会窃取您的钱财、清除您的手机数据并控制您的设备。 了解如何保护自己免受这种阴险威胁。保持在线安全&#xff01; 计算机安全解决方案提供商 Cleafy 发现了一种狡猾的远程访问木…

PCIe总线-RK3588 PCIe RC初始化流程分析(十二)

1.简介 RK3588 PCIe RC的初始化涉及PCIe设备枚举、中断&#xff08;INTx、MSI、MSI-X&#xff09;配置、BAR配置、ATU配置、链路训练等&#xff0c;下面一一介绍。 2.初始化 当RC的模式为RK_PCIE_EP_TYPE时&#xff0c;平台驱动调用rk_add_pcie_port函数初始化RC&#xff0c…

如何将Maven子项目插入到Maven父项目中

Maven项目的融合具体方法&#xff1a; 1.在电脑本地磁盘拷贝Maven子项目&#xff1b; 2.用IDEA软件打开Maven父项目&#xff1b; 3.在IDEA中选中Maven父项目&#xff1b; 4.将复制好的的Maven子项目粘贴到Maven父项目中&#xff1b; 5.选中子项目的pom文件&#xff0c;右键选择…

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_5【二十四】

解除apk功能 限制主要是一些app只有付费或者开通vip才可以使用所有功能。这些对于热爱反编译的你是不是比较愤慨,今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。 反编译工具:…

无人机无人车固态锂电池技术详解

随着无人机和无人车技术的飞速发展&#xff0c;对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表&#xff0c;正逐步从实验室走向市场&#xff0c;为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池&#xff0c;固态锂电池在能量密度…

C++中的二维数组

引言 C语言的二维数组可直接用【】【】建立&#xff0c;C的数组更多实用vector<int>表示&#xff0c;那二维数组如何表示呢&#xff1f; 表示法 解读 vector<int>的含义是。 申请了一个连续空间vector&#xff0c;里面的数据是一个个的int vector<vector&l…

Spring - 解析 统一数据格式返回以及统一异常处理

接上篇文章的统一数据格式返回… 文章目录 1. 统一异常处理1.1 使用 2. 统一数据返回和统一异处理是怎么实现的2.1 initHandleAdapters2.2 initHandleExceptionResolvers 1. 统一异常处理 1.1 使用 统一异常处理的两个关键的注解是ControllerAdvice ExceptionHandler Contro…

C++入门基本语法(2)

一、引用 1、基本概念与定义 引用不是新定义一个变量&#xff0c;而是给已存在的变量起一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它所引用的变量公用同一块内存空间&#xff1b; 引用的写法&#xff1a;变量类型& 引用别名 变量&#xff…