数据压缩技术论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

霍夫曼编码

摘要

在现代社会,通信的发展,使得现代社会更加丰富多彩,我们可以随时随地在任何地方了解到世界各地的信息,而这又必须依赖信息的传递。在信息化高度发达的当今社会,我们必须对信息的传递有着较高的要求,我们希望信息在传递的过程中,能够保持节省性和保密性和无损性,而著名的霍夫曼编码就能够达到这样的要求。因此研究霍夫曼编码对信息的压缩和解压就时相当有必要的,我们用C++对霍夫曼编码给出简单的算法以实现对文件的压缩和解压。

【关键词】霍夫曼编码压缩解压C++

Abstract

In the modern society, communication development makes the modern society more rich and colorful, we can at any time anywhere in any place to all over the world know the information, which must be dependent on the information transfer. In the information highly developed in today's society, we must have the information transfer has a higher request, we hope that in the process of information transmission, can maintain save sex and confidentiality and nondestructive sex, and famous Huffman coding can achieve such requirement. So the Huffman coding information to compression and decompression is quite necessary when, we use c + + to Huffman coding give simple algorithm for document to realize the compression and decompression.

Keywords: Huffman coding compression decompression C + +

【引言】

霍夫曼编码(Huffman Coding)是一种编码方式,霍夫曼编码是可变字长编码(VLC)的一种。uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。

霍夫曼编码原理:

霍夫曼编码的基本思想:输入一个待编码的串,首先统计串中各字符出现的次数,称之为频次,假设统计频次的数组为count[],则霍夫曼编码每次找出count 数组中的值最小的两个分别作为左右孩子,建立他们的父节点,循环这个操作2*n-1-n(n是不同的字符数)次,这样就把霍夫曼树建好了。建树的过程需要注意,首先把count数组里面的n个值初始化为霍夫曼树的n个叶子节点,他们的孩子节点的标号初始化为-1,父节点初始化为他本身的标号。接下来是编码,每次从霍夫曼树的叶子节点出发,依次向上找,假设当前的节点标号是i,那么他的父节点必然是myHuffmantree[i].parent,如果i是myHuffmantree[i].parent的左节点,则该节点的路径为0,如果是右节点,则该节点的路径为1。当向上找到一个节点,他的父节点标号就是他本身,就停止(说明该节点已经是根节点)。还有一个需要注意的地方:在查找当前权值最小的两个节点时,那些父节点不是他本身的节点不能考虑进去,因为这些节点已经被处理过了。

霍夫曼树:

下面是字符串agdfaghdabsb的霍夫曼编码的霍夫曼树:

字符串:agdfaghdabsb

出现的字符字符出现的次数

a 3

g 2

d 2

f 1

h 1

b 2

s 1

合计12

由上面的霍夫曼树可知各个字符的编码如下:

a: 01

b:010

d:011

f:100

g:101

h:110

s:111

所以整个串的编码为:

011010111000110111001101010111010

霍夫曼译码原理:

对于霍夫曼的译码,可以肯定的是其译码结果是唯一的。

证明:因为霍夫曼编码是根据霍夫曼树来确定的,霍夫曼树是一棵二叉树,编码的时候是从树根一直往下走,直到走到叶子节点为止,在其经过的路径上,如果是树的左子树则为0,否则为1。因为每一次都要走到树的叶子节点,多以不可能存在两个编码a和b,使得a是b的前缀或者b是a的前缀。所以编码一定可以唯一确定。

根据上面的结论,我们可以很清楚地直到译码的方法:

定义两个指针p1,p2,P1指向当前编码的开始位置,P2指向当前编码的位置,如果P1-P2这一段编码能在编码库里面找到完全对应的编码结果,则译码成功,该段编码的译码结果就是与编码库里完全对应的编码的字符。循环次操作,直到译码结束!

例子:

假设有一段字符含有a,,c,d三个字符,经过编码之后三个字符对应的编码结果分别为:

a:01

c:010

d:011

现在给你一段编码0110101,要求将其译码!

按照上面介绍的方法我们可以知道:

编码的前三个字符是且仅是d的编码,所以011译码为d,依次译码可得整串的译码结果为daa

霍夫曼编码源代码:

#include

#include

#include

#include

using namespace std;

#define INF 0x7fffffff //无穷大

struct Huffmantree //霍夫曼树的节点

{

int weight;

相关文档
最新文档