算法实践-最优搜索树-动态规划

OBST(Optimal Binary Search Tree,最优二叉搜索树) 构建最优二叉搜索树的目标是使得整棵树的搜索代价最小化,即搜索某个关键字时,需要从根节点开始向下查找,直到找到目标关键字,而这个搜索的代价取决于关键字在树中的深度。:使用动态规划的思想,定义一个二维数组 cost,其中 cost[i][j] 表示从关键字 ki 到 kj 的最小搜索代价。最优二叉搜索树算法是一个经典的动态规划问题,通过动态规划算法可以在高效的时间内计算出最优的搜索代价和树的结构。通过动态规划算法计算最优二叉搜索树的代价和结构,得到最终的最优二叉搜索树。 阅读详情

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.youkuaiyun.com/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.youkuaiyun.com/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

package com.dynamic;

import java.text.DecimalFormat;

public class OptimalSearchTree {
	private double [] p;//关键字概率
	private double [] q;//不在树中的关键字概率
	private int [] k;//关键字
	//private int [][]d;//不在树中的关键字
	private double[][]e;
	private double[][]w;
	private int[][]root;
	public OptimalSearchTree(int[]k,double [] p,double []q)throws Exception{
		if(k.length+1!=p.length){
			throw new Exception("数据错误");
		}
		if(k.length+1!=q.length){
			throw new Exception("数据错误");
		}
		double sum=0;
		for(int i=0;i<p.length;i++){
			sum+=p[i];
		}
		for(int j=0;j<q.length;j++){
			sum+=q[j];
		}
		DecimalFormat format=new DecimalFormat("0.00");
		if(Double.parseDouble(format.format(sum))!=1.0){
			throw new Exception("数据错误");
		}
		this.q=q;
		this.p=p;
		this.k=k;
		e=new double[p.length+1][p.length+1];
		w=new double[p.length+1][p.length+1];
		root=new int[p.length][p.length];
		for(int i=0;i<w.length;i++){
			for(int j=0;j<w[i].length;j++){
				w[i][j]=-1;
			}
		}
		for(int i=0;i<e.length;i++){
			for(int j=0;j<e[i].length;j++){
				e[i][j]=Integer.MAX_VALUE;
			}
		}
		
	}
	private double innerOptimal(int i,int j){
		if(e[i][j]!=Integer.MAX_VALUE){
			return e[i][j];
		}
		if(j==i-1){
			e[i][j]=q[i-1];
		}else{
			double tmp=Integer.MAX_VALUE;
			for(int r=i;r<=j;r++){
				tmp=innerOptimal(i,r-1)+innerOptimal(r+1,j)+computeW(i,j);
				if(tmp<e[i][j]){
					e[i][j]=tmp;
					root[i][j]=r;
				}
			}
		}
		return e[i][j];
	}
	private double computeW(int i,int j){
		if(w[i][j]>=0){
			return w[i][j];
		}else{
			double tmp=0;
			for(int l=i;l<=j;l++){
				tmp+=p[l];
			}
			for(int l=i-1;l<=j;l++){
				tmp+=q[l];
			}
			w[i][j]=tmp;
			return tmp;
		}
	}
	public void printTree(){
		innerPrintTree(1,k.length,-1);
	}
	private void innerPrintTree(int i,int j,int parent){
		if(i>j){
			return;
		}
		if(i==1&&j==k.length){
			System.out.println("    "+root[i][j]);
		}else{
			System.out.println(root[i][j]+","+parent);	
		}
		innerPrintTree(i,root[i][j]-1,root[i][j]);
		innerPrintTree(root[i][j]+1,j,root[i][j]);
	}
	public double optimal(){
		double ret=innerOptimal(1,k.length);
		return ret;
	}
	public static void main(String[] args) throws Exception{
		int [] k=new int[]{1,2,3,4,5};
		double [] p=new double[]{0,0.15,0.10,0.05,0.10,0.20};
		double [] q=new double[]{0.05,0.10,0.05,0.05,0.05,0.10};
		OptimalSearchTree ost=new OptimalSearchTree(k,p,q);
		System.out.println(ost.optimal());
		ost.printTree();
	}

}

 

Gemini永久会员 对四边形不等式在Java实现中的面试题及详细答案,聚焦核心原理、优化场景与代码实现 给定数组 ( arr ),求所有划分中 ( \min(\text{左部分和}, \text{右部分和}) ) 的最大值,要求 ( O(n) ) 时间复杂度。:通过四重循环枚举所有 ( a \leq b \leq c \leq d ),检查不等式是否成立。:给定 ( n ) 堆石子,每次合并相邻两堆,得分是两堆石子数之和。利用此性质可将时间复杂度从 ( O(n^3) ) 优化至 ( O(n^2) )。:编写Java方法验证给定二维数组 ( w ) 是否满足四边形不等式。则称 ( w ) 满足四边形不等式。 阅读详情

