深入解析数据压缩算法

深入解析数据压缩算法

ID:26664030

大小:192.68 KB

页数:14页

时间:2018-11-28

深入解析数据压缩算法_第1页
深入解析数据压缩算法_第2页
深入解析数据压缩算法_第3页
深入解析数据压缩算法_第4页
深入解析数据压缩算法_第5页
资源描述:

《深入解析数据压缩算法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、深入解析数据压缩算法所谓数据压缩,是指在不丢失信息的前提下,缩减数据量以减少存储空间,提高传输、存储和处理效率的一种技术方法。或者是按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间。能实现数据压缩的本质原因就是数据的冗余性。本系列将分为上下两个部分,介绍四种数据压缩算法,分别为Huffman压缩算法、RLE压缩算法、LZW压缩算法、Rice压缩算法。其中本文将详解Huffman压缩算法和RLE压缩算法第一节Huffman压缩算法huffman压缩算法可以说是无损压缩中最优秀的算法。它使用预先二

2、进制描述来替换每个符号,长度由特殊符号出现的频率决定。其中出现次数比较多的符号需要很少的位来表示,而出现次数较少的符号则需要较多的位来表示。huffman压缩算法的原理:利用数据出现的次数构造Huffman二叉树,并且出现次数较多的数据在树的上层,出现次数较少的数据在树的下层。于是,我们就可以从根节点到每个数据的路径来进行编码并实现压缩。老办法,还是举个例子。假设有一个包含100000个字符的数据文件要压缩存储。各字符在该文件中的出现频度如下所示:在此,我会给出常规编码的方法和Huffman编码两种方法,

3、这便于我们比较。常规编码方法:我们为每个字符赋予一个三位的编码,于是有:此时,100000个字符进行编码需要100000*3=300000位。Huffman编码:利用字符出现的频度构造二叉树,构造二叉树的过程也就是编码的过程。这种情况下,对100000个字符编码需要:(45*1+(16+13+12+9)*3+(9+5)*4)*1000=224000孰好孰坏,例子说明了一切!好了,老规矩,下面我还是用上面的例子详细说明一下Huffman编码的过程。首先,我们需要统计出各个字符出现的次数,如下:接下来,我根据

4、各个字符出现的次数对它们进行排序,如下:好了,一切准备工作就绪。在上文我提到,huffman编码的过程其实就是构造一颗二叉树的过程,那么我将各个字符看成树中将要构造的各个节点,将字符出现的频度看成权值。Ok,有了这个思想,herewego!构造huffman编码二叉树规则:从小到大,从底向上,依次排开,逐步构造。首先,根据构造规则,我将各个字符看成构造树的节点,即有节点a、b、c、d、e、f。那么,我先将节点f和节点e合并,如下图:于是就有:经过排序处理得:接下来,将节点b和节点c也合并,则有:于是有:经

5、过排序处理得:第三步,将节点d和节点fe合并,得:于是有:继续,这次将节点fed和节点bc合并,得:于是有:最后,将节点a和节点bcfed合并,有:以上步骤就是huffman二叉树的构造过程,完整的树如下:二叉树成了,最后就剩下编码了,编码的规则为:左0右1于是根据编码规则得到我们最终想要的结果:从上图中我们得到各个字符编码后的编码位:Ok,过程清楚了,我们来看看核心代码:由于Huffman编码在以前的文章已经给出过,故在这只给出链接!Huffman编码:http://blog.csdn.net/feng

6、chaokobe/article/details/6969217好了,Huffman编码就讲完了。Goon!第二节RLE压缩算法RLE:Run-lengthEncoding,译为“行程长度编码”,它是一个无损压缩的非常简单的算法。RLE压缩算法的原理:统计某一节字节在整个字节表中出现的次数,并以该字节和出现的次数作为编码的依据。好了,光说理论解决不了问题,还是用例子来说明。现有如下一些字节数据:那么,首先我对上述每个数据出现次数做统计,即得到:ok,编码的依据得到了,万事俱备。由于RLE编码太简单了,于是

7、我们一步就得到编码的结果了。如下:编码的过程简单,代码的实现也就很容易了,下面我们看看核心代码:[cpp]viewplaincopyprint?1.char*REL_Coding(char*src_ch,intlength,char*dst_ch)2./***src_ch为原始字符串,3.***length为原始字符串的长度,4.***dst_ch为根据算法得到的编码5.***/6.{7.inti=0;8.intj=0;9.intcount=0;10.charp=src_ch[0];11.12.while

8、(i<=length)//开始编码13.{14.if(p==src_ch[i])//如果有重复,计算其重复的次数15.{16.i++;;17.count++;18.continue;19.}20.dst_ch[j]=p;21.dst_ch[++j]=(count+'0');22.j++;23.count=0;24.p=src_ch[i];//下一次比较的开始位置25.}26.27.returndst_ch;28.}char*R

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

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

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