Aimd's Blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

数据压缩当然包括所有数据的压缩,但是所有数据都用字符表示,比如图像、文本等。所以本文讲如何对一个字符串进行压缩,可以在这个基础上对所有数据进行压缩处理。
      把一个字符串进行压缩,并可以恢复,我们就把它理解为把一个字符串变短,并且这个短的字符串可以恢复回原来的串。这里有一个典型的方法,比如aaaaabbbbb用5a5b(5个a,5个b)表示就达到了压缩的目的,这里讲一个更通用的方法,不处理子串,对每一个字符进行压缩编码。
      假设要压缩字符串str,str的每一字符占8位,如果我们能用少于8位的01编码来表示每一个出现的字符,那么总长度就回变小,再如果这个编码是前缀编码(任意一个的编码都不是另一个编码的前缀),那么我们就可以把这个编码的01串恢复到原来的字符串。
      假定一个字符串中只含有a、b、c、d四个字符,他们在字符串中出现的个数为1000、100、10、1,很明显经编码压缩后的串长度为1000*a编码长+100*b编码长+10*c编码长+1*d编码长,从中我们知道,把这个式子最小化就得到了正确的编码,huffman编码完全满足要求,并满足前缀编码。
      此问题的huffman树(具体如何构造不介绍,任意数据结构的书都有):

      从中可以看到每个字符的编码:a 0,b 10,c 111,d 110。
      压缩后的长度变为1000*1 + 100*2 + 10*3 + 3,明显变短,并且可以恢复。
      此方法对长文本会有好的压缩比例,但是对短的就未必了。
      每一个字符占8位,当这个字符的编码达到8位时,叶子节点的个数足够表示文本的内容了。

posted on 2006-05-17 17:40  Aimd  阅读(1253)  评论(3编辑  收藏  举报