`
shinepengwei
  • 浏览: 45090 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

动态规划之最优二叉查找树源代码——算法导论

阅读更多

此算法是根据《算法导论》里面的介绍编写的。数据也是。代码运行后,结果数据正确。

 

以《算法导论》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
1
2
分享到:
评论

相关推荐

    C++实现的最优二叉查找树

    用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用

    最优二叉查找树 动态规划法.cpp.rar

    在本课程作业的代码“最优二叉查找树 动态规划法.cpp”中,可能包含了以下关键部分: 1. **数据结构定义**:定义二叉查找树节点的数据结构,包括键值、左子节点和右子节点的引用。 2. **概率分布输入**:程序需要...

    最优二叉查找树

    一旦所有子树的成本都被计算出来,算法便可以通过递归地调用`constructOptimalBST`函数,根据动态规划过程中记录的最优根节点选择,构建出整个最优二叉查找树的结构。在构建过程中,函数会打印出树的结构信息,包括...

    动态规划构造最优二叉查找树

    运用c语言,动态规划算法构造最优二叉查找树。

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

    最优二叉搜索树,也称为最优化二叉查找树或动态二叉查找树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值和两个子节点,左子节点的键值小于当前节点,右子节点的键值大于当前节点。在最优二叉搜索树中,...

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

    在实际代码实现中,除了动态规划数组`dp`,还需要一个二维数组`parent`来记录每个状态对应的最优分割点,这有助于回溯构建最终的最优二叉搜索树。 在提供的测试数据中,关键字序列为`0.15, 0.1, 0.05, 0.1, 0.2`,...

    最优二叉搜索树的动态规划算法研究

    关于最优二叉搜索树的动态规划算法描述

    最优二叉检索树(Optimal Search Tree)

    给出的示例代码展示了如何使用动态规划算法构建最优二叉检索树的过程。主要包含以下几个部分: 1. **节点结构定义**:首先定义了 `TreeNode` 结构体,用于存储二叉树中的节点信息。每个节点包含指向其左右子节点的...

    最优二叉搜索树模范讲解

    # 最优二叉搜索树(OBST)模范讲解 ## OBST的概念与构造 ### 定义 **最优二叉搜索树**(Optimal Binary Search Tree,...通过动态规划等算法可以有效地解决构建最优二叉搜索树的问题,从而实现高效的数据查找和管理。

    最优二叉搜索树

    最优二叉搜索树详细的分析了最优二叉树的伪代码以及给出了算法设计,还包含一个例子用来更好的理解最优二叉搜索树的流程

    最优二叉搜索树的动态规划算法研究.txt

    本文主要探讨了在解决最优二叉搜索树问题时所采用的一种高效算法——动态规划算法。最优二叉搜索树(Optimal Binary Search Tree, OBST)是在特定概率下查找操作平均时间最短的二叉搜索树。在实际应用中,如数据库索引...

    二叉查找树 减治法——C++代码

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...

    算法与数据结构 算法分析课程 第10章 动态规划 3、最优二叉搜索树 共19页.pptx

    然而,在某些场景下,不同的键(key)被查询的频率各不相同,这就引发了一个问题——如何构建一棵最优的二叉搜索树,使得平均查找成本最低? #### 二、基本概念 - **键(Key)**:二叉搜索树中的数据元素。 - **查询...

    Ruby实现的最优二叉查找树算法

    本篇介绍的Ruby代码提供了一个简洁而完整的最优二叉查找树的构建过程,通过动态规划的方法有效地解决了如何构建最优二叉查找树的问题。这对于理解最优二叉查找树的概念及其实际应用具有重要的意义。在实际开发中,...

    树和二叉树源代码

    在这个“树和二叉树源代码”压缩包中,我们可以期待找到关于树的各种遍历算法的实现。 1. **前序遍历**:前序遍历也称为根-左-右遍历,首先访问根节点,然后递归地遍历左子树,最后遍历右子树。在二叉树的前序遍历...

    数据结构、算法与应用:C++语言描述(原书第2版)第二部分

    第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章 回溯法 ...

    算法设计与分析(fft,平面上最接近两点对,最优二叉搜索树构造)

    构造过程可以通过自底向上或自顶向下的动态规划方法实现,最终得到的树在平均查找时间上优于普通二叉搜索树。 在提供的压缩包文件中,包含了这三个算法的源码和报告,可以作为学习和参考的实例。源码可以帮助理解...

    用分治法解决快速排序问题及用动态规划法解决最优二叉搜索树问题及用回溯法解决图的着色问题.pdf

    用分治法解决快速排序问题及用动态规划法解决最优二叉搜索树问题及用回溯法解决图的着色问题.pdf

    算法与数据结构 算法分析课程 动态规则后半部分8 构建最优二叉搜索树 共17页.pptx

    本文将深入探讨如何构建最优二叉搜索树,并通过动态规划的方法解决这一问题。 #### 二、最优二叉搜索树的背景与定义 假设我们有一组键\(K_1, K_2, \ldots, K_n\),每个键\(K_i\)被查询的概率为\(p_i\)。此外,对于...

    二叉树源代码

    二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。在本文中,我们将探讨四种...理解并熟练掌握这些概念对于理解和实现各种树结构的算法至关重要,如二叉搜索树、AVL树、红黑树等。

Global site tag (gtag.js) - Google Analytics