第十周 项目一(4)哈夫曼编码的算法验证
/*
Copyright (c)2017,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:第十一周项目1 - 哈夫曼编码算法验证.cpp
作 者:孙仁圆
完成日期:2017年12月29日
版 本 号:v1.0 问题描述: 运行并重复测试教学内容中涉及的算法。改变测试数据进行重复测试的意义在于, 可以从更多角度体会算法,以达到逐渐掌握算法的程度。 使用你的测试数据,并展示测试结果,观察运行结果,以此来领会算法。
输入描述: 若干测试数据。
程序输出: 对应数据的输出。
*/ #include <stdio.h>
#include <string.h>
#define N 50 //叶子节点数
#define M 2*N-1 //树中节点总数 //哈夫曼树的节点结构类型 typedef struct
{ char data; //节点值 double weight; //权重 int parent; //双亲结点 int lchild; //左孩子结点 int rchild; //右孩子节点
}HTNode; //每个节点哈夫曼编码的结构类型 typedef struct
{ char cd[N]; //存放哈夫曼码 int start;
} HCode; //构造哈夫曼树
void CreateHT(HTNode ht[],int n)
{ int i,k,lnode,rnode; double min1,min2; for (i=0; i<2*n-1; i++) //所有结点的相关域置初值-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n; i<2*n-1; i++) //构造哈夫曼树 { min1=min2=32767; //lnode和rnode为最小权重的两个结点位置 lnode=rnode=-1; for (k=0; k<=i-1; k++) if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找 { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; ht[lnode].parent=i; ht[rnode].parent=i; }
} //实现哈夫曼编码
void CreateHCode(HTNode ht[],HCode hcd[],int n)
{ int i,f,c; HCode hc; for (i=0; i<n; i++) //根据哈夫曼树求哈夫曼编码 { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) //循序直到树根结点 { if (ht[f].lchild==c) //处理左孩子结点 hc.cd[hc.start--]='0'; else //处理右孩子结点 hc.cd[hc.start--]='1'; c=f; f=ht[f].parent; } hc.start++; //start指向哈夫曼编码最开始字符 hcd[i]=hc; }
} //输出哈夫曼编码
void DispHCode(HTNode ht[],HCode hcd[],int n)
{ int i,k; double sum=0,m=0; int j; printf(" 输出哈夫曼编码:\n"); //输出哈夫曼编码 for (i=0; i<n; i++) { j=0; printf(" %c:\t",ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c",hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; printf("\n"); } printf("\n 平均长度=%g\n",1.0*sum/m);
} int main()
{ int n=8,i; //n表示初始字符串的个数 char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1}; HTNode ht[M]; HCode hcd[N]; for (i=0; i<n; i++) { ht[i].data=str[i]; ht[i].weight=fnum[i]; } printf("\n"); CreateHT(ht,n); CreateHCode(ht,hcd,n); DispHCode(ht,hcd,n); printf("\n"); return 0;
}
第十周 项目一(4)哈夫曼编码的算法验证相关推荐
- C语言Huffman Encode霍夫曼编码的算法(附完整源码)
C语言Huffman Encode霍夫曼编码的算法 C语言Huffman Encode霍夫曼编码的算法完整源码(定义,实现,main函数测试) C语言Huffman Encode霍夫曼编码的算法完整源 ...
- C++实现huffman哈夫曼编码的算法(附完整源码)
C++实现huffman哈夫曼编码的算法 C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测试) C++实现huffman哈夫曼编码的算法完整源码(定义,实现,main函数测 ...
- 哈夫曼编码算法 c语言,《哈夫曼编码的算法》
以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...
- 第六周作业1——利用哈夫曼编码英文字母表
1. 哈夫曼编码.对教材P167中习题5.18,思考并完成问题a-d. 题目: 画出哈夫曼编码树如下: (a)这些字符的哈夫曼编码表如下: (b)每个字母的平均编码需要[5.70]=6位. (c)该值 ...
- 哈夫曼编码--贪心算法
哈夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法.1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于<一种构 ...
- 【算法学习笔记】哈夫曼树的构建和哈夫曼编码的实现代码
介绍 哈夫曼(Haffman)这种方法的基本思想如下: ①由给定的n个权值{W1,W2,-,Wn}构造n棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T1,T2,-,Tn}. ②在F中选取 ...
- 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc
哈夫曼编码的实现及应用论文 毕 业 设 计(论文) 题目 哈夫曼编码的实现 及应用 二级学院 数学与统计学院 专 业 信息与计算科学 班 级 学生姓名 张泽欣 学号 指导教师 职称 时 间 目录 摘要 ...
- 哈夫曼树(最优二叉树)、哈夫曼编码
在此祝大家新年快乐,新的一年守住头发,不断进步! 哈夫曼树 一.哈夫曼树基本概念 二.哈夫曼树的构造算法 三.哈夫曼构造算法的实现 四.哈夫曼编码 五.哈夫曼编码的算法实现 一.哈夫曼树基本概念 (1 ...
- 5.1 Python图像处理之图像编码-哈夫曼编码
5.1 Python图像处理之图像编码-哈夫曼编码 文章目录 5.1 Python图像处理之图像编码-哈夫曼编码 1 算法原理 2 代码 3 效果 1 算法原理 哈夫曼编码是一种根据词频变化的变长二进 ...
最新文章
- 太牛逼!一款软件几乎可以操作所有的数据库!
- visual studio 2005占用cpu100% -_-...
- DBA(六):MHA集群
- Java多线程面试准备:聊聊Executor框架
- Central Europe Regional Contest 2012 Problem c: Chemist’s vows
- 如何使用W5300实现ADSL连接(二)
- 文字不间断滚动(转)
- 按键精灵打卡怎么写_[按键精灵教程]过新手引导的各种姿势
- android 图片文字布局,Android自定义控件图片+文字布局
- 深入解读Docker底层技术cgroup系列(1)——cgroup介绍
- 报错:fdfs while reading from socket: (timed out))
- Ubuntu16.04 微信网页版安装
- 金蝶KIS专业版“登录时出现问题,请重新输入”终极解决全过程
- 微软Kinect for windows SDK 使用教程 (NUI部分)
- 低效程序员的9个坏习惯
- STM32F1主从定时器设置
- 【华为OD机试真题 JS】IPv4地址转换成整数
- word2016如何从指定页面设置页码
- Github无法访问的解决方法
- xp显示rpc服务器不可用,绿茶XP系统提示“RPC服务器不可用”如何解决