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.rhkb.cn/news/278949.html

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

相关文章

洗涤杂质气体的仪器-PFA洗涤瓶

PFA洗气瓶是一种洗去气体中杂质的仪器&#xff0c;是将不纯气体通过选定的适宜液体介质鼓泡吸收&#xff08;溶解或由于发生化学反应&#xff09;&#xff0c;从而洗去杂质气体&#xff0c;以达净化气体的目的。在有可燃性气源的实验装置中&#xff0c;洗气瓶也可起到安全瓶的作…

qt使用Windows经典风格,以使QTreeView或QTreeWidge有节点线或加号

没有使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 树展开时&#xff1a; 树未展开时&#xff1a; 可以看到&#xff1a; 未使用Windows经典风格时&#xff0c;QTreeView或QTreeWidget…

【Flask开发实战】防火墙配置文件解析(二)之shell读取内容

一、前言 上一篇文章中&#xff0c;介绍了防火墙配置文件包含的基本元素和格式样式&#xff0c;并模拟了几组有代表性的规则内容&#xff0c;作为基础测试数据。在拿到基础测试数据后&#xff0c;关于我们最终想解析成的数据是什么样式的&#xff0c;其实不难看出&#xff0c;…

聚合音乐网-播放器网站源码

源码简介 MKOnlineMusicPlayer 是一款全屏的音乐播放器 UI 框架&#xff08;为避免侵权&#xff0c;已移除所有后端功能&#xff09;。 前端界面参照 QQ 音乐网页版进行布局&#xff0c;同时采用了流行的响应式设计&#xff0c;无论是在PC端还是在手机端&#xff0c;均能给您…

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

Ubuntu Desktop 设置 gedit

Ubuntu Desktop 设置 gedit 1. View2. Editor3. Font & Colors4. keyboard shortcut5. Find and ReplaceReferences gedit (/ˈdʒɛdɪt/ or /ˈɡɛdɪt/) is the default text editor of the GNOME desktop environment and part of the GNOME Core Applications. Desig…

相比于 HTTP 协议,WebSocket协议的必要性体现在哪里?

HTTP 协议的一个缺点 从 HTTP 协议的角度来看&#xff0c;就是点一下网页上的某个按钮&#xff0c;前端发一次 HTTP请 求&#xff0c;网站返回一次 HTTP 响应。这种由客户端主动请求&#xff0c;服务器响应的方式也满足大部分网页的功能场景。但是有没有发现&#xff0c;在HTTP…

InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台

InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台 我们的压测平台的架构图如下&#xff1a; 配置docker环境 1&#xff09;yum 包更新到最新 sudo yum update如果有提示&#xff0c;直接输入y&#xff0c;回车。 2&#xff09;安装需要的软件包&#xff0c; yum-…

八大排序算法

排序算法 排序的概述排序的分类分为5大类&#xff1a;优点及缺点如何选择排序算法 八种排序之间的关系:一、插入排序直接插入排序动图详解代码实现 希尔排序动图详解代码实现 二、交换排序冒泡排序:动图详解代码实现 快速排序:动图详解代码实现 三、选择排序直接选择排序动图详…

杉德支付配合调查 - 数字藏品服务

最近&#xff0c;数字收藏品平台淘派发布了一则公告&#xff0c;宣布支付通道杉德已暂停接口服务&#xff0c;以配合调查。 近期发现多个异常账户&#xff0c;涉嫌盗取他人信息和银行卡&#xff0c;利用平台从事非法交易。淘派已第一时间报警&#xff0c;协助警方追回资金(回执…

java数据结构与算法刷题-----LeetCode1005. K 次取反后最大化的数组和(这就不是简单题)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 卷来卷去&#xff0c;把简单题都卷成中等题了 文章目录 1. 排序后从小到大…

算法刷题Day14 | 二叉树理论、递归遍历、迭代遍历、统一迭代

目录 0 引言1 递归遍历1.1 前序遍历1.2 后序遍历1.3 中序遍历 2 迭代遍历2.1 前序和后序2.2 中序 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;算法刷题Day14 | 二叉树理论、递归遍历、迭代遍历、统一迭…

【教程】APP加固的那些小事情

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

html--蝴蝶

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>蝴蝶飞舞</title> <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.cs…

关于Transfomer的思考

为何诞生 在说transformer是什么&#xff0c;有什么优势之类的之前&#xff0c;先谈一谈它因何而诞生。transformer诞生最重要的原因是早先的语言模型&#xff0c;比如RNN&#xff0c;由于其本身的训练机制导致其并行度不高&#xff0c;特别是遇到一些长句子的情况下。其次&…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

学习Python,需要知道的经典案例

文章目录 一、Python简介二、Python经典案例1. 猜数字游戏2. 文本文件处理3. 网络爬虫4. 数据可视化5. 电子邮件发送6. 实现一个简单的Web服务器。 三、Python处理IP相关知识点1. 处理IP地址2. 网络编程&#xff08;TCP/IP&#xff09;3. 使用第三方库处理IP信息 四、相关链接 …

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…

搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 1、创建项目后端 BigData-KongGuan …

Transformer的前世今生 day01(预训练、统计语言模型)

预训练 在相似任务中&#xff0c;由于神经网络模型的浅层是通用的&#xff0c;如下图&#xff1a; 所以当我们的数据集不够大&#xff0c;不能产生性能良好的模型时&#xff0c;可以尝试让模型B在用模型A的浅层基础上&#xff0c;深层的部分自己生成参数&#xff0c;减小数据集…