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减枝。

感兴趣可以去了解一下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】Leetcode 35. 搜索插入位置

文章目录 题目思路代码呈现 题目 链接: link 思路 这题较简单&#xff0c;就是找到目标元素的下标&#xff0c;或者插入位置&#xff0c;如果不熟练的话&#xff0c;一开始想到的肯定是冒泡排序&#xff0c;就是一个一个查下去&#xff0c;然后返回下表&#xff0c;这种冒泡排…

简单的溯源取证

环境准备: Linux虚拟机:内网部署蜜罐探测系统 。(192.168.XX.XX) windows虚拟机:有FTP弱口令漏洞的web服务 (受害机器) (192.168.125.134) kali Linux虚拟机:攻击机服务端 。 (192.168.125.130) MAC:管理员电脑。(192.168.XX.XX) 一、利用kailiLinuxmsf生成windows木马文件…

【Leetcode-19.删除链表的第N个节点】

题目详情&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1…

【linux】进程间通信1--管道

文章目录 进程间通信是什么&#xff1f;如何做&#xff1f; 管道匿名管道命名管道 进程间通信 是什么&#xff1f; 进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是指在操作系统中&#xff0c;不同的进程之间进行数据交换、信息传递和同步操…

双向队列广搜

适用情况 适用的情况&#xff1a;解决最短路径问题 当我们已起始点和终点时&#xff0c;我们可以采用双向队列广搜去解决问题。所谓的双向队列广搜&#xff0c;就是让起点向终点搜索&#xff0c;终点向起点搜索&#xff0c;二者同时开始&#xff0c;那么当它们第一次1相遇时&am…

Visual Studio 2022下配置 OpenMP 多线程编程环境与运行

目录 一创建项目时选择“创建新项目 -> 空项目 -> 下一步 -> 创建” 二右键“源文件 -> 添加 -> 新建项 -> 添加” 三配置 1. 测试程序&#xff1a; 最开始的时候错误很多&#xff1a; 2.将 “ include "stdafx.h" ” 删掉&#xff0c;添加 “…

如何使用 ArcGIS Pro 生成TIN

三角网是一种常用于表示地表地形的数字地球模型&#xff08;DEM&#xff09;方式&#xff0c;我们可以通过 ArcGIS Pro 将等高线和高程点转换为TIN&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的高…

鼎阳SDS6204示波器EPICS IOC的搭建

三年前曾写过这个文&#xff1a; 鼎阳SDS6204示波器的EPICS IOC调试 文章里有EPICS网站设备IOC搭建的指南&#xff0c;具体搭建IOC的步骤就没详细写了&#xff0c;几年后重新搭建时发现还是费了些力气才搭建起来&#xff0c;因此写此文记录下手把手的过程方便自己以及EPICS的初…

用C语言打造自己的Unix风格ls命令

在Unix或类Unix操作系统中&#xff0c;ls是一个非常基础且实用的命令&#xff0c;它用于列出当前目录或指定目录下的文件和子目录。下面&#xff0c;我们将通过C语言编写一个简化的ls命令&#xff0c;展示如何利用dirent.h头文件提供的函数接口实现这一功能。 c #include &quo…

LiveGBS流媒体平台GB/T28181功能-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播

LiveGBS支持-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播 1、轮播功能2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、轮播功能 视频监控项目使用过程中&#xff0c;有时需要大屏…

git tag标签使用

创建标签 git checkout test git tag -a v1.0.0 -m v1.0.0里程碑版本 git push origin v1.0.0 删除标签 git tag -d v1.0.0 git push origin :refs/tags/v1.0.0远程分支可以直接在页面删除

粉丝技术答疑:怎么不重置手机,解锁华为手机密码?

今天有个粉丝朋友在大白直播的时候&#xff0c;跟大白讲述了自己的华为手机忘了开机密码&#xff0c;希望大白给他一些技术指导&#xff0c;鉴于直播间没办法解释清楚&#xff0c;所以大白下播之后&#xff0c;也特意根据他的华为手机&#xff0c;做了本次技术分享。如果屏幕前…

登录-前端部分

登录表单和注册表单在同一个页面中&#xff0c;通过注册按钮以及返回按钮来控制要显示哪个表单 一、数据绑定和校验 &#xff08;1&#xff09;绑定数据&#xff0c;复用注册表单的数据模型&#xff1a; //控制注册与登录表单的显示&#xff0c; 默认false显示登录 true时显…

【附下载】3Ds Max从安装、配置到入门提高和高级用法

#3Ds Max 一、安装 1.1 安装说明 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1lwKMbgbE32wCL6PpMv706A?pwddll8 提取码&#xff1a;dll8 –来自百度网盘超级会员V2的分享 安装说明&#xff1a;文件夹里有安装说明 安装解压即可 关键就是将crack文件放到自己…

iview 不请求接口修改table本地数据 不刷新的本质问题以及最简单的解决方法

在日常的开发中&#xff0c;相信大家都遇到过这样的问题&#xff0c;通过请求接口&#xff0c;而后赋值table数据&#xff0c;页面都是正常的刷新渲染的&#xff0c;但是有时&#xff0c;不需要请求接口&#xff0c;只修改本地的固定数据的话&#xff0c;页面的table表格数据却…

【网络安全】 MSF提权

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统位数IP攻击机Kali Linux6410.3.0.231客户端Windows 76410.3.0.234…

SAP前台处理:物料主数据创建<MM01>之基础视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

科技云报道:第五次工业革命,中国AI企业如何打造新质生产力?

科技云报道原创。 人类历史的叙述与技术进步的影响深深交织在一起。 迄今为止&#xff0c;每一次工业革命都彻底改变了我们社会的轮廓&#xff0c;引入了机械化、大规模生产和数字化&#xff0c;并重新定义了人类生存的规范。 自2022年11月30日OpenAI发布ChatGPT以来&#x…

总结mac下解决matplotlib中文显示问题的几种方法

一、前言&#xff1a; 使⽤matplotlib画图时&#xff0c;由于matplotlib默认没有中⽂&#xff0c;显⽰中文时会出现空⽩⼩⽅块。 二、方法&#xff1a; 2.1 matplotlib中使用SimHei字体 1&#xff09;进入终端后查看matplotlib的字体路径&#xff1a; $ python >>&g…