数据结构huffman编码作业报告

数据结构huffman编码作业报告

ID:38699929

大小:156.50 KB

页数:10页

时间:2019-06-17

数据结构huffman编码作业报告_第1页
数据结构huffman编码作业报告_第2页
数据结构huffman编码作业报告_第3页
数据结构huffman编码作业报告_第4页
数据结构huffman编码作业报告_第5页
资源描述:

《数据结构huffman编码作业报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、哈夫曼编码与解码一、设计思想在设计本程序时,主要用到的算法有如下三个:一、创建哈夫曼树算法;二、求哈夫曼编码算法;三、求哈夫曼解码算法。l创建哈夫曼树算法如下:1)存储结构:构造由信息元素与对应的权值组成的信息元素结构体来存储已给定的字母与其权重信息;构造由信息元素、权值、当前结点的父结点、左结点、右结点组成的哈夫曼树结点结构体来存储树结点的信息,还会很方便地帮助创建哈夫曼树;构造由信息元素与对应的哈夫曼编码结构体来存储哈夫曼编码信息;方便进行对数据的编码。2)结构体数组处理:哈夫曼树没有度为1的结点,若一个哈夫曼树由n个叶子结点,则该哈夫曼树共有2n-1

2、个结点。应用以上的原理,根据用户输入的信息元素的个数n开辟大小为2n-1的哈夫曼树数组来满足创建哈夫曼树的需要,并对此数组进行初始化,叶子结点的信息元素与权值即给定的的信息元素与权值;非叶子结点的信息元素与权值设置为空值;所有哈夫曼树结点的父结点、左结点、右结点设置为0。3)选择权值最小与次小:在进行比较的过程中循环取出权值进行比较,设置两个s1,s2分别记录本次循环最小与次小的权值,进行下一次的比较选择。返回权值最小与次小的哈夫曼树结点信息。4)生成小树:应用3)中想法,在用户输入的信息元素中选择权值中最小与次小的元素分别赋值给右叶子结点与左叶子结点,并

3、把这两个权值之和赋值给这两个结点的父结点,记录父结点位置。5)生成哈夫曼树:再应用3)4)把这些小树的父结点的权值进行比较选择,选择权值比较大的设置为新的右结点的权值,权值比较小的设置为左结点,把这两个权值的和赋值给新的父结点;以此重复进行,最终生成哈夫曼树。l求哈夫曼编码算法如下1)采用无栈非递归遍历哈夫曼树:每次站在根结点遍历哈夫曼树,直至到达某一个叶子结点为止,并临时用一个数组记录遍历过程中每个结点的状态。编码完成后再复制给哈夫曼编码结构体中的编码数组。2)-10-哈夫曼编码与解码遍历与编码:在逻辑上,遍历时向左子时,编码为0,向右子为1,将每次的结

4、点状态记录连接即哈夫曼编码;站在根结点上,若到左子上记录此时的结点状态为0,并把指针指向左子,进行下一次的遍历,若到右结点上记录此时的结点状态1,并把指针指向右子,进行下一次的判断遍历;重复进行,到达某一个叶子结点为止,完毕后,将每次遍历的结点状态标志进行连接组成临时状态数组;将此叶子结点的元素信息作为哈夫曼编码的信息元素,把遍历时的状态数组赋值给哈夫曼编码结构体的编码。由此,经遍历哈夫曼树所形成的哈夫曼编码数组就是通信中的简单码表。1)输出01编码:读入指定文件中的信息后要求输出01编码,在此过程中,要对每个字符进行扫描,并输出01编码。重复进行,每次都

5、无间隔输出,最后所形成的01串就是用户所需要的01编码信息。并将结果写入指定文件。l求哈夫曼解码算法:1)前提:哈夫曼解码是哈夫曼编码的逆运算,因此哈夫曼解码需要用哈夫曼编码时的哈夫曼树。2)哈夫曼解码:从文件中获得已进行编码的哈夫曼码,因为01编码串中仅0与1两种符号,当是1时去左子结点上,当是0时去右结点。在解码时,每次均需要站在根结点上,在对01码进行依次扫描时,遇到1就去左子结点,遇到0就去右结点,直至到达叶子结点上结束。再次站到根结点上,继续进行;每次到达结点上,就输出此结点上的信息元素,因为只有叶子结点上有信息元素,而其他结点上的信息元素为空值

6、,则在输出时,仅仅是所需要的明文信息。二、算法流程图下图为哈夫曼树的生成过程中的主要算法(如图1):图1生成哈夫曼树-10-哈夫曼编码与解码下面是哈夫曼编码过程的大致过程(如图2):图2为huffman树的各节点进行编码下面是对指定文件内信息编码的大致过程(如图3):图3信息的编码-10-哈夫曼编码与解码下面是对文件内信息解码码的大致过程(如图4):图4信息的解码三、源代码#include"stdio.h"#include"string.h"#include"stdlib.h"typedefstruct/*声明储存信息的结构体*/{charletter;/

7、*字母*/intweight;/*权值*/intparent;/*父节点*/intlchild;/*左子节点*/intrchild;/*右子节点*/}htnode,*huffmantree;typedefchar**huffmancode;voidselect(huffmantree&ht,inti,int&s1,int&s2)-10-哈夫曼编码与解码{intj,k;/*找出第一个单节点树*/for(k=1;k<=i;k++){if(ht[k].parent!=0){continue;}s1=k;break;}/*找出其中权重最小的树*/for(j=1;j

8、<=i;j++){if(ht[j].parent!=0){cont

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。