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

news2024/9/21 4:36:52

目录

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.coloradmin.cn/o/1527835.html

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

相关文章

JavaScript之继承

继承 父类与子类 子类是父类的一个子集 比如&#xff1a;人类和医生类&#xff0c;医生类是人类的子集&#xff1b;人类是父类&#xff0c;医生类是子集 父类与子类在特性&#xff08;属性和方法&#xff09;上有什么关系 方法&#xff1a;子类对象可以调用父类原型上的方…

Nadaraya-Watson核回归

目录 基本原理 ​编辑 核函数的选择 带宽的选择 特点 应用 与注意力机制的关系 参考内容 在统计学中&#xff0c;核回归是一种估计随机变量的条件期望的非参数技术。目标是找到一对随机变量 X 和 Y 之间的非线性关系。 在任何非参数回归中&#xff0c;变量 Y 相对于变量…

Jenkins 一个进程存在多个实例问题排查

Jenkins 一个进程存在多个实例问题排查 最近Jenkins升级到2.440.1​版本后&#xff0c;使用tomcat​服务部署&#xff0c;发现每次定时任务总会有3-4个请求到我的机器人上&#xff0c;导致出现奇奇怪怪的问题。 问题发现 机器人运行异常&#xff0c;总有好几个同时请求的服务。…

Selenium 自动化 —— 使用WebDriverManager自动下载驱动

上一篇文章 入门和 Hello World 实例 中&#xff0c;我们提供了一个最简单的 Selenium 上手的例子。 但是某一天&#xff0c;突然发现相同的代码居然运行报错了。这是怎么回事呢&#xff1f; 日志排查 日志中其实提示的很明显了&#xff1a;Chrome浏览器和Chrome WebDriver的…

python中如何解析Html

在最近需要的需求中&#xff0c;需要 python 获取网页内容&#xff0c;并从html中获取到想要的内容。这里记录一下两个比较常用的python库对html的解析。 1. BeautifulSoup 它是一个非常流行的python脚本库&#xff0c;用于解析HTML和XML文档。如果你对 java 很熟悉&#xff…

软件测试教程 自动化测试之Junit框架

文章目录 1. 什么是 Junit &#xff1f;2. 常见的注解2.1 Test2.2 BeforeAll&#xff0c;AfterAll2.3 BeforeEach&#xff0c;AfterEach 3. 测试用例顺序指定4. 参数化4.1 单个参数4.2 多个参数4.3 通过方法生成 5. 测试套件6. 断言6.1 断言相等6.2 断言不相等6.3 断言为空6.4 …

医疗器械经营许可证办理流程及申请流程有哪些?

1、证书内容差异&#xff1a; 1.医疗器械经营许可证应当载明许可证号码、法定代表人、负责人、住所、经营范围、仓库地址、发证部门、日期及有效期、公司名称等事项。 2.医疗器械生产经营管理注册证书应当载明编号、公司产品名称、法定代表人、住所、经营活动场所、业务发展方…

小程序云开发(十六):JavaScript基础

&#x1f517; 运行环境&#xff1a;小程序云开发 &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497…

计算机网络:TCP篇

计网tcp部分面试总结 tcp报文格式&#xff1a; 序列号&#xff1a;通过SYN传给接收端&#xff0c;当SYN为1&#xff0c;表示请求建立连接&#xff0c;且设置序列号初值&#xff0c;后面没法送一次数据&#xff0c;就累加数据大小&#xff0c;保证包有序。 确认应答号&#x…

基于C/C++的easyx图形库教程

文章目录: 一&#xff1a;前言 二&#xff1a;窗口&#xff08;宽高 背景颜色 窗口标题 弹出对话框&#xff09; 三&#xff1a;图形绘制&#xff08;点 线 矩形 圆 椭圆&#xff09; 四&#xff1a;文字&#xff08;颜色 大小 背景 位置 打印 文字居中&#xff09; 五&a…

动态规划(算法竞赛、蓝桥杯)--单调队列优化绿色通道

1、B站视频链接&#xff1a;E45 单调队列优化DP 绿色通道_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N5e410; int n,tim,w[N],f[N],q[N];bool check(int m){int h1,t0;for(int i1; i<n; i){while(h<t && f[q[t]]>f[i-…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Line)

直线绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Line(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0c;该接…

巧用眼精星一键批量识别营业执照为结构化Excel

在现代社会&#xff0c;数字化办公已成为企业管理的重要方式之一。而在处理营业执照等票证文件时&#xff0c;如何高效准确地进行识别和管理也显得尤为重要。眼精星票据识别系统作为一款优秀的OCR识别软件&#xff0c;为用户提供了便捷快速的解决方案。接下来&#xff0c;我们将…

Java安全基础 关键概念过关

Java安全基础 关键概念汇总 文章目录 Java安全基础 关键概念汇总前置知识1.构造器this以及包的使用2.继承3.重写/ 重载 / super4.多态5.区分和equals方法6.toString的使用7.Object的概念8.static,final,代码块static代码块final 9.动态代理10.类的动态加载1)类加载器含义&#…

SpringBoot2.7集成Swagger3

Swagger2已经在17年停止维护了&#xff0c;取而代之的是 Swagger3&#xff08;基于openApi3&#xff09;&#xff0c;所以新项目要尽量使用Swagger3. Open API OpenApi是业界真正的 api 文档标准&#xff0c;其是由 Swagger 来维护的&#xff0c;并被linux列为api标准&#x…

组建公司办公网络

一 认识网络传输介质的分类 网络传输介质主要分为有线传输介质和无线传输介质两大类&#xff0c;它们在网络建设和数据传输中扮演着至关重要的角色。下面是这两类传输介质的详细分类&#xff1a; 有线传输介质 双绞线&#xff08;Twisted Pair&#xff09;&#xff1a;这是最…

作业:基于udp的tftp文件传输实例

#include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h>#define PORT 69 //服务器绑定的端口号 #define IP "192.168.1.107" //服务器的IP地址int do_download(i…

从WAF到WAAP的研究

对于需要保护Web应用程序和API的企业来说&#xff0c;从WAF到WAAP的转变已成为一种必然趋势。采用WAAP平台可以更为全面和高效地保护Web应用程序和API的安全&#xff0c;同时避免了高昂的维护成本和攻击绕过WAF的风险。 网络安全领域的发展趋势是从WAF到WAAP的转变。WAF作为传…

关系数据库标准语言SQL

1.SQL概述 1.1基本表&#xff08;Base table&#xff09; 实际存储在数据库中的表SQL中一个关系就对应一个基本表基本表可以有若干个索引基本表的集合组成关系模式&#xff0c;即全局概念模式&#xff08;数据的整体逻辑结构&#xff09; 1.2 存储文件 存储文件和相关索引组…

android 顺滑滑动嵌套布局

1. 背景 最近项目中用到了上面的布局&#xff0c;于是使用了scrollviewrecycleview&#xff0c;为了自适应高度&#xff0c;重写了recycleview&#xff0c;实现了高度自适应&#xff1a; public class CustomRecyclerView extends RecyclerView {public CustomRecyclerView(Non…