实验三.哈夫曼编码的贪心算法设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

@

实验四 哈夫曼编码的贪心算法设计(4学时)

[实验目的]

1. 根据算法设计需要,掌握哈夫曼编码的二叉树结构表示方法;

2. 编程实现哈夫曼编译码器;

3. 掌握贪心算法的一般设计方法。

实验目的和要求

(1)了解前缀编码的概念,理解数据压缩的基本方法;

(2)掌握最优子结构性质的证明方法;

(3)掌握贪心法的设计思想并能熟练运用

(4)证明哈夫曼树满足最优子结构性质;

(5)设计贪心算法求解哈夫曼编码方案;

(6)设计测试数据,写出程序文档。

实验内容 设需要编码的字符集为{d 1, d 2, …, dn },它们出现的频率为 {

w 1, w 2, …, wn

},应用哈夫曼树构造最短的不等长编码方案。

核心源代码

~

#include <>

#include <>

#include <>

typedef struct

{

unsigned int weight; arent==0)

{

@

min=i;

break;

}

}

for(i=1; i<=n; i++)

{

if((*ht)[i].parent==0)

{

!

if((*ht)[i].weight<(*ht)[min].weight)

min=i;

}

}

*s1=min;

∑=j

i k k

a

for(i=1; i<=n; i++)

{

~

if((*ht)[i].parent==0 && i!=(*s1))

{

min=i;

break;

}

}

for(i=1; i<=n; i++)

{

%

if((*ht)[i].parent==0 && i!=(*s1))

{

if((*ht)[i].weight<(*ht)[min].weight)

min=i;

}

}

*s2=min;

}

-

eight=w[i];

(*ht)[i].LChild=0;

(*ht)[i].parent=0;

(*ht)[i].RChild=0;

}

for(i=n+1; i<=m; i++) eight=0;

(*ht)[i].LChild=0;

\

(*ht)[i].parent=0;

(*ht)[i].RChild=0;

}

printf("\n哈夫曼树为: \n");

for(i=n+1; i<=m; i++) arent=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); }

printf("\n");

}

>

arent; p!=0; c=p,p=(*ht)[p].parent) Child==c) {

cd[--start]='1'; eight,hc[i]);

for(i=1; i<=n; i++)

w+=(*ht)[i].weight*a[i];

printf(" 带权路径为:%d\n",w);

>

}

void main()

{

HuffmanTree HT;

HuffmanCode HC;

int *w,i,n,wei;

printf("**哈夫曼编码**\n" );

printf("请输入结点个数:" );

scanf("%d",&n);

w=(int *)malloc((n+1)*sizeof(int));

printf("\n输入这%d个元素的权值:\n",n);

for(i=1; i<=n; i++)

{

printf("%d: ",i);

fflush(stdin);

scanf("%d",&wei);

w[i]=wei;

}

CrtHuffmanTree(&HT,w,n);

CrtHuffmanCode(&HT,&HC,n);

}

实验结果

实验体会

哈夫曼编码算法:每次将集合中两个权值最小的二叉树合并成一棵新二叉树,n-1次合并后,成为最终的一棵哈夫曼树。这既是贪心法的思想:从某一个最初状态出发,根据当前的局部最优策略,以满足约束方程为条件,以使目标函数最快(或最慢)为原则,在候选集合中进行一系列的选择,以便尽快构成问题的可行解。

每次选择两个权值最小的二叉树时,规定了较小的为左子树。

相关文档
最新文档