教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

哈夫曼编码 贪心算法

来源:网络收集 时间:2026-07-27
导读: 淮海工学院计算机工程学院 实验报告书 课程名: 《算法分析与设计》 题 目: 实验3 贪心算法 哈夫曼编码 班 级: 软件081班 学 号: 110831116 姓 名: 陈点点 评语: 成绩: 指导教师: 批阅时间: 年 月 日 《 算法分析与设计》实验报告 - 1 - 实验3 贪心

淮海工学院计算机工程学院

实验报告书

课程名: 《算法分析与设计》 题 目: 实验3 贪心算法

哈夫曼编码

班 级: 软件081班 学 号: 110831116 姓 名: 陈点点

评语: 成绩: 指导教师: 批阅时间: 年 月 日 《 算法分析与设计》实验报告 - 1 -

实验3 贪心算法

实验目的和要求

(1)了解前缀编码的概念,理解数据压缩的基本方法; (2)掌握最优子结构性质的证明方法; (3)掌握贪心法的设计思想并能熟练运用 (4)证明哈夫曼树满足最优子结构性质; (5)设计贪心算法求解哈夫曼编码方案; (6)设计测试数据,写出程序文档。 实验内容

a 设需要编码的字符集为{d1, d2, …, dn},它们出现的频率为 ? 应用k{w1, w2, …, wn},

jk?i哈夫曼树构造最短的不等长编码方案。 实验环境

Turbo C 或VC++ 实验学时

2学时,必做实验 数据结构与算法

typedef char *HuffmanCode; //动态分配数组,存储哈夫曼编码

typedef struct {

unsigned int weight; //用来存放各个结点的权值

unsigned int parent,LChild,RChild; //指向双亲、孩子结点的指针 } HTNode, *HuffmanTree; //动态分配数组,存储哈夫曼树

核心源代码

#include #include #include

typedef struct {

unsigned int weight; //用来存放各个结点的权值

unsigned int parent,LChild,RChild; //指向双亲、孩子结点的指针 } HTNode, *HuffmanTree; //动态分配数组,存储哈夫曼树

typedef char *HuffmanCode; //动态分配数组,存储哈夫曼编码

//选择两个parent为0,且weight最小的结点s1和s2 void Select(HuffmanTree *ht,int n,int *s1,int *s2)

《 算法分析与设计》实验报告 - 2 -

{

int i,min;

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

if((*ht)[i].parent==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;

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; }

//构造哈夫曼树ht,w存放已知的n个权值

void CrtHuffmanTree(HuffmanTree *ht,int *w,int n) {

int m,i,s1,s2;

m=2*n-1; //总共的结点数

*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(i=1; i<=n; i++) //1--n号存放叶子结点,初始化

《 算法分析与设计》实验报告 - 3 -

{

(*ht)[i].weight=w[i]; (*ht)[i].LChild=0; (*ht)[i].parent=0; (*ht)[i].RChild=0; }

for(i=n+1; i<=m; i++) //非叶子结点的初始化 {

(*ht)[i].weight=0; (*ht)[i].LChild=0; (*ht)[i].parent=0; (*ht)[i].RChild=0; }

printf(\哈夫曼树为: \\n\

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

printf(\}

//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码

void CrtHuffmanCode(HuffmanTree *ht, HuffmanCode *hc, int n) {

char *cd; //定义的存放编码的空间 int a[100];

int i,start,p,w=0; unsigned int c;

hc=(HuffmanCode *)malloc((n+1)*sizeof(char *)); //分配n个编码的头指针 cd=(char *)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1]='\\0'; //从右向左逐位存放编码,首先存放编码结束符

for(i=1; i<=n; i++) //求n个叶子结点对应的哈夫曼编码 {

a[i]=0;

start=n-1; //起始指针位置在最右边

《 算法分析与设计》实验报告 - 4 -

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 {

cd[--start]='0'; //右分支标0 a[i]++; } }

hc[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个编码分配空间 strcpy(hc[i],&cd[start]); //将cd复制编码到hc }

free(cd);

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

printf(\权值为%d的哈夫曼编码为:%s\\n\ for(i=1; i<=n; i++)

w+=(*ht)[i].weight*a[i]; printf(\带权路径为:%d\\n\ }

void main() {

HuffmanTree HT; HuffmanCode HC; int *w,i,n,wei;

printf(\哈夫曼编码**\\n\ printf(\请输入结点个数:\ scanf(\

w=(int *)malloc((n+1)*sizeof(int)); printf(\输入这%d个元素的权值:\\n\

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

printf(\ fflush(stdin); scanf(\ w[i]=wei; }

CrtHuffmanTree(&HT,w,n);

…… 此处隐藏:956字,全部文档内容请下载后查看。喜欢就下载吧 ……
哈夫曼编码 贪心算法.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/443110.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)