#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10000
double e[102][101];
double w[102][101];
int root[101][101];
double p[101],q[101];
typedef struct
{
char word[20];
char key[20];
}datatype;
typedef struct bitnode
{
datatype data;
struct bitnode *lchild;
struct bitnode *rchild;
}BiTNode;
int cmp( const void *a,const void *b)
{
return strcmp(((*(BiTNode**)a)->data.word),((*(BiTNode**)b)->data.word));
}
BiTNode *queue[101];
void bst(int n)
{
int i,j,r,l;
double t;
for(i=1;i<=n+1;i++)
e[i][i-1]=w[i][i-1]=q[i-1];
for(l=1;l<=n;l++)
for(i=1;i<=n-l+1;i++)
{
j=i+l-1;
e[i][j]=MAX;
w[i][j]=w[i][j-1]+p[j]+q[j];
for(r=i;r<=j;r++)
{
t=e[i][r-1]+e[r+1][j]+w[i][j];
if(t<e[i][j])
{
e[i][j]=t;
root[i][j]=r;
}
}
}
}
BiTNode *printfroot(int i,int j ,BiTNode *bt)
{
if(i>j)
{ BiTNode *p;
p=(BiTNode *)malloc(sizeof(BiTNode));
p->lchild=NULL;
p->rchild=NULL;
strcpy(p->data.word,"No_this_word!");
strcpy(p->data.key,"空");
bt=p;
return bt;
}
else
{
bt=queue[root[i][j]];
bt->lchild=printfroot(i,root[i][j]-1,bt->lchild);
bt->rchild=printfroot(root[i][j]+1,j,bt->rchild);
}
return bt;
}
void preorder(BiTNode *bt)
{
if(bt->lchild==NULL)
{
printf("%s \n",bt->data.word);
return ;
}
else if(bt->lchild==NULL)
{
printf("%s \n",bt->data.key);
return ;
}
else
{
printf("%s->%s\n",bt->data.word,bt->data.key);
preorder(bt->lchild);
preorder(bt->rchild);
}
}
void translate(BiTNode *BT)
{
int find,c;
char word[20];
BiTNode *bt;
printf("请输入要查的单词 输入1: 退出\n");
while(scanf("%s",word)!=EOF)
{
if(word[0]=='1')
{
printf("谢谢使用\n");
break;
}
else
{
find=0;
bt=BT;
while(find==0)
{
c=strcmp(word,(bt->data.word));
if(c==0)
{
printf("%s->%s\n\n",bt->data.word,bt->data.key);
find=1;
}
else if(c<0)
{
if(bt->lchild)
bt=bt->lchild;
else
{
printf("%s:%s\n\n",word,bt->data.key);
find=2;
}
}
else
{
if(bt->rchild)
bt=bt->rchild;
else
{
printf("%s:%s\n\n",word,bt->data.key);
find=2;
}
}
}
}
}
}
void print(int n)
{
int i,j;
for(j=1;j<=n;j++)
printf(" %d ",j);
printf("\n");
for(i=1;i<=n+1;i++)
{
printf("%d ",i);
for(j=0;j<i-1;j++)
printf(" ");
for(j=i-1;j<=n;j++)
printf("%.2lf ",e[i][j]);
printf("\n");
}
printf("\n");
for(j=1;j<=n;j++)
printf(" %d ",j);
printf("\n");
for(i=1;i<=n+1;i++)
{
printf("%d ",i);
for(j=0;j<i-1;j++)
printf(" ");
for(j=i-1;j<=n;j++)
printf("%.2lf ",w[i][j]);
printf("\n");
}
printf("\n");
printf(" ");
for(j=1;j<=n;j++)
printf("%d ",j);
printf("\n");
for(i=1;i<=n;i++)
{
printf("%d ",i);
for(j=1;j<=i-1;j++)
printf(" ");
for(j=i;j<=n;j++)
printf("%d ",root[i][j]);
printf("\n");
}
printf("\n");
BiTNode *bt;
bt=printfroot(1,n,bt);
preorder(bt);
printf("\n");
translate(bt);
}
int main()
{ freopen("1.txt","r",stdin);
int n,i;
BiTNode *pp;
printf("请输入关键字的个数N:\n");
scanf("%d",&n);
printf("请输入单词word 相对中文key 应的概率p:\n");
for(i=1;i<=n;i++)
{
pp=(BiTNode *)malloc(sizeof(BiTNode));
scanf("%s %s %lf",&(pp->data.word),&(pp->data.key),&p[i]);
pp->lchild=pp->rchild=NULL;
queue[i]=pp;
}
for(i=1;i<=n;i++)
printf("%s %s\n",queue[i]->data.word,queue[i]->data.key);
printf("\n");
// qsort(queue+1,n,sizeof(queue[0]),cmp);
for(i=1;i<=n;i++)
printf("%s %s\n",queue[i]->data.word,queue[i]->data.key);
printf("\n");
printf("请输入虚拟键的概率q:\n");
for(i=0;i<=n;i++)
scanf("%lf",&q[i]);
bst(n);
print(n);
return 0;
}
分享到:
相关推荐
用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用
使用C++实现最优二叉查找树,对正在学习算法的同学应该挺有帮助的
一个关于最优二叉搜索树的程序段 并且包含最后的生成结果的显示
最优二叉搜索树,计算机算法设计与分析的一个题目
摘要视图订阅登录 | 注册195897次第4587名57篇33篇0篇117条0020算法笔记——【动态规划】最优二叉搜索树问题 liufeng_king的专
最优二叉查找树,包含习题15.5-1算法,为算法导论上的习题。
用动态规划的算法实现最优二叉检索树,使得在检索数据过程中花费的代价最小
运用c语言,贪心算法构造最优二叉查找树。
运用c语言,动态规划算法构造最优二叉查找树。
关于最优二叉搜索树的动态规划算法描述
凸包问题(包含蛮力算法和快速凸包算法两种解法)+最优二叉查找树,并且都利用javafx生成可视化界面,开箱即用,代码含注释,原理通俗易懂。
使用C#实现的动态规划算法 关键字序列:0.15,0.1,0.05,0.1,0.2 非关键字序列:0.05,0.1,0.05,0.05,0.05,0.1 以上的测试数据,输入数据可以得到结果
主要介绍了Ruby实现的最优二叉查找树算法,本文直接给出实现代码,需要的朋友可以参考下
最优二叉搜索树的动态规划算法研究.txt
最优二叉搜索树(OBST)课件 基本概念、例题、算法过程分析,课后习题
算法课最优二叉搜索树讲稿
算法设计与分析(fft,平面上最接近两点对,最优二叉搜索树构造)这三个实验的代码和报告,报告是写在一起的,