
哈夫曼编码压缩概念的基本思想?如何回答(精简的说)
哈夫码(Huffman Coding)是编码方哈夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
以哈夫曼树─即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称熵编码法),用于数据的无损耗压缩。
这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
这种方法是由David.A.Huffman发展起来的。
例如,在英文中,e的出现概率很高,而z的出现概率则最低。
当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。
用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。
二者相比,e使用了一般编码的1\\\/8的长度,z则使用了3倍多。
倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。
哈夫曼压缩编写的疑问,求助高手(C语言)
exe等二进制文件照样是可以压缩的。
普通文本和二进制文件差别通常只在于ASCII字符的高位的值。
哈夫曼数构造好了,就循环读取源文件,找到匹配的串,向输出文件输出对应的哈夫曼编码。
别忘了哈夫曼表也输出(在文件首、尾,或者其它可以方便定位的地方)。
关哈夫曼压缩问题的一点疑问
大神求解
哈夫曼压缩算法编码是无损压缩当中最好的方法。
它使用预先二进制描述来替换符号,长度由特殊符号出现的频率决定。
常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。
然而,它并不处理符号的顺序和重复或序号的序列。
哈夫曼压缩算法之原理 我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。
简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是∑NK =1符号数k, N是分之中符号的数量,符号数k是符号k出现的次数) 这棵树有两个目的: 1. 编码器使用这棵树来找到每个符号最优的表示方法 2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。
哈夫曼编码器生成哈夫曼树 压缩后的数据流是24位(三个字节),原来是80位(10个字节)。
当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。
这是相对较短的数据上的副作用。
对于大数据量来说,上面的哈夫曼树就不占太多比例了 最终的压缩数据流 解码的时候,从上到下遍历树,为压缩的流选择从左\\\/右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。
哈夫曼压缩算法之实现 哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。
这个实现的基本缺陷是: 1. 慢位流实现 2. 相当慢的解码(比编码慢) 3. 最大的树深度是32(编码器在任何超过32位大小的时候退出)。
如果我不是搞错的话,这是不可能的,除非输出的数据大于232字节。
另一方面,这个实现有几个优点: 1. 哈夫曼树以一个紧密的形式每个符号要求12位(对于8位的符号)的方式存储,这意味着最大的头为384。
2. 编码相当容易理解 哈夫曼编码在数据有噪音的情况(不是有规律的,例如RLE)下非常好,这中情况下大多数基于字典方式的编码器都有问题。
以上就是对哈夫曼压缩算法的简单介绍。
另外百度文库也有《哈夫曼压缩算法》你可以看参考资料 希望对您有帮助
c# winform用哈夫曼写的一个压缩工具,遇到了点困难,求助
我使用两种方法从zip文件中读取数据,第一种的代码是从“UTF开始”到“UTF结束”,看到有人()介绍过这种用法,但是我用的时候,出现java.io.UTFDateFormatException异常,我跟踪调试的时候,发现问题出现在读取的时候,写是可以的。
第二种的代码是从“int开始”到“int结束”,可以正确解压缩各种文件(二进制读取,应该也没问题的),但是速度很慢,请问各位大虾,有没有什么办法解决
代码如下: …… String doc=; zin = new ZipInputStream(new FileInputStream(待解压缩文件)); while(((entry = zin.getNextEntry()) != null)&&!entry.isDirectory()) { FileOutputStream fout = new FileOutputStream(解压缩后的文件名); DataOutputStream dout = new DataOutputStream(fout); DataInputStream in = new DataInputStream(zin); \\\/* \\\/\\\/UTF开始 doc=in.readUTF(); in.close(); dout.writeUTF(doc); dout.close(); \\\/\\\/UTF结束 *\\\/ \\\/\\\/int开始 int c; while((c = in.read()) != -1) dout.write(c); dout.close(); \\\/\\\/int结束 fout.close(); zin.closeEntry(); System.out.println(Close entry successful!); } zin.close(); ……
哈夫曼编码压缩概念的基本思想?如何回答(精简的说)
基于对待压缩数据中各符号出现频度的统计,采用变长编码的方法,使出现频率越高的符号拥有越短的编码长度,从而得到更短的总编码长度。



