B树B+树,字典树详解,哈夫曼树博弈树

目录

B树:B-Tree

B+树

字典树:Trie Tree

 哈夫曼树

博弈树


B树:B-Tree

多路平衡搜索树

1.M阶B树,就是M叉(M个指针)。

2.每个节点内记录个数<=M-1。

3.根节点记录个数>=1。

4.其余节点内记录个数>=ceil(m/2)-1(向上取整)。

5.每个节点内的记录从左至右从大到小有序。

6.当前记录的左子树的值均小于当前记录,右子树的值均大于当前记录。

插入:

(1)新记录插入叶子节点。

(2)叶子节点记录个数:1.<=m-1结束。2.>m-1裂变,中间记录上移至父亲层,左半部分变成左子树,右半部分变成右子树,讨论父亲层同(2)。

这里是m=5,来演示一下。

这里添加个23

这里添加个88

删除:

(1)查找是否是叶子节点是的话直接删除,不是的话,找到左子树最大值/右子树最小值,进行替换,删除替换记录。

(2)讨论发生删除的叶子节点内记录个数:

1.>=ceil(m/2)-1,结束。

2.<ceil(m/2)-1,看兄弟节点记录的个数:<1> >ceil(m/2)-1,兄弟节点上移一个记录至父亲层,父亲记录下移至当前节点,结束。<2>=ceil(m/2)-1,父亲记录下移,与当前兄弟节点合并成一个新节点,讨论父亲层记录个数同(2)。

这里删除个34是情况(1)叶子节点

这里删个17,是情况(1)非叶子节点,找到他左子树最大值替换

发现删除节点个数不满足ceil(m/2)-1,发现兄弟是第二种情况,父亲记录下移,和当前兄弟节点合并成一个新的节点。

这里删除25,替换后,兄弟节点是第一种情况,兄弟节点上移一个记录至父亲层,父亲记录下移至当前节点,结束。

这里删43,别忘了讨论父亲层。

B+树

(1)叶子节点(记录),索引/内部节点。

(2)M阶B+树就是M叉。

(3)根节点既可以是索引节点,也可以是叶子节点。

(4)索引或记录个数<=m-1

(5)根节点内索引或记录个数>=1。

(6)其他节点内索引或记录个数>=ceil(m/2)-1。

(7)每个节点内记录或索引从小到大,从左到右有序。

(8)当前记录或索引的左子树值均小于它,右子树值均大于它。

(9)相邻叶子节点之间有指针从左到右指向。

插入:

(1)记录添加至叶子节点。

(2)讨论叶子节点记录个数:

          1.<=m-1结束。

          2.>m-1裂变,前m/2个成为左子树,剩余的记录成为右子树,指针从左侧叶子节点指向右侧叶子节点,第m/2+1个记录的索引复制一份至父亲层。

(3)讨论父亲层索引个数:

          1.<=m-1,结束。

           2.>m-1,裂变,中间索引上移至父亲层,左半部分成为其左子树,右半部分成为其右子树,讨论父亲层索引个数同(3)。

例:五阶

添加了13,<=m-1结束。

添加50,裂变了。

再添加一些数

然后我们添加46,父层是第二种情况。

删除:

(1)在叶子节点中删除对应记录。

(2)看叶子节点内记录个数。

         1.>=ceil(m/2)-1结束。

         2.<ceil(m/2)-1,看兄弟节点记录个数。

             <1>  >ceil(m/2)-1,兄弟记录移动一个至当前节点,更新父亲索引,结束。

             <2>   =ceil(m/2)-1,删除父亲索引,当前节点与兄弟节点合并成一个新节点。

    (3)讨论父亲层索引个数: 

         1.>=ceil(m/2)-1结束。

         2.<ceil(m/2)-1,看兄弟节点索引个数。

             <1>  >ceil(m/2)-1,兄弟节点上移一个索引至父亲层,父亲索引下移至当前节点,结束。

             <2>   =ceil(m/2)-1,父亲索引下移,与当前节点和兄弟节点合并成一个新节点,讨论父亲层索引个数,同(3)。

例: 

删除1,兄弟记录移动一个至当前节点,更新父亲索引为6。

删除45,兄弟节点索引个数不够,父亲下移,与当前节点和兄弟节点合并成一个新节点。

