关闭

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

标签: 算法动态规划
1547人阅读 评论(0) 收藏 举报
分类:

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

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、结果截图


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

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

我们在之前也讨论过动态规划的例子: 动态规划原理:http://blog.csdn.net/ii1245712564/article/details/45040037 钢条切割问题:http:/...
  • ii1245712564
  • ii1245712564
  • 2015-04-20 15:41
  • 1753

动态规划---->最优二分检索树

最优二分检索树 最优二分检索树问题:求一棵使得预期成本最小的二分检索树 一、问题引出   或是一棵空树;或者是具有如下性质的非空二叉树:  (1)左子树的所有结点均小于根的值;  (2)右子...
  • ncepustrong
  • ncepustrong
  • 2013-05-14 11:04
  • 2935

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

最优二分检索树 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)(概率值“扩大”...
  • u010043538
  • u010043538
  • 2015-11-18 16:14
  • 1547

用动态规划法构造最优二分检索树

  • 2009-04-15 13:11
  • 11KB
  • 下载

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

最优二分检索树 二分检索树T是一棵二元树 ①T的左子树的所有元素比根结点中的元素小; ②T的右子树的所有元素比根结点中的元素大; ③T的左子树和右子树也是二分检索树。 注: 二分检索树要求树中所有...
  • bajinbajin
  • bajinbajin
  • 2013-10-21 23:54
  • 2981

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

  • 2015-11-17 14:50
  • 2KB
  • 下载

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

  • 2014-01-14 15:20
  • 228KB
  • 下载

动态规划_最优二分查找树

一、什么是最优二叉查找树 最优二叉查找树: 给定n个互异的关键字组成的序列K=,且关键字有序(k1 图一显示了给定上面的概率分布pi、qi,生成的两个二叉查找树的例子。图二就是在这种情况下一棵最...
  • llwszjj
  • llwszjj
  • 2013-11-19 19:24
  • 2689

动态规划求解最优资源

  • 2014-06-05 09:38
  • 24KB
  • 下载

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

详解动态规划之“最优二叉搜索树”
  • cyp331203
  • cyp331203
  • 2015-01-24 16:11
  • 2887
    个人资料
    • 访问:246660次
    • 积分:3414
    • 等级:
    • 排名:第11369名
    • 原创:86篇
    • 转载:23篇
    • 译文:0篇
    • 评论:58条
    最新评论