此算法是根据《算法导论》里面的介绍编写的。数据也是。代码运行后,结果数据正确。
以《算法导论》P213中未测试数据:
p[6]={-100,0.15,0.1,0.05,0.1,0.2};
q[6]={0.05,0.1,0.05,0.05,0.05,0.1};
运行结果:
《算法导论》中的结果p216:
代码如下:
#include <iostream>
void main()
{
float p[6]={-100,0.15,0.1,0.05,0.1,0.2};
float q[6]={0.05,0.1,0.05,0.05,0.05,0.1};
float e[7][6];
float w[7][6];
int root[6][6];
for(int i=1;i<7;i++)
e[i][i-1]=w[i][i-1]=q[i-1];//初始化d
for(int l=0;l<6;l++)//求间隔距离为L的序列子最优二叉树
{
for(int i=1;i<6-l;i++)//序列从i开始
{
int j=i+l;//到j结束
e[i][j]=1000;//初始化为-正无穷大
//遍历序列中的节点作为子树的根结点,并找到最小搜索代价放入e,同时把此根结点存放入root
w[i][j]=w[i][j-1]+q[j]+p[j];//这一个不太好理解。
//w的物理意义是这个序列的所有k点和d点的概率和。
//序列里面多了一个k点,同时,就要把这个Ki点和Di点加入到w里面。
for(int k=i;k<=j;k++)//计算以k为根结点的子二叉树的搜索代价
{
float tmp=e[i][k-1]+e[k+1][j]+w[i][j];
if(tmp<e[i][j])
{
e[i][j]=tmp;//如果搜索代价小于以前计算的,放入e(也就是说,e中一直存着目前最小的搜索代价)
root[i][j]=k;
}
}
}
}
printf("e:\n");
for(int i=1;i<7;i++){
for(int j=0;j<6;j++){
if(e[i][j]>10||e[i][j]<0){
printf(" ");
}
else{
printf("%1.2f,",e[i][j]);
}
}
printf("\n");
}
printf("w:\n");
for(int i=1;i<7;i++){
for(int j=0;j<6;j++){
if(w[i][j]>1||w[i][j]<0){
printf(" ");
}
else{
printf("%1.2f,",w[i][j]);
}
}
printf("\n");
}
printf("root:\n");
for(int i=1;i<6;i++){
for(int j=1;j<6;j++){
if(root[i][j]>10||root[i][j]<0){
printf(" ");
}
else{
printf("%d,",root[i][j]);
}
}
printf("\n");
}
}
- 大小: 15.5 KB
- 大小: 27.5 KB
分享到:
相关推荐
【最优二叉搜索树问题】是一种在数据结构和算法领域中的经典问题,主要涉及动态规划的概念。该问题的目标是设计一棵二叉搜索树(BST),使得在给定的元素集合和存取概率分布下,搜索元素时的平均比较次数达到最小。 ...
一旦所有子树的成本都被计算出来,算法便可以通过递归地调用`constructOptimalBST`函数,根据动态规划过程中记录的最优根节点选择,构建出整个最优二叉查找树的结构。在构建过程中,函数会打印出树的结构信息,包括...
运用c语言,动态规划算法构造最优二叉查找树。
最优二叉搜索树,也称为最优化二叉查找树或者动态二叉搜索树,是计算机科学中的一个重要概念,尤其在算法设计与分析领域占据一席之地。这种数据结构主要用于提高查询效率,在某些特定操作序列下,它能比普通二叉搜索...
运用c语言,贪心算法构造最优二叉查找树。
凸包问题(包含蛮力算法和快速凸包算法两种解法)+最优二叉查找树,并且都利用javafx生成可视化界面,开箱即用,代码含注释,原理通俗易懂。
本文主要探讨了在解决最优二叉搜索树问题时所采用的一种高效算法——动态规划算法。最优二叉搜索树(Optimal Binary Search Tree, OBST)是在特定概率下查找操作平均时间最短的二叉搜索树。在实际应用中,如数据库索引...
本篇介绍的Ruby代码提供了一个简洁而完整的最优二叉查找树的构建过程,通过动态规划的方法有效地解决了如何构建最优二叉查找树的问题。这对于理解最优二叉查找树的概念及其实际应用具有重要的意义。在实际开发中,...
《MIT公开课——算法导论教材》是一份源自美国麻省理工学院(MIT)的珍贵教育资源,专注于教授计算机科学中的核心概念——算法。这份教材涵盖了排序、树和Hash等基础但至关重要的算法,对于学习和理解计算机科学的...
第19章 动态规划 19.1 算法思想 19.2 应用 19.2.1 0/1背包问题 19.2.2 矩阵乘法链 19.2.3 所有顶点对之间的最短路径 19.2.4 带有负值的单源最短路径 19.2.5 网组的无交叉子集 19.3 参考及推荐读物 第20章 回溯法 ...
最优二叉查找树,为算法导论上的算法,时间复杂度O(nlgn),思考题15.5-
《基于最优二叉决策树分类模型的奶牛运动行为识别》这篇文章主要探讨了一种改进的奶牛运动行为识别方法,该方法基于最优二叉决策树分类模型,旨在解决传统决策树算法在奶牛行为分类中可能存在的主观性强、阈值选择不...
二叉查找算法是一种在二叉树数据结构中高效地寻找目标元素的算法。它基于排序二叉树(也称为搜索二叉树),其中每个节点的值都大于其左子树中的任何节点,小于其右子树中的任何节点。这种特性使得二叉查找算法能以...
二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。在本文中,我们将探讨四种...理解并熟练掌握这些概念对于理解和实现各种树结构的算法至关重要,如二叉搜索树、AVL树、红黑树等。
MIT经典教程,算法必修,全球超过50万人阅读的算法圣经!算法标准教材,国内外1000余所高校采用
"线索遍历"是指在线索化二叉树上进行的中序遍历,因为有了线索,所以不再需要栈或者递归,可以直接按照线索顺序访问所有节点。线索遍历的过程就是从根节点开始,沿着线索依次访问每个节点。 在C++中,实现这些功能...
书中涵盖了广泛的算法和设计技术,包括但不限于排序算法、搜索算法、图算法、动态规划、分治策略、贪心算法等。每一章都围绕一个算法、一种设计技巧、一个应用领域或相关主题展开,不仅提供了算法的详细描述,还通过...
动态规划与最优控制模型是数学建模领域中的两个核心概念,它们在解决复杂问题和优化决策过程中发挥着至关重要的作用。动态规划(Dynamic Programming, DP)由美国数学家Richard Bellman在20世纪50年代提出,而最优...
- **动态规划**:一种递归算法,用于寻找多阶段决策问题中的最优策略。动态规划可以应用于离散时间系统。 #### 4. 应用领域 最优控制理论在多个领域有着广泛的应用: - **航空航天**:飞机、火箭等飞行器的轨迹...