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

    哈夫曼


    一、最优树的定义:

      结点的路径长度定义为:从根结点到该结点的路径上分支的数目。
      树的路径长度定义为:树中每个结点的路径长度之和。
      树的带权路径长度定义为:树中所有叶子结点的带权路径长度之和
      WPL(T) = (对所有叶子结点)
      在所有含有n个叶子结点、并带有相同权值的m叉树中,必存在一棵其带权路径长度取最小值的树,称为最优树。


    二、如何构造最优树:

    哈夫曼算法,以二叉树为例:
    (1)根据给定的n个权值{W1,W2,W3...Wn},构造n棵二叉树的集合F={T1,T2...Tn},
    其中每棵二叉树中均只含一个带权值为Wi的根结点,其左、右树为空树。
    (2)在F中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造
    一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和。
    (3)从F中删去这两棵树,同时加入刚生成的新树。
    (4)重复(2)和(3)两步,直至F中只含一棵树为止。


    三、哈夫曼编码思想:

    1、将构成电文的每个不同字符作为叶子结点,其权值为电文中字符的使用频率或次数,构造哈夫曼树;

    2、此哈夫曼树中从根到每个叶子结点都有一条唯一的路径,对路径上各分支约定,做分支标识为0码,右标识为1码;

    3、则从根结点到叶子结点的路径上分支的0、1码组成的字符串即为该叶子结点的哈夫曼编码。


    四、指令的变长编码:

    若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符编码的前缀,这种编码称作前缀编码。
    哈夫曼编码就是使电文长度最短的前缀编码。


    五:试题:
    用二进制来编码字符串“abcdabeaa”,需要能够根据编码,解码回原来的字符串,最少需要多长的二进制字符串?
    A、17
    B、18
    C、19
    D、29
    解题步骤:
    a出现4次,b出现2次,c出现1次,d出现1次,e出现1次。
    画哈夫曼树:
                              9
                    5                4(a)
          2                       3
    1(c)   1(d)       1(e)     2(b)
    即:
    a:1 b:011 c:000 d:001 e:010
    长度:a是4次,长度为4,其他长度都是3,其他字符有5个,
    所以:4*1+5*3=19。


  • 相关阅读:
    [MSSQL]也说SQL中显示星期几函数
    ECMAScript旮里旮旯儿一(galigalaoer)
    [MSQL]RANK函数
    敏捷背后的理论
    敏捷软件开发 Agile software Development
    第三章 WebGL资源 WebGL Resources
    第一章 WebGL简介 Introduction
    [MSSQL]PIVOT函数
    《Javascript高级程序设计》读书笔记 Number对象
    visual studio 2010 冷门技巧分享
  • 原文地址:https://www.cnblogs.com/gyfluck/p/10635514.html
Copyright © 2011-2022 走看看