相关推荐

最优二叉查找树(动态规划)——详解

最优二叉查找树 (1)二叉查找树(二分检索树)二叉搜索树 T是一棵二元树,它或者为空,或者其每个结点含有一个可以比较大小的数据元素,且有: T的左子树的所有元素比根结点中的元素小; T的右子树的所有元素比根结点中的元素大; T的左子树和右子树也是二叉搜索树。 (2)最优二叉搜索树 给定一个n个关键字的已排序的序列K=<k 1 ,k 2 ,…,k n >( 不失一般性,设k 1 &...

weixin_44023658的博客 4万+

初识OBST

现在给出123,请建立BST 我们可以有最坏的一种建立方法: 1 2 3 如果我要查找1,我需要访问1个节点; 如果我要查找2,我需要访问2个节点; 如果我要查找3,我需要访问3个节点; 如果我都要找,我要访问1+2+3个节点,6个节点。称这个6为cost。 现在看另一棵 2 1 3 如果我要查找2,我需要访问1个节点; 如果我要查找1,我需要访问2个节点; 如果我要查找3,我需要访问2个节点; 如果我都要找,我要访问1+2+2个节点.

u013474815的博客 440

算法导论 — 15.5 最优二叉搜索树

笔记   二叉搜索树满足如下性质:假设xxx是二叉搜索树中的一个结点。如果lll是xxx的左子树的一个结点,那么l.key≤x.keyl.key≤x.keyl.key ≤ x.key。如果rrr是xxx的右子树的一个结点,那么r.key≥x.keyr.key≥x.keyr.key ≥ x.key。      也就是说,二叉搜索树中的任意一个结点,它的左子树中的所有结点都不大于它,它的右子树中...

yangtzhou的专栏 2万+

OBST(最优二叉搜索树)

  简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些带有概率的节点计算出整棵树的搜索期望E(T),找到一个最优节点作为根节点,重新建立一颗二叉树,称为最优二叉搜索树,其期望最低,使得所有搜索操作访问的节点总数最少。这样的一颗词典二叉树对于...

ding7530的博客 1844

OBST算法实现

算法导论的OBST算法实现加上显示路径的方法

最优二分搜索树(动态规划)

设S=(x1,x2,…,xn)是有序集,且x1<x2<…<xn,已知键值和区间的存取概率分布为(a0,b1,a1,b2,…,bn,an),其中ai表示相应区间的搜索概率,bi表示相应键值的搜索概率。在所有表示有序集的二叉树中找出一棵具有最小平均路长的二叉搜索树

最优排序二叉树问题OBST【区间dp+四边形不等式优化】

题目大意 给定n个点的权值,要求构建一棵二叉搜索树,使得他满足 ,权值乘以深度的和最小 题目分析 这个题目,我们通过BST的构建,由于BST 的性质可知,根节点的左边一定小于根,右边一定大于根,所以先对所有数据排序,然后枚举根节点。根节点对于答案的贡献 fk*1,由于第k个结点作为根节点了,因此对于其他结点来说,他们的深度都增加了一个,所以,他们都对答案的贡献增加 fi 而根节点将所有数据分成两部...

beckyUp的博客 1085

最小成本二分检索树_OBST

利用C++实现的最小成本二分检索树,能够根据double类型的成功检索P和不成功检索Q构造出最小成本二分检索树,利用一个二叉树类自动构造出该树,并打印到标准输出!

算法设计与分析 chapter 3 动态规划复习

根据期末老师划的重点复习…=_=! (1)动态规划的算法思想 自底向上 将待求解的问题分解为若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解。 与分治法不同:动态规划分解的子问题往往不是相互独立的 (2)动态规划算法的基本要素 最优子结构性质 重叠子问题性质 (3)动态规划算法的基本步骤 1 找出最优解的性质,并刻画其结构特征 2 递归地定义最优值 3 以自底向上的...

qq_38558834的博客 406

最优二叉搜索树算法及代码

一个关于最优二叉搜索树的程序段 并且包含最后的生成结果的显示

动态规划算法介绍算法介绍

对于学习ACM搞算法的初步学习和拓展思路有很大的帮助!是学习算法的好帮手!

动态规划实战:从合并石子问题看区间DP的套路与优化技巧

本文以信息学奥赛经典题目“合并石子”为例,深入解析区间动态规划的核心套路与优化技巧。详细阐述了区间DP的状态定义、转移方程推导、经典环形问题的断环成链解法,并介绍了四边形不等式和Garsia-Wachs等高级优化算法,旨在帮助读者掌握解决此类问题的通用框架与思维模式。

weixin_29000991的博客 203

5分钟搞定CST周期性结构仿真:共面波导色散曲线快速生成技巧

本文提供了一套在CST Studio Suite中快速仿真周期性结构并生成色散曲线的标准化流程。针对共面波导设计,重点解析了周期性边界条件的核心设置、本征模求解器(JDM算法)的优化技巧,以及通过参数扫描与后处理模板实现自动化,旨在帮助射频与微波工程师在5分钟内高效完成关键性能验证。

blue的专栏 1250

四边形不等式优化dp,超详细,概念定理详解证明,OJ练习

证明很繁琐,不过实际中打表猜测就行

EQUINOX1的博客 3255

Surface Go 2 变身 Linux 开发本:保姆级 Ubuntu 20.04 双系统安装与驱动配置全攻略

本文详细介绍了如何将 Surface Go 2 变身为高效的 Linux 开发本,涵盖 Ubuntu 20.04 双系统安装、专用内核配置、驱动优化等全流程。通过 linux-surface 内核安装和硬件驱动优化,确保 Surface Go 2 的触控、笔输入、摄像头等功能完美运行,适合开发者打造便携生产力工具。

weixin_30596165的博客 617

PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)

