14.数据结构之多路查找树与堆

news/2024/5/20 8:53:40 标签: 数据结构, b树, 大根堆, 小根堆,

前言

之前介绍的都是二叉查找树,二叉树一个节点最多有两个子节点,那么多于两个节点是什么情况呢,这就是我们本节要介绍的多路查找树。

多路查找树,也是我们数据库mysql底层索引维护方式。下面,我们来详细介绍。

1. B 树

1.1 定义

1.1.1 多路查找树

多路查找树(muitl-way search tree),其每一个节点的孩子数可以多于两个,且每一个节点处可以存储多个元素。

1.1.2 B 树

B树(BalanceTree)是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。
在这里插入图片描述

1.2 特征

一棵m阶的B 树 (m叉树)的特性如下:

  1. B树中所有节点的孩子节点数中的最大值称为B树的阶,记为M
  2. 树中的每个节点至多有M棵子树 —即:如果定了M,则这个B树中任何节点的子节点数量都不能超过M
  3. 若根节点不是终端节点,则至少有两棵子树
  4. 除根节点和叶节点外,所有点至少有m/2棵子树
  5. 所有的叶子结点都位于同一层

2. B+ 树

在这里插入图片描述

2.1 特征

B+树是B-树的变体,也是一种多路搜索树,其定义基本与B树相同,它的自身特征是:

  1. 非叶子结点的子树指针与关键字个数相同
  2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树
  3. 为所有叶子结点增加一个链指针
  4. 所有关键字都在叶子结点出现

2.2 B和B+的区别

  1. B树和B+树的最大区别在于非叶子节点是否存储数据的问题。
  2. B树是非叶子节点和叶子节点都会存储数据。
  3. B+树只有叶子节点才会存储数据而且存储的数据都是在一行上,而且这些数据都是有指针指向的,也就是有顺序的。

2.3 应用

2.3.1 MySQL索引B+Tree

  1. B树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树
  2. B树的高度一般都是在2-4这个高度,树的高度直接影响IO读写的次数
  3. 如果是三层树结构,支撑的数据可以达到20G;如果是四层树结构,支撑的数据可以达到几十T

3. 二叉

二叉本质上是一种完全二叉树,它分为两个类型

3.1 定义

3.1.1 大顶(最大)

最大的任何一个父节点的值,都大于或等于它左、右孩子节点的值。
在这里插入图片描述

3.1.2 小顶(最小)

最小的任何一个父节点的值,都小于或等于它左、右孩子节点的值。
在这里插入图片描述

3.2 存储原理

完全二叉树比较适合用数组来存储。用数组来存储完全二叉树是非常节省存储空间的。因为不需要存储左右子节点的指针,单纯地通过数组的下标,就可以找到一个节点的左右子节点和父节点。
在这里插入图片描述
如上图所示,数组中下标为 i 的节点的左子节点,就是下标为 i∗2 的节点,右子节点就是下标为 i∗2+1 的节点,父节点就是下标为 i/2 取整的节点。

3.3 二叉的典型应用

  1. 优先队列
  2. 利用求 Top K问题
    在一个包含 n 个数据的数组中,我们可以维护一个大小为 K 的小顶,顺序遍历数组,从数组中取出数据与顶元素比较。如果比顶元素大,我们就把顶元素删除,并且将这个元素插入到中;如果比顶元素小,则不做处理,继续遍历数组。这样等数组中的数据都遍历完之后,中的数据就是前 K 大数据了

http://www.niftyadmin.cn/n/414695.html

相关文章

SpringBoot共享图书平台(有文档)

1.简介 SpringBoot共享图书平台 本项目比较简单,适合练手,也适合二开 1.访问地址 http://localhost/ 超级管理员账户 账户名:admin 密码:admin123 普通用户 账户名: zhangsan 密码:123456 普通用户 账…

使用encodeURI出现URI malformed报错?

今天在一个业务模块中遇到一个问题。在点击导出后出现了 **URI malformed **报错提示。 一开始我以为是进行 encode 加密的时候将搜索对象进行了 JSON 序列化导致的。然后就将 JSON.stringify 去掉了,发现还是不行。 然后经过排查发现只有在查询条件 Name 字段输入值…

python3写一个http接口服务(get, post),给别人调用6

python3写一个http接口服务(get, post),给别人调用6 一、python3写一个http接口服务(get, post),给别人调用6 近年来异步web服务器比较火热,例如falcon/bottle/sanic/aiohttp,今天也来玩玩sanic。 Sanic是一个支持Python 3.7的w…

面经|饿了么销售运营

岗位主要是做绩效和激励方向的,面试体验还可以,但是方向不太匹配,挂掉了 1.自我介绍 基础信息与岗位匹配的点 2.离职原因 3.日常在绩效工作中会做那些事情,以及说一个典型的项目 4.组织架构 5.怎么判断这个绩效方案是有牵引作用的…

MD5算法转换成SHA256算法(java示例)

标签:MD5, SHA256 众所周知,MD5算法已经是不安全的算法。但目前现有的代码中很多都是MD5算法,怎样从MD5算法迁移到推荐到SHA256算法呢?以下是MD5代码示例: import java.math.BigInteger; import java.sec…

TreeMap类型实体类数据进行排序

实体类Student类代码如下所示&#xff1a; package com.test.Test11;public class Student implements Comparable<Student>{private int age;private String name;private Double height;public int getAge() {return age;}public void setAge(int age) {this.age age…

【免配置】Qt的mingw使用编译opencv库

【免配置】Qt的mingw_32/64使用编译opencv库 网上在qt中使用mingw编译器配置opencv的时候&#xff0c;通常需要使用cmake编译工具&#xff0c;进行预先编译&#xff0c;步骤比较繁琐&#xff0c;这里推荐一个捷径&#xff0c;直接使用前人编译好的opencv库即可&#xff0c;避免…

elementui tree 支持虚拟滚动和treeLine (上)

背景&#xff1a;在使用elementuivue2.x进行项目开发时&#xff0c;有用到el-tree组件&#xff0c;但是在数据很多时会卡顿 基于以上背景elementui 提供的el-tree组件无法满足需求。 期间在网上调研了很多相关的tree组件&#xff0c;例如&#xff1a; vue-treeszTreesjsTrees…