首页 > 其他分享 >B树B+树,字典树详解,哈夫曼树博弈树

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

时间:2024-03-21 16:03:26浏览次数:21  
标签:哈夫曼 记录 pTree 个数 ceil 索引 详解 节点 字典

目录

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

感兴趣可以去了解一下。

标签:哈夫曼,记录,pTree,个数,ceil,索引,详解,节点,字典
From: https://blog.csdn.net/qq_60924211/article/details/136780645

相关文章

  • Impostors详解——纸片构筑的美丽幻觉
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!写在前面早前,我截帧分析了《CallofDragons》,具体内容可以看《〈CallofDragons〉渲染截帧分析与迷思》,在其中提到了《CallofDragons》中使用......
  • Linux系统下的文件描述符fd详解
    文章目录文件描述符本作者从代码及源码的角度来总结探究文件描述符fd参考:韦东山Linux嵌入式视频文件描述符Linux系统下一切皆文件。文件描述符是操作系统中用来唯一标识一个已打开文件的整数。本质上来说就是索引,即根据索引值寻找到对应的文件,可对其进行相应......
  • Java基础内容:第七章面向对象(下)编程题详解
            建了一个群:908722740 ,欢迎小伙伴门的加入,平时可以互相学习交流,不管是学习还是工作上的都可以多多交流,本人在校学生,技术有限,错误的地方欢迎指正。目录一、多态案例素材【1】乐手弹奏乐器【2】比萨制作【3】购买饮料二、接口案例素材【1】兔子和青蛙【......
  • RCC时钟代码详解<一步一注释>
    voidSystemClock_Config(void){RCC_OscInitTypeDefRCC_OscInitStruct={0};RCC_ClkInitTypeDefRCC_ClkInitStruct={0};/**Configurethemaininternalregulatoroutputvoltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PW......
  • 开源计算机视觉库OpenCV详解
    开源计算机视觉库OpenCV是一个功能强大的工具,用于实现各种计算机视觉应用。以下是对OpenCV的详细解释和使用示例:一、功能概述OpenCV涵盖了广泛的计算机视觉领域,包括但不限于以下功能:图像处理:包括图像加载、保存、调整大小、旋转、裁剪、滤波、边缘检测等。OpenCV提供了丰富......
  • 集合系列(十) -Set接口详解
    一、摘要关于Set接口,在实际开发中,其实很少用到,但是如果你出去面试,它可能依然是一个绕不开的话题。言归正传,废话咱们也不多说了,相信使用过Set集合类的朋友都知道,Set集合的特点主要有:元素不重复、存储无序的特点。啥意思呢?你可以理解为,向一个瓶子里面扔东西,这些东西......
  • 集合系列(五) -TreeMap详解
    一、摘要在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。本文主要从数据结构和算法层面,探讨TreeMap的实现。二、简介JavaTreeMap实现了SortedMap接口,也就是说会按照key的大......
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二
     目录 ​编辑1.二叉树的顺序结构及实现1.1二叉树的顺序结构2堆的概念及结构3堆的实现3.1堆的代码定义3.2堆插入数据3.3打印堆数据3.4堆的数据的删除3.5获取根部数据3.6判断堆是否为空3.7堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序4.2升......
  • ThreadLocal详解及用法示例
    ThreadLocal概念ThreadLocal 是Java并发包(java.util.concurrent)中提供的一个类,它的主要作用是在多线程环境下为每个线程提供一个独立的变量副本,使得每个线程在访问 ThreadLocal 时获取到的都是自己的私有变量,而不是共享的同一个变量。换句话说,ThreadLocal 能够隔离线程间......
  • C++ 模板入门详解
    目录0.模板引入1.函数模板 1.函数重载的缺点 2.函数模板的概念和格式2. 函数模板的实例化 2.1 隐式实例化:让编译器根据实参推演模板参数的实际类型 2.2 显式实例化:在函数名后的<>中指定模板参数的实际类型2.3函数模板参数的匹配规则 3.类模板 3.1类......