树(4)--赫夫曼树及其应用

一:基本概念:

树(4)--赫夫曼树及其应用_第1张图片

1.路径:由一结点到另一结点间的分支所构成

2.路径长度:路径上的分支数(A->E=2)

3.树的路径长度:从树根到每一结点的路径长度之和=10

4.结点带权路径长度:结点到根的路径长度与结点上权的乘积
                                                         F的带权路径长度WPL=9*2=18

5.树的带权路径长度:WPL=,Wi表示第i个结点的权值,Li表示结点的路径长度。


二.赫夫曼树:

1.概念:使得WPL=最小的那一棵树就叫做赫夫曼树.

2.思想:我们可以这样想,要想使得WPL最小,即权值Wi越大的Li就让它越小,越小的Wi的Li值就让它越大。

   做法:

              (1) 由给定的 n 个权值{w0, w1, w2, …, wn-1},构造具有 n 棵扩充二叉树的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵扩充二叉树 Ti 只有一个带有权值 wi 的根结点,     其左、右子树均为空。
             (2) 重复以下步骤, 直到 F 中仅剩下一棵树为止:
                     ① 在 F 中选取两棵根结点的权值最小的扩充二叉树, 做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
                     ② 在 F 中删去这两棵二叉树。
                     ③ 把新的二叉树加入 F。


三.赫夫曼树的应用:

1.判定树:

    树(4)--赫夫曼树及其应用_第2张图片

树(4)--赫夫曼树及其应用_第3张图片

           我们想能不能找到一种方式让它比较的少一点呢?很明显,我们让比例大的分数就让它少比较一点,让比例小的分数让它多比较一点,

    这样的话就能达到比较次数少的目的了,,,很显然我们可以采用赫夫曼树的思想。。。


再将每一比较框的两次比较改为一次得到:

树(4)--赫夫曼树及其应用_第4张图片


2.赫夫曼编码

          1)通信中,可以采用0、1的不同排列来表示不同的字符,称为二进制编码。发送端需要将电文中的字符序列转换成二进制的0、1序列,即编码 ; 

              接受端需要把接受的0、1序列转换成对应的字符序列,即译码。 

          2)等长编码:用相等长度的01序列来编码,如A:01 B:10 C:11等;

             不等长编码:用不同长度的01序列来编码,如A:001 B:01 C:1等(不等长的目的是让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,缩短传送电文的总长度), 采用不等长编码很明显不应该存在:字符集中任一字符的编码都不能是其他字符编码的前缀。符合此要求的编码叫做前缀编码

           3)利用二叉树就可以实现这种编码,让左分支为0,右分支为1就可以实现前缀编码(可以证明的)

                  树(4)--赫夫曼树及其应用_第5张图片

                如图:a:0   b:110   c:10   d:111

            4).赫夫曼编码:

                      设计电文总长最短的二进制前缀编码即:以n种字符出现的频率作权,设计一棵赫夫曼树的问题,由此得到的二进制前缀编码称赫夫曼编码

                    例:

                              树(4)--赫夫曼树及其应用_第6张图片

                   可得对应的哈夫曼编码(并与二进制编码比较)为:

                              树(4)--赫夫曼树及其应用_第7张图片

                             

你可能感兴趣的:(数据结构,赫夫曼树,赫夫曼编码,赫夫曼树应用)