自适应huffman压缩码的生成_第1页
自适应huffman压缩码的生成_第2页
自适应huffman压缩码的生成_第3页
自适应huffman压缩码的生成_第4页
自适应huffman压缩码的生成_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 / 13自适应压缩码的生成摘要:随着现代社会信息量的增加,对数据进行压缩越来越有它的必要性。其中,Huffman 编码作为一种高效的数据编码方法在文本、图象、音频等压缩有着广泛的应用。中,笔者根据 Huffman 编码的原理,实现对文本进行压缩与解压的功能。 关键词:Huffman 编码;数据压缩;解压;文本;自适应编码 Huffman 编码压缩是一种无损压缩技术。利用Huffman 编码原理进行压缩的主要问题包括压缩的算法设计及程序实现、解压算法及程序实现。 一、Huffman 编码介绍 2 / 13Huffman 于 1952 年提出一种编码的方法,它完全依据字符出现概率来构造平均长度最短的编码,有时称之为最佳编码,一般叫做 Huffman 编码。它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。 二、自适应 Huffman 编码原理 基于静态 Huffman 编码算法对输入的符号流进行编码,必须进行两次扫描,第一次扫描统计字符出现的概率,并创建 Huffman 树;第二次扫描是按照 Huffman 树的字符进行编码。并且在存储和传输 Huffman 编码时,必须先存储和传送 Huffman 树。这些问题使的静态 Huffman 编码在实际应用用的的较少。为了解决静态 Huffman 编码的缺点,产生了自适应 Huffman 编码,它只需要对输入的符号流进行一次扫描即可。它不仅涉及到编码树的构造过程,还与3 / 13编码和解码有关。 自适应 Huffman 编码过程 初始化 Huffman 树 对每个输入符号 对符号编码; 更新 Huffman 树; 初始化 Huffman 树时,由于对字符流进行一次扫描,因此,不能预先知道各字符的概率,为了对所以字符一致对待,在这里使用符号为 NYT,权值为 0 作为初始的Huffman 树。NYT 不同于任何一个将要传送的符号,在这里作为一个逸出码。NYT 有两种作用:一是在编码时,当有一个还没在编码树出现的字符需要编码时,系统就输出 NYT编码,然后跟着字符的原始表达;在解码时,当解码器读出 NYT 时,就知道下面的内容暂不是 Huffman 编码,而是4 / 13一个从没在编码数据流出现的原始字符;二是作为新字符的插入点,在需要插入一个新字符时,总是构造一个新子树,子树包括 NYT 符号和新符号两个叶结点,然后将旧的NYT 结点用新子树代替,并使原 NYT 和新符号结点的权值赋一。对符号编码与静态的一样。在每次编码完成之后,需要试图对包含的结点进行权值加一操作,为此在这里需要介绍两个概念:结点编号和所属块。结点编号是一个全局唯一的的值,不同的结点有不同的结点编号,它具有如下特性: (一)权值越大的结点,结点编号越大。 (二)父结点的编号总是大于子结点的编号。 以上两点称为兄弟属性,在每次调整结点权值时,都需要调整结点的编号,以避免兄弟属性破坏。在本课程设计中用数组来表示结点编号,根结点在数组的最大位置。所属块指权值相同的一组结点。在对每个结点进行权值加一时,首先检查该结点是否是所在块的最大结点,如果不是,将该结点与所在块的最大结点交换位置,在对该结点的权值加一,这样保证了结点的兄弟属性,由于结点的权值发生变化,必须递归对结点的夫结点执行加一操作。 5 / 13三、自适应 Huffman 压缩编码算法 判断字符在文本中是否出现 由于自适应 Huffman 编码只对字符流扫描一次,因此,就需要判断该字符在前面的字符流是否出现过。 判断该字符是否是所属块的最大结点 为了保证其兄弟属性不破坏,在进行加一操作时,必须判断该结点是否是所属快的最大结点,不是就必须交换当前结点与最大结点。 交换当前结点与所属块的最大结点 当 HighInBlock 函数返回的不是-1 就必须交换当前6 / 13结点与所属块的最大结点,保证兄弟属性。 对当前字符进行编码 从输入流中得到一个字符,若以前出现过该字符,则对该字符进行编码,并判断该字符是否是所属块的最大结点,否就交换当前结点与最大结点;若以前没有出现该字符,则生成两个结点,一个结点用于保存该字符,另一个用做逸出码结点 NYT,并这两个结点的父结点为原逸出码结点 NYT,输出逸出码及原字符。在这里我们用了 code 这个结构来保存一个字符的编码。 程序流程过程如下: 1、从字符输入流中,取出一个字符; 2、判断该字符以前是否出现过? 3、否,用新的 NYT 及字符结点代替原 NYT,输出逸出码及原字符,并使原 NYT 及字符结点的权值赋为一,改变当前结点为原 NYT 结点; 7 / 134、是,输出该字符的编码,判断该字符是否是所属块的最大结点?否,交换该字符结点与最大结点,改变当前结点为最大结点,并是当前结点的权值加一。 更新 Huffman 树结构 当从输入流中取出一个字符并对其编码后,Huffman树的权值发生了变化,这就要更新 Huffman 树,在程序实现上用了变量 newplace 保存了需要更新结点权值的位置,当该结点不是根结点就递归是其父结点的权值加一。 程序流程如下: 1、当前结点是否为根结点?是,结束;否,转 2; 2、改变当前结点为其父结点; 3、判断该结点是所属块的最大结点?是,转 4;否,交换当前结点与最大结点; 4、当前结点的权值加一,转 1。 8 / 13四、对输入字符流进行压缩 对字符进行压缩,实际上对字符编码和更新 Huffman树的过程。 程序流程如下: 初始化 Huffman 树; 是否遇到结束符0 ,否,转 3;否则就结束; 对字符进行编码; 更新 Huffman 树; 读下一个字符,转2。voidCAdaptiveHuffman:OnCompress() 9 / 13 /原文本编辑框的内容赋给 sAdapOriginalText GetDlgItemText(IDC_Adap_OriginalText,sAdapOriginalText); charm_sAdapOriginalText32767; /sAdapOriginalText 的内容赋给m_sAdapOriginalText strcpy(m_sAdapOriginalText,(LPSTR)(LPCTSTR)sAdapOriginalText); intC=0; charch; ch=m_sAdapOriginalTextC; 10 / 13(); InitHuffman();/初始化 Huffman 树 while(ch!=0)/判断文本是否结束 Encode(ch);/对字符 ch 编码 UpdateTree();更新 Huffman 树 C+; ch=m_sAdapOriginalTextC; SetDlgItemText(IDC_Adap_CompressText,adapstr);/在二进制编辑框显示压缩流 11 / 13Huffman_Information(); SetDlgItemText(IDC_Adap_Information,information); CheckCompressButton=TRUE;/按下压缩按钮,把它赋为 TRUE CButton*pBtn; /屏蔽压缩按钮 pBtn=(CButton*)GetDlgItem(IDC_Compress); pBtn-EnableWindow(FALSE); /激活 Huffman 树按钮和解压按钮 pBtn=(CButton*)GetDlgItem(IDC_Decompress); 12 / 13pBtn-EnableWindow(TRUE); pBtn=(CButton*)GetDlgItem(IDC_HuffmanTree); pBtn-EnableWindow(TRUE); 五、自适应 Huffman 压缩效果分析 一个压缩器的好坏,取决于它的压缩参数值:主要包括压缩比、平均代码长度、熵、冗余度。 压缩比=输出流/输入流=(Length+chLength8)(p8)压缩比1,压缩器做无效的压缩;压缩比=1,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论