zoukankan      html  css  js  c++  java
  • 哈夫曼编码

    哈夫曼编码

    •      编码

                普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit

    •      变长编码

                变长编码比固定编码好一些,即对频率高的字符赋以短编码,对频率低的字符赋以长编码。

     

     

    a

    b

    c

    d

    e

    f

    频率

    45

    13

    12

    16

    9

    5

    固定

    000

    001

    010

    011

    100

    101

    变长

    0

    101

    100

    111

    1101

    1100

    •      前缀编码

               即较短的编码不能是任何较长的编码的前缀,这样解析的时候才不会混淆

     

    •      前缀码生成方式(二叉树)

                把要编码的字符放在二叉树的叶子上,所有的左节点是0,右节点是1,从根浏览到叶子上,因为字符只能出现在树叶上,任何一个字符的路径都不会是另一字符路径的前缀路径,符合前缀原则编码就可以得到。

     

    •      压缩效率

              •   可以看出,构造更优的二叉树,原则就是权重越大的叶子,距离根应该越近,而我们的终级目标是生成“最优”的二叉树,最优二叉树必须符合下面两个条件:

                  所有上层节点都大于等于下层节点。

                  某节点,设其较大的子节点为m,较小的子节点为n,m下的任一层的所有节点都应大于等于n下的该层的所有节点。

              •  从各个节点中找出最小的两个节点,给它们建一个父节点,值为这两个节点之和。

              •  从节点序列中去除这两个节点,加入它们的父节点到序列中。

              •  重复上面两个步骤,直到节点序列中只剩下唯一一个节点。这时一棵最优二叉树就已经建成了,它的根就是剩下的这个节点。

    •   列出原始的节点数据

     

    •      将最小的两个节点C和E结合起来

     

    •      再将新的节点和A组合起来

    •   再将D节点加入

     

  • 相关阅读:
    Mac OS X系统下编译运行C代码
    Android intent传递list或对象
    Android中实现自定义的拍照应用
    由闭包引起的对javascript代码可维护性的思考
    让浏览器非阻塞加载javascript的几种方式
    Javascript中正则表达式的全局匹配模式
    解读JavaScript代码 var ie = !-[1,]
    Javascript中闭包的作用域链
    WPF代码注意事项,开发常见问题,知识总结
    WPF绑定各种数据源之object数据源
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3149742.html
Copyright © 2011-2022 走看看