zoukankan      html  css  js  c++  java
  • 贪婪技术之 huffman编码树

          不同于对字符使用定长编码,huffman编码法使用“频繁出现的字符占用更短的位数,不频繁出现的字符占用更长的位数”的方法,来实现编码压缩。

          首先对于text中的所有字符,我们统计每个字符出现的频率,例如:

          huffman算法描述:

          第一步,初始化n个单节点的树(森林),为它们标上字母表中的字符,并把每个字符的频率都记在树的根中,用来指出树的权重。

          第二步,重复以下步骤,当森林中只剩下一颗树时,算法结束。找到两棵权重最小的树,把它们作为左右子树,构建一棵新的树,然后新的树的权重为两棵子树权重之和。

          画图表示:

     

          至此,我们就构造出了一颗二叉huffman树。现在我们让每个节点的左边子树为0,右边子树为1,则当一个字符在某一个叶子时,huffman树根到该叶子的路径所构成的编码,就是该字符的huffman编码。

          例子中每个字符对应的编码为

     

          明显,在huffman编码下,每个字符的编码都不可能是另一个字符的编码的前缀。因此,只要保存了huffman编码树,就能保证在变长编码下,能顺利解码。从而,huffman编码能有效实现文本信息的压缩。

          因为huffman编码树建树的过程,选择的都是最小的频率的两个字符,因此huffman编码方法是一种使编码长度最短的方法。

  • 相关阅读:
    OC 消息机制本质
    Lua中的闭包
    Lua中的函数
    Lua中的语句
    Lua中的表达式
    Lua中的类型与值
    Unity3D之通过C#使用Advanced CSharp Messenger
    C#中sealed关键字
    C#委托delegate、Action、Func、predicate 对比用法
    Unity3D之IOS&Android收集Log文件
  • 原文地址:https://www.cnblogs.com/banyu/p/4961303.html
Copyright © 2011-2022 走看看