该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用。实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改。 AXI_CDMA特性: 如果是使用ZYNQ 7系列芯片(可能其他Xilinx也是通用的),xilinx的AXI_CDMA 核有两种传输模式:轮询(poll)和中断(...

YGLeeeon的博客 3522

【动态规划】最优二叉搜索树——算法设计与分析

介绍了最优二叉搜索树问题及其相关概念。并按照动态规划求解的基本步骤给出了算法策略,并进行了复杂度分析。

友人帐_的博客 8574

Android 13/14/15 默认授权应用权限的实现方法

Android版本修改方式实现原理13/14修改Permission.java将所有权限标记为Normal权限15修改DeviceIdleController.java + DefaultPermissionGrantPolicy.java监听应用安装并主动授权。

m0_60898338的博客 2918

算法:第七节课贪心算法

动态规划 最优二叉搜索树 si的值小,则等待时间少,使资源处于被占用的状态 fi的值小,则活动多 动态规划并不好用。 贪心算法 反证法 哈夫曼编码这个作业 编程题 用哈夫曼编码进行数据压缩 26个字母,最好包括大小写 压缩的文件 解压文件 用c..恩八百年没用过c了, ...

kopoo的博客 208

Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板)

本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。

weixin_28487433的博客 394

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 73

动态规划算法求解最优二叉搜索树

二叉搜索树T是一棵所有结点的元素值互异的二元树,本文将通过最优二叉搜索树问题的求解,带大家进一步熟悉动态规划算法,同时给出C++代码实现。

fufufunny的博客 2445

在 SAP 资产模块跨 2024 和 2025 两个年度操作后,运行 AFAB 测试无数据,大概率是折旧已完全过账、跨期配置异常或资产数据异常等原因

SAP资产模块跨年度操作AFAB测试无数据的排查方案:首先检查折旧是否已完全计提,确认资产主数据价值;其次验证跨年度配置是否合规,包括全局配置、折旧范围和账期状态;然后重新执行AFAR折旧计算刷新数据;排查资产主数据异常或业务操作冲突;最后核对AFAB运行参数是否正确设置,包括会计年度、期间范围和运行模式等。

金牌架构师 868

0020算法笔记——【动态规划】最优二叉搜索树问题

1、问题描速:        设 S={x1, x2, ···, xn} 是一个有序集合,且x1, x2, ···, xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质:存储于每个顶点中的元素x 大于其左子树中任一个顶点中存储的元素,小于其右子树中任意顶点中存储的元素。二叉树中的叶顶点是形如(xi, xi+1) 的开区间。在表示S的二叉搜索树中搜索一个元素x,返

liufeng_king的专栏 2万+

060、模型蒸馏:把扩散模型压进单步的魔法

《端侧文生图模型蒸馏实战:从32步到1步的优化之道》摘要:针对边缘设备部署难题,本文分享了扩散模型蒸馏的核心经验。通过重构损失函数(感知损失+对抗训练+KL散度)、优化采样轨迹截取策略和改造学生模型架构,成功将Stable Diffusion压缩至单步推理。关键发现包括:小批量训练更有效、标签平滑保障生成多样性、双模型策略平衡质量与速度。在Cortex-A53芯片上实现300ms内生成,内存占用控制在200MB以下。特别强调工业部署需权衡压缩率与稳定性,建议保留迭代模式开关以适配不同场景需求。

2601_95651806的博客 150

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 算法实践-求最长公共子序列-动态规划
下一篇: DataFu在Apache进入孵化状态
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值