图解B Tree和B+ Tree

简介: 图解B Tree和B+ Tree

图解B Tree和B+ Tree

1 B Tree起源

一篇国外的论文:https://infolab.usc.edu/csci585/Spring2010/den_ar/indexing.pdf

论文名称为大型有序索引的组织和维护,其中就指出了B Tree这个数据结构

其中,B Tree的定义:

  • 从根到叶结点的每条路径长度都是h,也称为Tree的高度,即h = 路径中的节点数。
  • 除根节点和叶节点外,每个节点至少有k -1个儿子。 根至少有两个儿子。
  • 每个节点最多有2k-1个儿子。

2 B Tree 数据结构

/**
 * B树数据结构
 */
private static class BTreeNode<K, V> {
    /**
   * 节点的项,按键非降序存放
   */
    private List<Entry<K, V>> entries;
    /**
   * 内节点的子节点
   */
    private List<BTreeNode<K, V>> children;
    /**
   * 是否为叶子节点
   */
    private boolean isLeaf;
    /**
   * 排序对象
   */
    private Comparator<K> kComparator;
    private BTreeNode() {
        entries = new ArrayList<>();
        children = new ArrayList<>();
        leaf = false;
    }
    
    /**
     * Entry类
     */
    static class Entry<K, V> {
        private K key;
        private V value;
        public Entry(K k, V v) {
            this.key = k;
            this.value = v;
        }
    }
}

3 图解B Tree

4 B+ Tree数据结构

  • 有k个子结点的结点必然有k个关键码;
  • 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
  • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

5 B Tree和B+ Tree对比

B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。

B+ 树的优点在于:

  • 由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
  • B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

参考文章:https://blog.csdn.net/fhy569039351/article/details/82976842

相关文章
|
达摩院 供应链 调度
【FlowShop流水线作业排班问题【数学规划的应用(含代码)】阿里达摩院MindOpt】
本文探讨了使用阿里巴巴达摩院的MindOpt工具解决FlowShop流水线作业排班的数学规划问题。FlowShop涉及到多台机器、多个工序和多个作业,目标是通过优化排班最小化总生产耗时。MindOpt通过数学规划方法,如线性或混合整数线性规划,将问题建模并转化为代码,利用云建模平台MindOpt Studio和MindOpt APL建模语言进行求解。案例中详细介绍了参数定义、变量解析、约束设置和目标函数,展示了如何通过MindOpt进行建模和求解,以达到最优化的生产调度。此外,文章还提供了代码示例和结果解析,帮助读者理解如何实际应用MindOpt解决这类问题。
|
监控 Docker 容器
sigma敏捷版系列文章:kubernetes grace period 失效问题排查
我们在使用 Kubernetes 时遇到了设置 --grace-period 参数不生效的问题,从 kubelet 日志看是 kubelet 接受到 Pod DELETE 事件后在同一秒内又接受到了 REMOVE 事件,所以 Pod 立刻就会删掉了。经过比较曲折的排查最后终于解决了这个问题,下面分享一下 kubernetes grace period 相关的一些概念和理论然后再介绍一下我们踩到
2770 0
|
人工智能 数据可视化 API
自动查文献+写代码+跑数据+出报告!港大开源 Auto Deep Research 搞定科研全流程
Auto-Deep-Research 是一款由香港大学开源的个人 AI 助理,基于模块化多 Agent 架构,专注于深度研究任务,兼容多种大语言模型,并提供一键启动和文件解析等强大功能。
1523 4
自动查文献+写代码+跑数据+出报告!港大开源 Auto Deep Research 搞定科研全流程
|
数据可视化 IDE 开发者
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
3315 1
|
测试技术 Shell Linux
lmbench andlmbench 移植测试
/*********************************************************************** * lmbench andlmbench 移植测试 * 说明: * 想要移植一下lmbench性能测试软件对Android系统性能进行测试,但发现 * Android的Linux shell命令太少了,总是出错,使用另外的busybox创建软链接, * 这样才能测试系统,目前没有自己去做busybox。
2065 0
|
存储 机器学习/深度学习 安全
【RISC-V 理论篇】概述
【RISC-V 理论篇】概述
1121 0
|
存储 编解码 算法
ans介绍学习
【9月更文挑战第5天】
2246 14
|
测试技术
lmbench内存延迟测试代码分析
lmbench有很多测试集, lat_mem_rd是用来测试内存延迟的 # 使用方法 ./bin/x86_64-linux-gnu/lat_mem_rd 1 16 #./bin/x86_64-linux-gnu/lat_mem_rd 1(范围, 单位M) 16(步长) "stride=16 0.00049 1.584(单位M, 512字节范围内, 步长16访问延迟, 为什么显示
10856 1
|
机器学习/深度学习 人工智能 自然语言处理
四张图片道清AI大模型的发展史(1943-2023)
现在最火的莫过于GPT了,也就是大规模语言模型(LLM)。“LLM” 是 “Large Language Model”(大语言模型)的简称,通常用来指代具有巨大规模参数和复杂架构的自然语言处理模型,例如像 GPT-3(Generative Pre-trained Transformer 3)这样的模型。这些模型在处理文本和语言任务方面表现出色,但其庞大的参数量和计算需求使得它们被称为大模型。当然也有一些自动生成图片的模型,但是影响力就不如GPT这么大了。
5943 0
|
存储 设计模式 缓存
寻找一把进入 Alibaba Sentinel 的钥匙(文末附流程图)
寻找一把进入 Alibaba Sentinel 的钥匙(文末附流程图)
寻找一把进入 Alibaba Sentinel 的钥匙(文末附流程图)