最优二叉查找树 算法导论216
来源:互联网 发布:c语言gui编程 编辑:程序博客网 时间:2024/05/20 14:26
#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;
}
- 最优二叉查找树 算法导论216
- 算法导论 最优二叉查找树
- 算法导论15.5 最优二叉查找树
- 算法导论 ch15 动态规划 最优二叉查找树
- 算法导论第十五章--最优二叉查找树
- 【算法导论】动态规划之最优二叉查找树
- 最优二叉查找树详解(算法导论学习笔记)
- 最优二叉查找树(动态规划算法实现) 算法导论216
- 【算法导论】最优二叉搜索树
- 算法导论-----------------最优二叉搜索树
- 【算法导论】最优二叉搜索树
- 算法导论--最优二叉搜索树
- 算法导论 最优二叉搜索树
- 算法导论学习笔记(10)——动态规划之最优二叉查找树
- 算法导论15.5最优二叉查找树实现(Java语言)
- 《算法导论》笔记 第15章 15.5 最优二叉查找树
- 算法导论第15章 动态规划-最优二叉查找树
- 算法导论之动态规划(最长公共子序列和最优二叉查找树)
- 用十字链表存储 稀疏矩阵乘法
- 旧工程适配iOS 6和iPhone 5之第三方静态库(file is universal (3 slices) but does not contain a(n) armv7s )
- hdu1841之KMP应用
- E.Function(13.7.8)
- 最小生成树-克鲁斯卡尔-Kruskal算法
- 最优二叉查找树 算法导论216
- Python简单教程
- strcpy,memset,memcpy三者之间的根本区别
- conversion to dalvik format failed with error 3
- IOS音频简单处理
- 07-jbpm工作流之根据流程变量分配任务Task
- hdu1878 欧拉回路
- oracle dblink 实验
- 在ubuntu13.04环境下配置apache的vhost