哈夫曼编码 贪心算法
淮海工学院计算机工程学院
实验报告书
课程名: 《算法分析与设计》 题 目: 实验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
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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




