【高阶数据结构】B树

目录

1.B树

2.B+树和B树的不同

3.B*树


B树较于哈希红黑树的优势:外查找:读取磁盘数据   ; B树的高度更低,对磁盘的进行I/O操作的次数更少(磁盘的性能比内存差得多);

1.B树

1.1.B树的概念:

  1. 根节点至少有两个孩子       (空树除外)
  2. 每个分支节点都包含k-1个关键字和k个孩子,其中 ceil(m/2) ≤ k ≤ m ceil是向上取整函数     (分支节点都是依靠叶节点分裂得到,孩子依靠分裂得到)
  3. 每个叶子节点都包含k-1个关键字,其中 ceil(m/2) ≤ k ≤ m       (叶子节点没有孩子)
  4. 所有的叶子节点都在同一层   (因为分裂向上插入)
  5. 每个节点中的关键字从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分  ( 所有左孩子 <  关键字  < 所有右孩子 )
  6. 每个结点的结构为:(n,A0,K1,A1,K2,A2,… ,Kn,An)其中,Ki(1≤i≤n)为关键子,且Ki < Ki+1(1<= i <= n-1)  Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。n为结点中关键字的个数,满足ceil(m/2)-1≤n≤m-1。

分裂:所有元素都是插入关键字,孩子是指向的节点指针;数组满了,分裂出brother(new出来)节点将【mid+1,r】拷贝给brother,如果父节点为空就,创建新的父节点,父节点的左边为原数组,有孩子为brother;

#pragma once
#include<iostream>
#include<vector>using namespace std;template<class T, size_t N>
class Node {public:Node(){//孩子最多为N个,关键字比孩子少一个//需要多开辟一个,来判断数组元素满_key.resize(N);_children.resize(N+1, nullptr);_parent = nullptr;_size = 0;}~Node(){}
public://关键字vector<T> _key;//孩子数据vector<Node<T, N>*> _children;//父亲节点Node<T, N>* _parent;//有效个数size_t _size;
};
template<class T, size_t N>
class BTree {
public:typedef Node<T, N> Node;//返回节点和下标pair<Node*, int> Find(T val){Node* parent = nullptr;Node* cur = _root;//找到合适位置,从左向右找 比当前元素大,判断是否有左孩子while (cur){size_t i = 0;while (i < cur->_size){//找到比我大的了if ( val < cur->_key[i] )break;else if ( val > cur->_key[i] )i++;else//元素存在了,退出return make_pair(cur, i);}//保存父亲parent = cur;cur = cur->_children[i];}//不存在,返回父亲和-1return make_pair(parent, -1);}void _Insert(T val, Node* parent, Node* child){int end = parent->_size - 1;//从最后一个元素挪数据while (end >= 0){//目标元素更小,挪if (val < parent->_key[end]){parent->_key[end + 1] = parent->_key[end];parent->_children[end + 2] = parent->_children[end + 1];//挪右孩子end--;}elsebreak;}//合适的插入位置parent->_key[end + 1] = val;parent->_children[end + 2] = child;//右孩子if (child)//指向父亲child->_parent = parent;parent->_size++;}bool Insert(T val){//第一个插入的元素if (_root == nullptr){_root = new Node;_root->_key[0] = val;_root->_size++;}else{//查找是否存在pair<Node*, int> pr = Find(val);if (pr.second >= 0)//元素已存在,不用在插入return false;//该插入的位置Node* parent = pr.first;Node* child = nullptr;_Insert(val, parent, child);while (true){if (parent->_size < N)return true;else//数组满,分离{//分裂 [l, mid-1]   [mid+1, r]int mid = N / 2;size_t i = 0;size_t j = mid + 1;//分离兄弟节点Node* brother = new Node;for (; j < N; j++, i++){brother->_key[i] = parent->_key[j];brother->_children[i] = parent->_children[j];//有孩子节点,brother做新父亲if (parent->_children[j])parent->_children[j]->_parent =  brother;//分裂给兄弟的关键字和孩子置空parent->_children[j] = nullptr;parent->_key[j] = T();}//还有一个右孩子给brotherbrother->_children[i] = parent->_children[j];if (parent->_children[j])parent->_children[j]->_parent = brother;parent->_children[j] = nullptr;//分裂完处理个数;brother->_size = i;parent->_size -= (i + 1);//减去兄弟和中间//中间值向上插入T midKey = parent->_key[mid];parent->_key[mid] = T();//头节点if (parent->_parent == nullptr){_root = new Node;_root->_key[0] = midKey;_root->_children[0] = parent;_root->_children[1] = brother;_root->_size = 1;//孩子的父亲为头parent->_parent = _root;brother->_parent = _root;break;}else{//非头重新插入_Insert(midKey, parent->_parent, brother);//继续循环,看上一层是否满了parent = parent->_parent;}}}}}
public:
private:Node* _root = nullptr;
};

