动态规划:最优二分检索树

原创 2015年11月18日 16:14:40

动态规划:最优二分检索树

1、题目

    设n=4,且(a1,a2,a3,a4)=(do,if,stop,then),设P(1:4)=(3,3,1,1),Q(0:4)=(1,3,2,1,1)(概率值“扩大”了16倍),求最优二分检索树

 

2、方法

        动态规划。主要参考方法链接:http://www.cnblogs.com/stemon/p/3407773.html

主要用到的公式为:


初始时有,W(i,i)=Q(i),C(i,i)=0,R(i,i)=0


3、实现代码

#include <stdio.h>
#include <stdlib.h> 
#define MAX_LEN 256

typedef struct BtreeNode{
	int data;
	BtreeNode* lchild;
	BtreeNode* rchild;
}BtreeNode,*BtreePtr;

BtreePtr OptimalBinarySearchTree(int st,int ed,int (*T)[MAX_LEN],int *num) // 构建最优二分检索树 
{
	if(st >= ed) return NULL;
	BtreePtr  p;
	p=(BtreePtr)malloc(sizeof(BtreeNode));
	p->data=num[T[st][ed]];
	p->lchild=OptimalBinarySearchTree(st,T[st][ed]-1,T,num);
	p->rchild=OptimalBinarySearchTree(T[st][ed],ed,T,num);
	return p;
}

int main()
{
	int index,tmp;
	int n,i,j,k,l;
	int P[MAX_LEN],Q[MAX_LEN];
	int num[MAX_LEN],W[MAX_LEN][MAX_LEN],C[MAX_LEN][MAX_LEN],T[MAX_LEN][MAX_LEN];

    printf("请输入真实节点个数:");
	while(1==scanf("%d",&n)){
		if(n > 0){
			printf("请输入真实节点值:"); 
			for(i=1;i<=n;i++)
				scanf("%d",num+i);
			printf("请输入各节点成功的概率P:"); 
			for(i=1;i<=n;i++)
				scanf("%d",P+i);
			printf("请输入各节点失败的概率Q:");
			for(i=0;i<=n;i++)
				scanf("%d",Q+i);
			break;
		}
		printf("n为无效输入.\n");
	}

	//初始化
	for(i=0;i<=n;i++){
		W[i][i]=Q[i];
		C[i][i]=0;
	}

	for(l=1;l<=n;l++) // 动态规划算法 
	{
		for(i=0;i < n;i++){
			j=i+l;
			W[i][j]=W[i][j-1]+P[j]+Q[j];

			//寻找最小的root 
			index=i+1;tmp=C[i][i]+C[i+1][j];
			for(k=i+2;k<=j;k++){
				if(C[i][k-1]+C[k][j] < tmp){
					tmp=C[i][k-1]+C[k][j];
					index=k;
				}
			}
			C[i][j]=C[i][index-1]+C[index][j]+W[i][j];
			T[i][j]=index;
		}
	}

	printf("cost=%d,root=%d\n",C[0][n],T[0][n]);

	BtreePtr mvbt=OptimalBinarySearchTree(0,n,T,num);

	return 0;
}



4、结果截图


版权声明:本文为博主原创文章,如需转载,请注明地址:http://blog.csdn.net/sunkun2013 举报

相关文章推荐

动态规划:最优二分检索树

最优二分检索树 1、题目     设n=4,且(a1,a2,a3,a4)=(do,if,stop,then),设P(1:4)=(3,3,1,1),Q(0:4)=(1,3,2,1,1)(概率值“扩大”...

动态规划之最优二叉搜索树

利用最优二叉搜索树来实现树的搜索代价最小。

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

动态规划之最优二叉搜索树

目录 最优二叉搜索树简介 举例以及详细分析 代码块 测试结果 最优二叉搜索树简介1、概念引入  基于统计先验知识,我们可统计出一个数表(集合)中各元素的查找概率,理解为集合各元素的出现频率。比如中文输...

算法导论之动态规划:最优二叉搜索树

最优二叉搜索树:给定一个n个不同关键字的已排序的序列K=(k1<k2<k3……<kn),用这些关键字构建一颗二叉搜索树。对于每个关键字ki,都有一个概率pi表示其搜索频率。 有些要搜索的值可能不在K中...

最优二叉搜索树动态规划

问题描述: 最优二叉搜索树问题是对于有序集S及其存取概率或权值(q0,p1,q1,p2,q2,p3,q3),在所有表示有序集S的二叉搜索树中找出一颗具有最小平均路长的二叉搜索树。 解决方法: 使...

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

假定有一组英语单词与其法语的翻译,要根据英语单词搜索其法语翻译;有以下两个条件     1. 单词的出现频率不同     2. 有些单词没有对应的法语单词,称为伪单词     在给定单词出现频率...

【算法导论】动态规划之“最优二叉搜索树”

详解动态规划之“最优二叉搜索树”

动态规划之最优二叉搜索树

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

动态规划之最优二叉搜索树

在看这张之前,最好看看我写的动态规划详解,里面都是讲理论基础,我下面的分析都是在此基础上进展的。

二叉搜索树 -【动态规划】最优C++实现

程序在VC++6.0下编译通过 1 #include iostream> 2 #include fstream> 3 #include string> 4 #include li...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)