哈夫曼编码译码器课程设计(2)

2019-03-16 16:00

1.设计背景

1.1哈夫曼树的介绍

Huffman Tree,中文名是哈夫曼树或霍夫曼树或者赫夫曼树,它是最优二叉树。 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 (01) 路径和路径长度

定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 (02)结点的权及带权路径长度

定义:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 (03) 树的带权路径长度

定义:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

1.2设计的作用、目的

通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过课程设计各环节的实践,应达到如下要求:

1.理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2.根据哈夫曼编码算法,考虑一个有多种可能符号(各种符号发生的概率不同)的信源,得到哈夫曼编码和码树; 3.掌握哈夫曼编码的优缺点;

1

4.通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。

1.3设计任务及要求

1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;

3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;

2.设计方案

2.1实验内容

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,哈夫曼树的构造规则为:

1.将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

2. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和; 3. 从森林中删除选取的两棵树,并将新树加入森林;

4. 重复(02)、(03)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

2.2操作思路

以{5,6,7,8,15}为例,来构造一棵哈夫曼树。

第1步:创建森林,森林包括5棵树,这5棵树的权值分别是5,6,7,8,15。 第2步:在森林中,选择根节点权值最小的两棵树(5和6)来进行合并,将它们作为一颗新树的左右孩子(谁左谁右无关紧要,这里,我们选择较小的作为左孩子),并且新树

2

的权值是左右孩子的权值之和。即,新树的权值是11。 然后,将\树5\和\树6\从森林中删除,并将新的树(树11)添加到森林中。

第3步:在森林中,选择根节点权值最小的两棵树(7和8)来进行合并。得到的新树的权值是15。 然后,将\树7\和\树8\从森林中删除,并将新的树(树15)添加到森林中。 第4步:在森林中,选择根节点权值最小的两棵树(11和15)来进行合并。得到的新树的权值是26。 然后,将\树11\和\树15\从森林中删除,并将新的树(树26)添加到森林中。

第5步:在森林中,选择根节点权值最小的两棵树(15和26)来进行合并。得到的新树的权值是41。 然后,将\树15\和\树26\从森林中删除,并将新的树(树41)添加到森林中。

此时,森林中只有一棵树(树41)。这棵树就是我们需要的哈夫曼树!

3. 方案实施

3.1 C语言编程

#include #include #include

#define MAX 99999 #define N 27 //定义最多节点个数 #define M 2*N - 1 //中间节点个数

typedefstruct { int weight; int parent; intLChild; intRChild;

}HTNode,HuffmanTree[M+1];//因为零号单元不使用

typedefchar*HuffmanCode[N+1];

HuffmanCode co;//创建全局变量用于储存HuffmanCode char CH[N];

int weight[N] ={64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};

3

HuffmanTreeht;

char word[30];//全局变量用于储存键入的内容 voidInit_CH() { inti; CH[26] =' '; CH[0] ='A'; for(i=1;i<26;i++) CH[i] ='A'+i; for(i=0;i<27;i++) printf(\,CH[i]); }

void select(int*sr,int*sl,int n) { inti,point; point= MAX; for(i=0;i

voidInitHuffmanCode() { inti,sr,sl; for(i=1;i<=N;i++) { ht[i].weight = weight[i-1]; ht[i].parent = 0; ht[i].LChild= 0;

4

ht[i].RChild= 0; } for(i=N+1;i<=M;i++) { ht[i].weight = 0; ht[i].parent = 0; ht[i].LChild= 0; ht[i].RChild= 0; } printf(\初始化完成------\\n\); for(i=N+1;i<=M;i++) { select(&sr,&sl,i-1); ht[i].weight =ht[sr].weight +ht[sl].weight; ht[sr].parent =i; ht[sl].parent =i; ht[i].LChild=sr; ht[i].RChild=sl; } for(i=1;i<=M;i++) { printf(\,ht[i].parent,i); } }

voidCreateHuffmanCode() { FILE *trans; inti,start,p,c; char*cd; cd= (char*)malloc(N*sizeof(char)); cd[N-1] ='\\0'; for(i=1;i<=N;i++) { start= N-1; c =i; p =ht[i].parent; while(p) { --start; if(ht[p].LChild== c) cd[start] ='0'; else cd[start] ='1'; c = p;

5


哈夫曼编码译码器课程设计(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2014复旦大学行政学考研真题与答案解析

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: