(p231)15.5-4最优二叉搜索树(n^2和n^3)
来源:互联网 发布:ucloud vs 阿里云 编辑:程序博客网 时间:2024/05/15 23:53
对于长度为l的所有子数组的root[i+1][j]-root[i][j-1]+1的和其实就是root[n-l+1][n]-root[1][l]+n-l=o(n),所以两层循环就是n^2,但是并不知道Knuth的结论是怎么来的,希望知道的分享一下^-^
/*attention if max set to 1000 will cause segmentation fault*/#include<stdio.h>#include<stdlib.h>#define max 100#define inf 1e20struct node{int n;struct node *l,*r;};float optimal_bst(float p[],float q[],float e[][max+1],int root[][max+1],int n){int i,j,r,l;float w[max+2][max+1];for (i=1;i<=n+1;i++){e[i][i-1]=q[i-1];w[i][i-1]=q[i-1];}for (l=0;l<=n-1;l++)for (i=1;i<=n-l;i++){j=i+l;w[i][j]=w[i][j-1]+p[j]+q[j];e[i][j]=inf;for (r=i;r<=j;r++)if (e[i][r-1]+e[r+1][j]+w[i][j]<e[i][j]){e[i][j]=e[i][r-1]+e[r+1][j]+w[i][j];root[i][j]=r;}}return e[1][n];}float optimal_bst2(float p[],float q[],float e[][max+1],int root[][max+1],int n){int i,j,r,l;float w[max+2][max+1];for (i=1;i<=n+1;i++){e[i][i-1]=q[i-1];w[i][i-1]=q[i-1];}for (i=1;i<=n;i++){root[i][i]=i;w[i][i]=w[i][i-1]+p[i]+q[i];e[i][i]=e[i][i-1]+e[i+1][i]+w[i][i];}for (l=1;l<=n-1;l++)for (i=1;i<=n-l;i++){j=i+l;w[i][j]=w[i][j-1]+p[j]+q[j];e[i][j]=inf;for (r=root[i][j-1];r<=root[i+1][j];r++)if (e[i][r-1]+e[r+1][j]+w[i][j]<e[i][j]){e[i][j]=e[i][r-1]+e[r+1][j]+w[i][j];root[i][j]=r;}}return e[1][n];}int construct_optimal_bst(int root[][max+1],struct node *troot,int l,int r){struct node *new;int tmp;new=(struct node *)malloc(sizeof(struct node));if (l>r){troot->n=r;troot->l=NULL;troot->r=NULL;return 0;}tmp=root[l][r];troot->n=tmp;troot->l=(struct node *)malloc(sizeof(struct node));troot->r=(struct node *)malloc(sizeof(struct node));construct_optimal_bst(root,troot->l,l,tmp-1);construct_optimal_bst(root,troot->r,tmp+1,r);return 0;}int print(struct node *troot){if (troot==NULL){printf("# ");return 0;}if ((troot->l==NULL)&&(troot->r==NULL))printf("d%d ",troot->n);elseprintf("k%d ",troot->n);print(troot->l);print(troot->r);return 0;}int main(void){float p[max+1]={0,0.15,0.10,0.05,0.10,0.20};float q[max+1]={0.05,0.10,0.05,0.05,0.05,0.10};float e[max+2][max+1];float ans;int root[max+2][max+1],n;//can be reduced to [max+1][max+1]n=5;ans=optimal_bst2(p,q,e,root,n);printf("%f\n",ans);struct node *troot;troot=(struct node *)malloc(sizeof(struct node));construct_optimal_bst(root,troot,1,n);print(troot);printf("\n");return 0;}
0 0
- (p231)15.5-4最优二叉搜索树(n^2和n^3)
- 最优二叉搜索树2
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- 最优二叉搜索树
- CLRS 15.5最优二叉搜索树
- 最优二叉搜索树(动态规划)
- 最优二叉搜索树 (dp)
- C++ 最优二叉搜索树
- 最优二叉搜索树问题
- 最优二叉搜索树1
- ListView的下拉刷新和上拉加载
- Python入门 之 列表生成式
- 面向对象基础——引用传递及其应用以及this关键字的使用
- C++面向对象编程分享05----20160326_李楚煌
- 白帽、黑帽SEO和灰帽seo的关系
- (p231)15.5-4最优二叉搜索树(n^2和n^3)
- 2012年的Android之旅:梦想、学习、坚持、自信、淡定
- Go语言学习(六)函数
- 虚幻4:有关渲染宏的解释。
- 锁与并发
- 浅谈Mental Ray渲染引擎并行性机制
- 黑帽SEO技术和白帽SEO技术有什么区别?
- hdoj 2024 C语言合法标识符
- 剑指offer面试题之栈的压入、弹出序列