此算法是根据《算法导论》里面的介绍编写的。数据也是。代码运行后,结果数据正确。
以《算法导论》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
分享到:
相关推荐
在本课程作业的代码“最优二叉查找树 动态规划法.cpp”中,可能包含了以下关键部分: 1. **数据结构定义**:定义二叉查找树节点的数据结构,包括键值、左子节点和右子节点的引用。 2. **概率分布输入**:程序需要...
运用c语言,动态规划算法构造最优二叉查找树。
最优二叉搜索树,也称为最优化二叉查找树或动态二叉查找树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值和两个子节点,左子节点的键值小于当前节点,右子节点的键值大于当前节点。在最优二叉搜索树中,...
使用C++实现最优二叉查找树,对正在学习算法的同学应该挺有帮助的
关于最优二叉搜索树的动态规划算法描述
给出的示例代码展示了如何使用动态规划算法构建最优二叉检索树的过程。主要包含以下几个部分: 1. **节点结构定义**:首先定义了 `TreeNode` 结构体,用于存储二叉树中的节点信息。每个节点包含指向其左右子节点的...
最优二叉搜索树详细的分析了最优二叉树的伪代码以及给出了算法设计,还包含一个例子用来更好的理解最优二叉搜索树的流程
本文主要探讨了在解决最优二叉搜索树问题时所采用的一种高效算法——动态规划算法。最优二叉搜索树(Optimal Binary Search Tree, OBST)是在特定概率下查找操作平均时间最短的二叉搜索树。在实际应用中,如数据库索引...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...
然而,在某些场景下,不同的键(key)被查询的频率各不相同,这就引发了一个问题——如何构建一棵最优的二叉搜索树,使得平均查找成本最低? #### 二、基本概念 - **键(Key)**:二叉搜索树中的数据元素。 - **查询...
本篇介绍的Ruby代码提供了一个简洁而完整的最优二叉查找树的构建过程,通过动态规划的方法有效地解决了如何构建最优二叉查找树的问题。这对于理解最优二叉查找树的概念及其实际应用具有重要的意义。在实际开发中,...
在这个“树和二叉树源代码”压缩包中,我们可以期待找到关于树的各种遍历算法的实现。 1. **前序遍历**:前序遍历也称为根-左-右遍历,首先访问根节点,然后递归地遍历左子树,最后遍历右子树。在二叉树的前序遍历...
第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章 回溯法 ...
构造过程可以通过自底向上或自顶向下的动态规划方法实现,最终得到的树在平均查找时间上优于普通二叉搜索树。 在提供的压缩包文件中,包含了这三个算法的源码和报告,可以作为学习和参考的实例。源码可以帮助理解...
用分治法解决快速排序问题及用动态规划法解决最优二叉搜索树问题及用回溯法解决图的着色问题.pdf
二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。在本文中,我们将探讨四种...理解并熟练掌握这些概念对于理解和实现各种树结构的算法至关重要,如二叉搜索树、AVL树、红黑树等。
该资源是ppt,查看了算法导论书籍等相关文献,做了一个报告,给我们实验室的同学,希望能帮助你,有什么问题,可以留言。。
动态规划与最优控制模型是数学建模领域中的两个核心概念,它们在解决复杂问题和优化决策过程中发挥着至关重要的作用。动态规划(Dynamic Programming, DP)由美国数学家Richard Bellman在20世纪50年代提出,而最优...
在动态规划和最优控制的背景下,MATLAB代码可能包括求解贝尔曼方程、动态规划迭代算法的实现,如价值迭代或策略迭代,以及针对特定控制系统的最优控制器设计,如LQR(线性二次型调节器)或Pontryagin的最大原则的...