《哈夫曼树编码译码课程设计报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼树编码译码课程设计报告.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、(封面)XXXXXXX 学院目:哈夫曼树编码译码设计报告院(系):专业班级:学生姓名:指导老师:时 间:的”字宁含一编码侧应表也必须发送过去,不然对方是不知道怎么解 码的。对给出的一串编码,从左向右,将编码组合起来并查表.2、算法流程图动态分配内存,声明哈夫曼树HT,并对其值进行初始建哈夫曼树,依次在HTL.i-l中Select parent 为 0 且 weight 最小的两分配n个字符编码的头指针向量和求编码的工作从叶子到根逆向逐个字符求哈夫曼编码释放工作空结束六、程序测试与实现1、函数之间的调用关系Void mainCreatHuffmanTreeEncodeDecode2、主程序int
2、 main(void)char *ch;int *w, n, i ;cout 输入字符集中字符的个数:endl;cinn;ch=new char n;w=new intn;cout 输入字符集中的字符: Gendl;for(i=0;ichi;cout 输入字符集中的字符的权值:endl;for(i=0;iwi;HuffmanTree hmTree(ch, w, n);string strText,strCode;cout请输入要编码的字符串;cinstrText;cout 文本串 strText. c_str () 编码为:;for (int pos = 0; pos strText. len
3、gth(); pos+) (string strTmp = hmTree. Encode(strTextpos);cout strTmp. c_str ();)cout strCode;cout 编码串 strCode. c_str () 来表示P所指的变量,又由于结点类型是一个结构类型, 因此可用P- data和p-next分别表示结点的数据域变量和指 针域变量。指针变量的值要么为空(NULL),不指向任何结点;要 么其值为非空,即它的值是一个结点的存储地址。注意,当P为 空值时,则它不指向任何结点,此时不能通过P来访问结点,否 则会引起程序错误。八、心得体会摘要哈夫曼编/译器设计:利用哈夫
4、曼编码进行通信可以大大提高信道利用率, 缩短信息传输时间,降低传输成本。但是,这要求这发送端通过一个编码系统对 待传数据预先编码,在发送端将传来的数据进行译码(复原)。对于双工信道。 每端都需要一个完整的编译码系统。本程序将为这样的信息收发站写一个哈夫曼 的编译码系统。哈夫曼编码/译码程序运行步骤:字查找,从英文文章中识别出字符,并把字符插入到一棵二叉排序树中。 哈夫曼树中序遍历,是为了把英文文章中的不重复的字符保存起来。哈夫曼编码,在已经构造好的霍夫曼树中从每个叶子结点出发追溯到树根, 逆向找出霍夫曼树中叶子结点的编码,规定:树中每个结点的左分支标上0,右 分支标上lo哈夫曼译码利用霍夫曼树
5、实现对产生的编码文件的译码,译码过程为:从根 结点出发,按二进制位串的0或1进入左分支或右分支,当到达叶子结点时译出 该叶子对应的单词或标点符号,若该编码文件尚未结束,则回到根结点继续进行 上述过程。运行环境:windows XP语言环境: 简体中文软件大小:51 KB编写工 具:Microsoft Visual studio 2008AbstractInformation : Huffman coding used in communication can greatly improve the channel utilization, reduced transmission time,
6、and lower transmission costs. However, this requires that the sender through a coding system for pre-treatment data-coding, the transmitter will be sent for decoding data (recovery). For dual-channel. Each side needs a complete encryption system. This procedure will this information hubs Huffman was
7、 one of the encryption system.Hoffmann code for coding procedures to run the steps and :word from english in the words and punctuation marks; and insert the words, and punctuation marks a second sort of a tree, the traversal order hoffmann, to english articles do not repeat the words and punctuation
8、 marks.Hoffmann tree in order to traverse; keep the code has been constructed in hoffmann good hafman tree leaves from the start dates back to tabulate the roots;Hoffmann decoding;hafman the implementation of the code to the coding, coding procedures for : from start to tabulate the roots of binary
9、of 0 or 1 to the left or right, a subdivision of a branch is to tabulate the leaves of the leaves translate the words or punctuation marks, if the code file is not finished but is to tabulate the process of continuing, all the code, coding procedures are in the file.一、问题描述4二、需求分析4三、概要设计5四、数据结构设计五、算法
10、设计7六、程序测试与实现91212七、调试分析 八、心得体会 一、问题描述1、题目内容:利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传 输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对 待传数据预先编码,在接收端将传来的数据进行译码(复原)。试写 一个哈夫曼编/译码系统。2、基本要求:一个完整的系统应具有以下功能:(1)初始化。从终端读入字符集大小n,以及n个字符和n个权值, 建立哈夫曼树,并将它存于文件中。(2)编码。利用已建好的哈夫曼树对文件中的正文进行编码,然后 将结果存入文件中。(3)译码。利用已建好的哈夫曼树将文件中的代码进行译码,结果 存入文件中。(4)完
11、成数据测试,要求编码字符不低于15个,编码文件的长度不 低于50个字符。(5)计算平均编码长度。二、需求分析一个完整的系统应具有以下功能:1、 初始化(Initialization)。从终端读入字符集大小n,以及n个 字符和n个权值,建立赫夫曼树。对赫夫曼树初始化。根据书本算法,对树进行从叶子到根的逆向求每个字符的赫 夫曼编码。更新赫夫曼树。2、 编码(Encoding)。利用已建好的哈夫曼树正文进行编码。将终端输入须要编码的语句逐字在已建好的赫夫曼树中查 找。当在树中找到相匹配字符时,将该字符对应的赫夫曼编码同 意保存。最后将数组中的编码在终端输出。3、 译码(Decoding)。利用已建好
12、的哈夫曼树将文件中的代码进行译码。获取须要译码的编码组。将编码逐一读入,并在赫夫曼中根据左0右1去查找 字符。将译好的语句在终端输出。三、概要设计操作集合:void Select (int cur, int &rl, int &r2) ; nodes 1 cur中选择双亲为,权值最小的两个结点rl, r2void CreatHuffmanTree(char ch, int w, int n);public:HuffmanTree(char ch, int w, int n);由字符,权值和字符个数构造哈夫曼树virtual HuffmanTree ();析构函数string Encode (c
13、har ch);编码LinkList Decode (string strCode); 译码本程序主要用到了三个算法。(1)哈夫曼编码;在初始化过程中间,要用输入的字符和权值建立哈夫曼树并求得 哈夫曼编码。先将输入的字符和权值存放到一个结构体数组中,建立 哈夫曼树,将计算所得的哈夫曼编码存储到另一个结构体数组中。(2)串的匹配;在编码过程中间,要对已经编码过的代码译码,可利用循环,将 代码中的与哈夫曼编码的长度相同的串与这个哈夫曼编码比较,如果 相等就回显。(3)二叉树的遍历在印哈夫曼树(T)的中,因为哈夫曼树也是二叉树,所以就要利 用二叉树的先序遍历将哈夫曼树输出。四、数据结构设计struc
14、t Node char data; /节点数据域为字符型Node *next;Node () next = NULL;Node(char item, Node *link = NULL) data = item; next = link;)struct HuffmanTreeNode(int weight;unsigned int parent, leftChild, rightChild; / 双亲,左右孩 子域HuffmanTreeNode();HuffmanTreeNode(int w, int p = 0, int 1 Child = 0, int rChild =0);五、算法设计1
15、、算法分析(必须要用语言进行描述) 构造树:初始化:每个字符就是一个结点,字符的频度就是结点的权:1、将结点按频度从小到大排序;2、选取频度最小的两个结点,以它们为儿子,构造出一个新的结占, 八、,新结点的权值就是它两个儿子的权值之和;构造之后,从原来的结点序列里删除刚才选出的那两个结点,但同时将新生成的结点加进去;3、如果结点序列里只剩下一个结点,表示构造完毕,退出。否则回到第一步。编码:编码:可以假定,对某个结点而言,其左孩子在当前阶段的编码为0,右孩子的编码为1。这样就可以通过”树的遍历”的方式来生成字长一编码对照表来到这里,基本上艰苦的已经完成了,对某个具体的字符串编码和解码就只是简单的“查表一替换”的工作了。解码:解码也是个简单的查表、替换过程。如果利用该种编码发送字符串,则它