B树和B+树之间除了刚刚写的增删,还有结构上,B树每个节点都有记录,B+有叶子节点和索引,指针(叶子),查:B树1~log_{m}^{n},B+树log_{m}^{n},B+树更适合范围搜索。

字典树:Trie Tree

用于多个串搜索某个串。

字典树要完成对其计数查找排序。

创建字典树:

(1)不能为空树。

(2)每个节点内不包含字符,结构体:指针数组,标记:兼具计数功能。

       1.root初始化。

       2.单词添加:<1>遍历单词:字符对应分组,若不存在则创建节点,处理下一个字符,若存在,就处理下一个字符。<2>末尾标记。

查找:遍历单词,字符对应分组是否存在,不在则失败,末尾标记检测一下。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct node
{int Count;struct node* p[26];char* str;
}TrieTree;
TrieTree* chuang()
{TrieTree* ptemp = (TrieTree*)malloc(sizeof(TrieTree));memset(ptemp, 0, sizeof(TrieTree));return ptemp;
}
void Per(TrieTree* pTree)
{if (pTree == NULL)return;if (pTree->Count != 0)cout << pTree->str << endl;for (int i = 0; i < 26; i++){Per(pTree->p[i]);}
}
void Add(TrieTree* pTree, char* ss)
{for (int i = 0; i < strlen(ss);i++){//创建节点if (pTree->p[ss[i] - 97] == NULL){pTree->p[ss[i] - 97] = chuang();}//下一个pTree = pTree->p[ss[i] - 97];}pTree->Count++;pTree->str = ss;
}
TrieTree* Create(char* s[], int len)
{if (s == NULL || len <= 0)return NULL;//root初始化TrieTree* pRoot = chuang();//单词添加for (int i = 0; i < len; i++){Add(pRoot, s[i]);}return pRoot;
}
//查找
void Serach(TrieTree* pTree,char* ss)
{if (pTree == NULL || ss == NULL)return;for (int i = 0; i < strlen(ss); i++){if (pTree->p[ss[i] - 97]==NULL) {cout << "fail 1" << endl;return;}pTree = pTree->p[ss[i] - 97];}if (pTree->Count != 0)cout << "scuess" << pTree->str << endl;else {cout << "fail 2" << endl; return;}
}
int main()
{char *s[] = {"oh","my","god"};TrieTree* pTree=Create(s, 3);Per(pTree);Serach(pTree, "god");return 0;
}

 哈夫曼树

度为0或2,带权路径长度WL:权值*边数,总带权路径长度最小是最优二叉树也就是哈夫曼树。

哈夫曼编码:实现无损压缩和恢复。

例如:A:10 B:15 C:40 D:30 E:5   

(1)先排序:E:5 A:10 B:15 D:30 C:40

(2)找出两个最小值

(3)放回

(按同一规则放)

按左是0,右是1,A为1101,我们这棵树里每个都是叶子节点,所以这个树里哈夫曼编码都是无前缀码。

博弈树

1.全信息2.非偶然3.零和(无双赢)

极大极小搜索树,\alpha -\beta减枝。

感兴趣可以去了解一下。

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

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

相关文章

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

【Linux】进程---概念---进程---优先级

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.操作系统(Operator System) 1.1 概念 1.2 设计OS的目的 1.3 定位 1.4 如何理解 "管理" 1.5 总结 1.6 系统调用和…

蓝桥杯刷题总结(Python组)

1、蛇形矩阵 解题思路&#xff1a;每次赋值后都对方向进行改变&#xff0c;一般上下左右就是&#xff08;-1&#xff0c;0&#xff09;&#xff0c;&#xff08;0&#xff0c;1&#xff09;&#xff0c;&#xff08;1&#xff0c;0&#xff09;&#xff0c;&#xff08;0&…

智慧城市物联网建设:提升城市管理效率与居民生活品质

目录 一、智慧城市物联网建设的意义 1、提升城市管理效率 2、改善居民生活品质 3、促进城市可持续发展 二、智慧城市物联网建设面临的挑战 1、技术标准与互操作性问题 2、数据安全与隐私保护问题 3、投资与回报平衡问题 三、智慧城市物联网建设的实施策略 1、制定统一…

Linux下安装多个nodejs并映射Jenkins

背景 需要Jenkins中切换多个Node&#xff0c;比如nodejs16和nodesjs18,所以在宿主机按照好这两个版本&#xff0c;然后再映射到Jenkins容器中 步骤 1.下载地址 https://nodejs.org/dist/ 放到 cd /opt/soft/2.解压 tar -xzvf node-v16.20.0-linux-x64.tar.gz tar -xzvf n…

STM32F4+薄膜压力传感器(FSR)AO模拟输出程序ADC模数转换器详解

前言&#xff1a;博主在使用STM32F4加薄膜压力传感器用来测量压力时&#xff0c;发现给的例程只有STM32F1系列的&#xff0c;而STM32F4系列库函数程序不太一致&#xff0c;博主实战解决了该问题&#xff0c;用STM32F4标准库开发。有关ADC模数转换器的详细知识点详情点击我的博文…

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是 OpenAI 开发的人工智能(AI)聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

基于java+springboot+vue实现的旅游信息管理系统(文末源码+Lw+ppt)23-464

摘 要 本系统为用户而设计制作旅游信息管理系统&#xff0c;旨在实现旅游信息智能化、现代化管理。本旅游信息管理自动化系统的开发和研制的最终目的是将旅游信息的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件…

【C语言】空心正方形图案

思路&#xff1a; 1&#xff0c;两行两列打印* &#xff1a;第一行和最后一行&#xff0c;第一列和最后一列。 2&#xff0c;其他地方打印空格。 代码如下&#xff1a; #include<stdio.h> int main() { int n 0; int i 0; int j 0; while (scanf("…

centos创建并运行一个redis容器 并支持数据持久化

步骤 : 创建redis容器命令 docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes 进入容器 : docker exec -it mr bash 链接redis : redis-cli 查看数据 : keys * 存入一个数据 : set num 666 获取数据 : get num 退出客户端 : exit 再退…

GaussDB分区表自动新增分区

前言 GaussDB是华为自主研发的企业级分布式关系型数据库&#xff0c;支持集中式和分布式两种部署方式。为企业提供了高可用&#xff0c;高可靠&#xff0c;高安全等能力&#xff0c;其产品全栈自研&#xff0c;并且具有完善生态工具和开源社区。在实际去O的项目过程&#xff0…

自己录的视频怎么配上字幕?推荐几种方法

自己录的视频怎么配上字幕&#xff1f;在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐消遣的重要形式。而对于许多内容创作者来说&#xff0c;为自己的视频添加字幕不仅能提升观众的观看体验&#xff0c;还能增加视频的专业度和吸引力。那么&#xff0c;如何为自己的…

MM1: Methods, Analysis Insights from Multimodal LLM Pre-training

MM1: Methods, Analysis & Insights from Multimodal LLM Pre-training 相关链接&#xff1a;arxiv 关键字&#xff1a;多模态学习、大型语言模型、预训练、视觉语言连接、混合专家模型 摘要 本文讨论了构建高性能的多模态大型语言模型&#xff08;MLLMs&#xff09;。特别…

【鸿蒙HarmonyOS开发笔记】动画过渡效果之布局更新动画

概述 动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#x…

云原生(四)、Docker-Compose

Docker-Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个简单的 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;从而使得在不同环境中轻松部署应用程序变得更加简单和可靠。 Docker Compose 主要由以下几个核心组件组成&#xf…

HTML静态网页成品作业(HTML+CSS)——世博园介绍(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

BUUCTF-Ezsql1

1.打开靶机 打开第一个链接 2.万能密码 使用万能密码&#xff1a;a or 1 # 密码为随意 第二个用kali打开 3.ssh连接靶机 ssh ctf284490d0-7600-4c65-9160-5ced02f45633.node5.buuoj.cn -p 28191 由题可知密码为123456 4.找到并修改index.php文件 找到index.php文件 #内容如…

Springboot整合支付宝沙箱支付

2.配置说明 要记住这几个重要的配置 appId 这个是appIdprivateKey 商户私钥publicKey 支付宝公钥, 即对应APPID下的支付宝公钥notifyUrl 支付成功后异步回调地址(注意是必须是公网地址)returnUrl #支付后回调地址signType 签名类型 一般写 RSA2charset utf-8format json #网关…

数据结构奇妙旅程之红黑树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …