最优二叉搜索树 C#实现

最优二叉搜索树 C#实现

介绍一下

上一篇博文搞半天挺烧脑,没搞清楚继续… 主要是练习动态规划算法。最关键的一个是这个最优二叉搜索树能干啥。我认为如果数据稳定,统计出概率来,用最优二叉树保存,以后搜索应该是效率比较高的。还有一个是通过一通研究这个算法,折磨半天自己,加深理解,动态规划是真的难。
dp表项 一个是概率之和的理解,一个是dp状态转义表的理解。

概率之和递推公式

if (j < i)//看条件判定 没有任何数值的树概率就是间隙的概率
dp[i, j].weight = probs[2 * j];
else//递推 数值之前的概率 + 数值概率 + 数值和之后的间隙概率
dp[i, j].weight = dp[i, j - 1].weight + probs[2 * j - 1] + probs[2 * j];

状态转移递推公式

//赋值一个比较大的数字,可以知道,搜索长度最大不会超过数组长度
dp[h, l].path = datas.Count;
for (int k = h; k <= l; k++)
{
//通过getpath函数兼容索引后面小于前面的情况,节省空间。
float path = GetPath(h, k - 1, dp) + GetPath(k + 1, l, dp) + dp[h, l].weight;
if (dp[h, l].path > path)
{
//冒泡比较 记录最小搜索路长和树的根,以便于创建树
dp[h, l].path = path;
dp[h, l].root = k;
}
}

根据转移表递归创建搜索树

主要是CreateBSTNode函数
开始大于结束直接返回空,没有树结点
开始等于结束返回单一结点
开始小于结束,进入递归

程序数据和结果

List<int> lst = new List<int> { 10, 20, 30, 40, 50, 60 };
//间隙 数值 间隙 数值 ... 间隙
List<float> fls = new List<float> { 0.05f, 0.05f, 0.1f, 0.1f, 0.05f, 0.05f, 0.05f, 0.1f, 0.05f, 0.2f, 0.1f,0.01f,0.09f };
//创建最优二叉搜索树,准备绘制
bTree = BSTree.CreateOPSTree(lst, fls);

在这里插入图片描述

程序核心代码