 测试代码:

#include"BTree.h"
void TestBtree()
{int a[] = { 53, 139, 75, 49, 145, 36, 101 };BTree<int, 3> t;for (auto e : a){t.Insert(e);}
}
int main()
{TestBtree();
}

2.B+树和B树的不同

  1. 分支节点的子树指针与关键字个数相同
  2. 分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间
  3. 所有叶子节点增加一个链接指针链接在一起
  4. 所有关键字及其映射数据都在叶子节点出现

B+树的特性:

  1. 所有关键字都出现在叶子节点的链表中,且链表中的节点都是有序的。
  2. 不可能在分支节点中命中。 
  3. 分支节点相当于是叶子节点的索引,叶子节点才是存储数据的数据层。

3.B*树

B*树是B+树的变形,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。

区别就是分裂方式不同:不同当前节点和下一个兄弟节点都满才分裂,都区1/3构成一个new节点,提高利用率, 最多3/1被浪费;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Puppeteer中设置User-Agent来绕过京东的反爬虫机制?

概述 京东作为中国最大的电商平台&#xff0c;为了保护其网站数据的安全性&#xff0c;采取了一系列的反爬虫机制。然而&#xff0c;作为开发者&#xff0c;我们可能需要使用爬虫工具来获取京东的数据。 正文 Puppeteer 是一个由 Google 开发的 Node.js 库&#xff0c;它提供…

2023年集成电路还缺人吗?集成电路产业人才供需研讨会

10月20日&#xff0c;移知教育创始人团长受邀参与由ARM举办的《集成电路产业人才供需研讨会》&#xff0c;同样受邀参与的还有上海大学、华东理工大学、华东师范大学、上海工程技术大学、上海人社高级职称评审专家等等&#xff0c;高校负责人以及行业专家应邀参加了本次研讨会。…

数学与经济管理

数学与经济管理&#xff08;2-4分&#xff09; 章节概述 最小生成树问题 答案&#xff1a;23 讲解地址&#xff1a;74-最小生成树问题_哔哩哔哩_bilibili 最短路径问题 答案&#xff1a;81 讲解地址&#xff1a;75-最短路径问题_哔哩哔哩_bilibili 网络与最大流量问题 真题 讲解…

asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net乡村旅游管理系统 二、…

2023年下半年WSK-PETS5考试内容大纲及题型解析

国家公派留学人员全国外语水平考试&#xff08;WSK-PETS5&#xff09;成绩作为国家留学基金委&#xff08;CSC&#xff09;认可语言成绩证明&#xff0c;一直备受公派访问学者、博士后申请者的关注。随着下半年考试时间的临近&#xff0c;知识人网小编特整理出本次考试内容大纲…

U盘安装Windows10系统(最新最详细图文教程)

目录 一.简介 二.安装步骤 2.1、用U盘制作PE系统 2.2 安装系统 软件&#xff1a;Windows 10版本&#xff1a;1909语言&#xff1a;简体中文大小&#xff1a;4.95G安装环境&#xff1a;PE系统&#xff0c;7代以上处理器硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xf…

【从瀑布模式到水母模式】ChatGPT如何赋能软件研发全流程

文章目录 &#x1f384;前言&#x1f354;本书概要&#x1f33a;内容简介&#x1f33a;作者简介&#x1f33a;专家推荐&#x1f6f8;读者对象&#x1f354;彩蛋 &#x1f384;前言 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地…

聊聊“JVM 调优JVM 性能优化”是怎么个事?

所谓“调优”就是一个诊断和处理手段&#xff0c;最终的目标是让系统的处理能力&#xff0c;也就是“性能”达到最优化。 计算机系统中&#xff0c;性能相关的资源主要分为这几类&#xff1a; CPU&#xff1a;CPU 是系统最关键的计算资源&#xff0c;在单位时间内有限&#xf…

Qt篇——子控件QLayoutItem与实际控件的强转

方法&#xff1a;使用qobject_cast<QLabel*>() &#xff0c;将通过itemAt(i)获取到的子控件(QLayoutItem)强转为子控件的实际类型(如QLineEdit、QLabel等)。 场景举例&#xff1a; QLabel *label qobject_cast<QLabel*>(ui->horizontalLayout_40->itemAt(0…

十八、字符串(3)

本章概要 正则表达式 基础创建正则表达式量词CharSequencePattern 和 Matcherfinde()组&#xff08;Groups&#xff09;start() 和 end()Pattern 标记split()替换操作reset()正则表达式与 Java I/0 正则表达式 很久之前&#xff0c;_正则表达式_就已经整合到标准 Unix 工具…

在el-dialog中使用tinymce 点击工具栏下拉框被遮挡

在el-dialog中使用tinymce控件时&#xff0c;会出现点击工具栏下拉框出现在弹窗下一层&#xff0c;审查元素之后发现是tinymce的下拉框z-index优先级低于el-dialog的z-index导致的&#xff0c;所以需要增加tinymce的下拉框的z-index值。 通过审查元素得到&#xff0c;需要修改t…

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

LIO-SAM算法解析

文章目录 简介算法概述1.点云去畸变1.1 主要功能1.2 主要流程 2.特征提取3.IMU预积分4.地图优化5.算法评估 简介 LIO-SAM在lego-loam的基础上新增了对IMU和GPS的紧耦合&#xff0c;采用一个因子图对位姿进行优化&#xff0c;包括IMU因子&#xff0c;激光里程计因子&#xff0c…

找游戏外包开发游戏,有哪些好处呢?

游戏外包开发是将游戏开发的一部分或全部工作交给专业的外部开发团队或公司完成的做法。这种方法有许多潜在的好处&#xff0c;包括&#xff1a; 降低成本&#xff1a;游戏外包通常可以降低游戏开发成本&#xff0c;因为外包开发公司通常可以提供更具竞争力的价格。这是因为它…

威联通NAS进阶玩法之使用Docker搭建个人博客教程

Hello大家好&#xff0c;本篇教程主要教大家在威联通的NAS上搭建属于自己的个人博客网站&#xff0c;首先介绍一下我使用的机器&#xff0c;四盘位威联通TS-464C2&#xff0c;搭载四核四线程的N5095处理器&#xff0c;支持4K60帧的输出以及PCIE3.0,可玩性还是非常高的。废话不多…

css步骤条

html 代码以及样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css步骤条</title><style>.steps {display: flex;justify-content: space-between;padding: 0;margin: 20px 10px;lis…

Hadoop、Hive安装

一、 工具 Linux系统&#xff1a;Centos&#xff0c;版本7.0及以上 JDK&#xff1a;jdk1.8 Hadoop&#xff1a;3.1.3 Hive&#xff1a;3.1.2 虚拟机&#xff1a;VMware mysql&#xff1a;5.7.11 工具下载地址: https://pan.baidu.com/s/1JYtUVf2aYl5–i7xO6LOAQ 提取码: xavd…

【嵌入式项目应用】__cJSON在单片机的使用

目录 前言 一、JSON和cJson 二、cJSON是如何表示JSON数据的 三、如何封装完整的JSON数据 1. 先将串口打通&#xff0c;方便电脑查看log日志。 2. 增加cjson.c文件&#xff0c;已经在main.c中 3. 准备打包如下的JSON包 4. 代码部分&#xff0c;先将几个部分初始化指针 …

基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校友社交平台管理系统演示 摘要 校友社交系统提供给用户一个校友社交信息管理的网站&#xff0c;最新的校友社交信息让用户及时了解校友社交动向,完成校友社交的同时,还能通过论坛中心进行互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技…

Redis快速上手篇(四)(Spring Cache,缓存配置)(注解方式)

Spring Cache 从3.1开始&#xff0c;Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的 使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果。 使用Spring Cache需要我们做两方面…