B树的定义和特点

news/2024/12/2 21:38:34/

1.多叉查找树的效率

  • 策略1:m叉查找树中,规定除了根节点外,任何结点至少有[m/2]个分叉
  • 即至少含有[m/2]-1个关键字。
  • 策略2:m叉查找树中,规定对于任何一个结点,其所有子树的高度都要相同

而满足以上两种策略的树被称为B树。

2.B树的定义

B树,又称多路平衡查找树,B树中所有结点的孩子个数的最大值称为B树的阶,通常用m表示。

1.B树的特点

一棵m阶B树或为空树,或为满足如下特性的m叉树:

  1. 树中每个结点至多有m棵子树,即至多含有m-1个关键字。
  2. 若根结点不是终端结点,则至少有两棵子树。
  3. 除根结点外的所有非叶结点至少有「m/2]棵子树,即至少含有「m/2]-1个关键字
  4. 所有非叶结点的结构如下:
    在这里插入图片描述

其中,Ki (i = 1,2…, n)为结点的关键字,且满足K1<K2<…<Kn;
Pi (i= 0,1… n)为指向子树根结点的指针,且指针Pi-1所指子树中所有结点的关键字均小于Ki,
Pi所指子树中所有结点的关键字均大于Ki,n( [m/2]- 1≤n≤m -1)为结点中关键字的个数。

  1. 所有的叶结点都出现在同一层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的查找失败结点,实际上这些结点不存在,指向这些结点的指针为空)。

例如:
在这里插入图片描述

2.m阶B树的核心特性

  • 根节点的子树数∈[2, m],关键字数∈[1, m-1]。
  • 其他结点的子树数∈[[m/2], m];关键字数∈[[m/2]-1, m-1]
  • 对任一结点,其所有子树高度都相同
  • 关键字的值∶子树0<关键字1<子树1<关键字2<子树2<…(类比二叉查找树左<中<右)
    \

3.计算B树的高度

注:大部分学校算B树的高度不包括叶子结点(失败结点)

问题:含n个关键字的m阶B树,最小高度、最大高度是多少?

1.最小高度:

  • 让每个结点尽可能的满,有m-1个关键字,m个分叉,
  • 则有 n ≤ ( m − 1 ) ( 1 + m + m 2 + m 3 + . . . + m h − 1 − 1 ) = m h − 1 n≤(m - 1)(1+ m+m^2+m^3+ ...+ m^{h-1}-1)= m ^h-1 n(m1)(1+m+m2+m3+...+mh11)=mh1
  • 因此 h ≥ l o g m ( n + 1 ) h ≥ log_ m(n+1) hlogm(n+1)

2.最大高度:

  • 让各层的分叉尽可能的少,即根节点只有2个分叉,其他结点只有[m/2]个分叉,
  • 各层结点至少有:第一层1、第二层2、第三层2[m/2] …第h层 2 ( [ m / 2 ] ) h − 2 2([m/2])^{h-2} 2([m/2])h2,
  • 第h+1层共有叶子结点(失败结点) 2 ( [ m / 2 ] ) h − 1 2([m/2])^{h-1} 2([m/2])h1个,
  • n个关键字的B树必有n+1个叶子结点,则 n + 1 > 2 ( [ m / 2 ] ) h − 1 n+1> 2([m/2])^{h-1} n+1>2([m/2])h1
  • h ≤ l o g [ m / 2 ] ( n + 1 ) / 2 + 1 h ≤ log_{[m/2]}{(n+1)/2}+1 hlog[m/2](n+1)/21

http://www.ppmy.cn/news/1116623.html

相关文章

QT记事本+登陆界面的简单实现

主体头文件 #ifndef JSB_H #define JSB_H#include <QMainWindow> #include <QMenuBar>//菜单栏 #include <QToolBar>//工具栏 #include <QStatusBar>//状态栏 #include <QTextEdit>//文本 #include <QLabel>//标签 #include <QDebug&g…

【JavaEE】多线程案例-单例模式

文章目录 1. 前言2. 什么是单例模式3. 如何实现单例模式3.1 饿汉模式3.2 懒汉模式4. 解决单例模式中遇到的线程安全问题4.1 加锁4.2 加上一个判断解决频繁加锁问题4.2 解决因指令重排序造成的线程不安全问题 1. 前言 单例模式是我们面试中最常考到的设计模式。什么是设计模式呢…

开发环境_Linux

环境搭建 文章目录 环境搭建[toc]DockerDocker运行权限Docker加速Docker容器创建 Python版本切换版本工具RepoGit 开发SDK代码拉取在线离线(推荐) Debian安装软件包编译打包 问题技巧 Docker sudo apt install docker.ioDocker运行权限 #添加docker group sudo groupadd doc…

c语言进阶部分详解(指针进阶1)

大家好&#xff01;指针的初阶内容我已经写好&#xff0c;可移步至我的文章&#xff1a;c语言进阶部分详解&#xff08;指针初阶&#xff09;_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述&#xff0c;直接带大家进入进阶内容&#xff1a; 目录 一.字符指针 1.讲解…

深眸科技迭代深度学习算法,以AI机器视觉技术扩围工业应用场景

智能制造是制造业数智化转型升级的发展方向&#xff0c;在当前以高端装备制造为核心的工业4.0时代背景下&#xff0c;越来越多的制造企业意识到机器视觉对于提高效率、降低成本&#xff0c;从而提升企业效益的意义。 目前&#xff0c;机器视觉已成为制造业迈向智能制造过程中极…

Ubuntu修改静态IP、网关和DNS的方法总结

Ubuntu修改静态IP、网关和DNS的方法总结 ubuntu系统&#xff08;其他debian的衍生版本好像也可以&#xff09;修改静态IP有以下几种方法。&#xff08;搜索总结&#xff0c;可能也不太对&#xff09; /etc/netplan (use) Ubuntu 18.04开始可以使用netplan配置网络&#xff0…

设计模式:桥接器模式(C++实现)

桥接器模式&#xff08;Bridge Pattern&#xff09;是一种结构设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。桥接器模式通常用于需要在多个维度上扩展和变化的情况下&#xff0c;将抽象和实现解耦。 以下是一个简单的C桥接器模式的示例&a…

掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)

说明&#xff1a;在复现过程中出现两点问题&#xff08;1&#xff09;run()函数中对m_diceValued的赋值&#xff08;2&#xff09;do_timeOut()函数中没有对m_seq、m_diceValued进行定义。修改后的复现程序如下所示&#xff1a; 主线程&#xff1a; .h #pragma once#include…