实验四.哈夫曼编码的贪心算法设计Word文件下载.doc
- 文档编号:14330252
- 上传时间:2022-10-22
- 格式:DOC
- 页数:5
- 大小:99.50KB
实验四.哈夫曼编码的贪心算法设计Word文件下载.doc
《实验四.哈夫曼编码的贪心算法设计Word文件下载.doc》由会员分享,可在线阅读,更多相关《实验四.哈夫曼编码的贪心算法设计Word文件下载.doc(5页珍藏版)》请在冰豆网上搜索。
stdio.h>
stdlib.h>
string.h>
typedefstruct
{
unsignedintweight;
//用来存放各个结点的权值
unsignedintparent,LChild,RChild;
//指向双亲、孩子结点的指针
}HTNode,*HuffmanTree;
//动态分配数组,存储哈夫曼树
typedefchar*HuffmanCode;
//动态分配数组,存储哈夫曼编码
//选择两个parent为0,且weight最小的结点s1和s2
voidSelect(HuffmanTree*ht,intn,int*s1,int*s2)
inti,min;
for(i=1;
i<
=n;
i++)
{
if((*ht)[i].parent==0)
{
min=i;
break;
}
}
if((*ht)[i].parent==0)
{
if((*ht)[i].weight<
(*ht)[min].weight)
min=i;
}
*s1=min;
if((*ht)[i].parent==0&
&
i!
=(*s1))
break;
(*ht)[min].weight)
min=i;
*s2=min;
}
//构造哈夫曼树ht,w存放已知的n个权值
voidCrtHuffmanTree(HuffmanTree*ht,int*w,intn)
intm,i,s1,s2;
m=2*n-1;
//总共的结点数
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
i++)//1--n号存放叶子结点,初始化
(*ht)[i].weight=w[i];
(*ht)[i].LChild=0;
(*ht)[i].parent=0;
(*ht)[i].RChild=0;
for(i=n+1;
=m;
i++)//非叶子结点的初始化
(*ht)[i].weight=0;
}
printf("
\n哈夫曼树为:
\n"
);
i++)//创建非叶子结点,建哈夫曼树
{//在(*ht)[1]~(*ht)[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给s1、s2
Select(ht,i-1,&
s1,&
s2);
(*ht)[s1].parent=i;
(*ht)[s2].parent=i;
(*ht)[i].LChild=s1;
(*ht)[i].RChild=s2;
(*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;
printf("
%d(%d,%d)\n"
(*ht)[i].weight,(*ht)[s1].weight,(*ht)[s2].weight);
\n"
}
//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码
voidCrtHuffmanCode(HuffmanTree*ht,HuffmanCode*hc,intn)
char*cd;
//定义的存放编码的空间
inta[100];
inti,start,p,w=0;
unsignedintc;
hc=(HuffmanCode*)malloc((n+1)*sizeof(char*));
//分配n个编码的头指针
cd=(char*)malloc(n*sizeof(char));
//分配求当前编码的工作空间
cd[n-1]='
\0'
;
//从右向左逐位存放编码,首先存放编码结束符
i++)//求n个叶子结点对应的哈夫曼编码
a[i]=0;
start=n-1;
//起始指针位置在最右边
for(c=i,p=(*ht)[i].parent;
p!
=0;
c=p,p=(*ht)[p].parent)//从叶子到根结点求编码
{
if((*ht)[p].LChild==c)
cd[--start]='
1'
//左分支标1
a[i]++;
else
0'
//右分支标0
}
hc[i]=(char*)malloc((n-start)*sizeof(char));
//为第i个编码分配空间
strcpy(hc[i],&
cd[start]);
//将cd复制编码到hc
free(cd);
printf("
权值为%d的哈夫曼编码为:
%s\n"
(*ht)[i].weight,hc[i]);
w+=(*ht)[i].weight*a[i];
带权路径为:
%d\n"
w);
voidmain()
HuffmanTreeHT;
HuffmanCodeHC;
int*w,i,n,wei;
**哈夫曼编码**\n"
);
请输入结点个数:
"
scanf("
%d"
&
n);
w=(int*)malloc((n+1)*sizeof(int));
\n输入这%d个元素的权值:
n);
{
%d:
"
i);
fflush(stdin);
scanf("
wei);
w[i]=wei;
CrtHuffmanTree(&
HT,w,n);
CrtHuffmanCode(&
HT,&
HC,n);
实验结果
实验体会
哈夫曼编码算法:
每次将集合中两个权值最小的二叉树合并成一棵新二叉树,n-1次合并后,成为最终的一棵哈夫曼树。
这既是贪心法的思想:
从某一个最初状态出发,根据当前的局部最优策略,以满足约束方程为条件,以使目标函数最快(或最慢)为原则,在候选集合中进行一系列的选择,以便尽快构成问题的可行解。
每次选择两个权值最小的二叉树时,规定了较小的为左子树。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 哈夫曼 编码 贪心 算法 设计