dp表项

    public struct Item{//概率之和[权重]public float weight;//最短平均路长[状态转移表]public float path;//根节点public int root;}

构建搜索树代码

private static float GetPath(int h, int l, Item[,] items)
{if (h > l){return 0.0f;}else{return items[h, l].path;}
}/// <summary>
/// 根据dp转移表构建树
/// </summary>
/// <param name="h">开始</param>
/// <param name="l">结束</param>
/// <param name="dps">转移表</param>
/// <param name="datas">树结点数据</param>
/// <returns></returns>
private static BSTree CreateBSTNode(int h, int l, Item[,] dps, List<int> datas)
{//开始大于结束if (h > l){return null;}//开始等于结束if (h == l){return new BSTree(datas[dps[h,l].root - 1]);}else//开始小于结束 进入递归{BSTree bSTree = new BSTree(datas[dps[h, l].root - 1]);bSTree.lChild = CreateBSTNode(h, dps[h,l].root-1,dps, datas);bSTree.rChild = CreateBSTNode(dps[h, l].root + 1, l, dps, datas);return bSTree;}
}public static BSTree CreateOPSTree(List<int> datas, List<float> probs)
{Item[,] dp = new Item[datas.Count + 1, datas.Count + 1];//赋值概率for (int i = 1; i <= datas.Count; i++){for (int j = i - 1; j <= datas.Count; j++){if (j < i)dp[i, j].weight = probs[2 * j];elsedp[i, j].weight = dp[i, j - 1].weight + probs[2 * j - 1] + probs[2 * j];}}//赋值dp转移表for (int len = 1; len <= datas.Count; len++){for (int h = 1, l= len; h <= datas.Count && l<= datas.Count; h++, l++){dp[h, l].path = datas.Count;for (int k = h; k <= l; k++){float path = GetPath(h, k - 1, dp) + GetPath(k + 1, l, dp) + dp[h, l].weight;if (dp[h, l].path > path){dp[h, l].path = path;dp[h, l].root = k;}}}}return CreateBSTNode(1, datas.Count, dp,datas);
}

参考

B站张老师视频
虽然写完了,如果不参考代码,其实只有思路,还是撸不出来的…

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

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

相关文章

openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优

文章目录 openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优224.1 全局并发队列224.2 局部并发队列 openGauss学习笔记-224 openGauss性能调优-系统调优-数据库系统参数调优-数据库并发队列参数调优 数据库提供两种手段进行并发队…

[office] excel中数据汇总的大全教程文字版 #知识分享#经验分享#知识分享

excel中数据汇总的大全教程文字版 我们在excel中对数据清单上的数据进行分析的一种方法是分类汇总。在“数据”菜单上选择“分类汇总”命令&#xff0c;我们可以在数据清单中插入分类汇总行&#xff0c;然后按照选择的方式对数据进行汇总。同时&#xff0c;在插入分类汇总时&am…

教师工龄工资每一年加多少上限多少年

每当提及教师的工资&#xff0c;人们总会关心工龄工资这一部分。毕竟&#xff0c;教师作为人类灵魂的工程师&#xff0c;他们的辛勤付出和岁月沉淀都应当得到应有的回报。那么&#xff0c;教师的工龄工资每一年会增加多少&#xff1f;又是否存在一个上限呢&#xff1f; 我们先…

STL源码剖析:Allocator

STL源码剖析&#xff1a;Allocator STL源码剖析&#xff1a;AllocatorSGI标准的空间适配器SGI特殊的空间适配器构造和析构的基本工具&#xff1a;construct()和destroy()一级配置器和二级配置器空间配置函数allocate()空间释放函数deallocate() SGI标准的空间适配器 SGI标准的…

按身高和体重排队,运动会(C 语言)

题目 某学校举行运动会,学生们按编号(1、2、3.....n)进行标识, 现需要按照身高由低到高排列&#xff0c; 对身高相同的人&#xff0c;按体重由轻到重排列&#xff0c; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。 请输出排列后的学生编号 输入 两个序列&am…

第五篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:详细解读pyttsx3的`preprocess_text`函数文本预处理。

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、pyttsx3的preprocess_text函数文本预处理基本用法示例代码二、实现更复杂的文本预处理逻辑示例代码三、去除停用词、词干提取示例代码四、词形还原、拼写纠正示例代码五、…

代码随想录算法训练营第57天 | 1143.最长公共子序列 1035.不相交的线 53.最大子序和

最长公共子序列 dp[i][j] 表示字符串1中 [0, i-1] 子串与字符串2中 [0, j-1] 子串之间的最长公共子序列长度。注意这里并不要求公共子序列一定以下标 i-1 或 j-1 结尾。因为这里的公共子序列不必须连续&#xff0c;这样定义可以使得递推方便一些。 当进行遍历递推时&#xff0c…

excel合并多列单元格并保留数据

Sub 合并多个单元格并保留数据()Dim rng As RangeDim val As StringDim cell As RangeSet rng SelectionIf rng.Cells.Count < 1 ThenExit SubEnd IfApplication.ScreenUpdating FalseApplication.DisplayAlerts FalseFor Each cell In rngIf cell.Value <> "…

U盘重装MAC OS遇到 无法识别文件系统和磁盘无法读取问题

一台windows的电脑&#xff0c;一个差不多够大的U盘我这里差不多用了13G左右。 .dmg文件好难搞&#xff0c;不是难下&#xff0c;是下载转载后无法识别&#xff0c;所以很需要 带引导的os文件. 一个windows下dmg镜像恢复工具&#xff0c;这里用的是TransMac 10.4 &#xff0c;…

深入浅出 Python 类与对象

Python 是一种面向对象的编程语言,这意味着我们可以使用类(class)和对象(object)来组织和操作数据。在本文中,我们将详细介绍 Python 中的类与对象,以及它们的相关概念和用法。 一、类与对象的基本概念 类是面向对象编程中的一个关键概念,它是具有相同属性和方法的对…

三防平板丨手持工业平板丨ONERugged工业三防平板丨推动数字化转型

随着科技的发展&#xff0c;数字化转型已经成为企业转型升级的必由之路。而在数字化转型中&#xff0c;三防平板作为一种重要的工具&#xff0c;可以极大地推动企业的数字化转型。本文将从以下几个方面探讨三防平板如何推动数字化转型。 一、提高工作效率 ONERugged加固平板的…

Web自动化测试基础篇

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一…

设计模式----单例模式

单例模式 只生成一个对象实例&#xff0c;减少了系统的开销&#xff1b;方便数据访问。 保证一个类只有一个实例&#xff0c;并且提供一个访问该实例的全局访问点。 系统中如果一个类仅有一个实例&#xff0c;可以用来存储数据。全局访问 单例实现 1、将该类的构造方法定义为…

shopify如何在元字段中使用元对象

在Shopify中&#xff0c;您可以使用元字段&#xff08;Metafields&#xff09;来存储和管理自定义的附加数据。元字段允许您在产品、变体、订单和其他实体中添加额外的信息&#xff0c;以满足特定的业务需求。而元对象&#xff08;Metaobject&#xff09;是指在元字段中存储的实…

Cell |从实验室到田间,还有多远?

期刊&#xff1a;Cell 时间&#xff1a;2023年8月 植物微生物群是指植物表面、细胞间隙、器官内寄生的细菌、真菌、病毒、古菌群落。植物与微生物群的互作在植物生理、生态和进化过程中扮演重要角色。有益微生物定殖植物&#xff0c;可以持续对植物生产力产生表型效应&…

Django学习记录03——员工部门案例

1、项目初始化 1.1 项目创建 1.2 APP的创建 1.2.1 方法一 命令配置 python manage.py startapp app011.2.2 方法二 Pycharm配置 在Django Structure 中创建APP 2.设计表结构 2.1 表结构 注意&#xff1a; 1.员工表与部门表关联时id关联 节省存储&#xff0c;但是查找耗时…

2024信息工程、软件与计算机工程国际会议(ICIESCE2024)

2024信息工程、软件与计算机工程国际会议&#xff08;ICIESCE2024) 会议简介 随着互联网的不断创新&#xff0c;信息工程、软件和计算机工程在各个领域得到了广泛应用。为了为来自世界各地的专家学者提供一个分享通信和计算机工程领域研究成果的平台&#xff0c;2024年信息工…

Linux(四)__用户和用户组管理

介绍 Linux系统是一个多用户多任务的分时操作系统。 Linux 系统支持多个用户在同一时间内登陆&#xff0c;不同用户可以执行不同的任务&#xff0c;并且互不影响。不同用户具有不问的权限&#xff0c;毎个用户在权限允许的范围内完成不间的任务&#xff0c;Linux 正是通过这种…

Leetcode刷题笔记题解(C++):203. 移除链表元素

思路&#xff1a;不同的情况出现了&#xff0c;就是第一个节点要是为等于val的节点&#xff0c;可以新建一个节点&#xff0c;并next指向head&#xff0c;这样就可以遍历新的链表来删除节点 /*** Definition for singly-linked list.* struct ListNode {* int val;* L…

MSSQL运用

做过的事情&#xff0c;隔几年又再做相同的事情&#xff0c;做一下记录。 角色与权限 创建账号与设定执行存储过程权限 Use testDB CREATE LOGIN acct WITH PASSWORDp1 CREATE USER acct FOR LOGIN acct GO GRANT EXECUTE ON SP_Test TO acct; GO 存储过程 调用写好的SQL语…