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

本文详细介绍了赫夫曼树的基本概念,包括路径、路径长度及带权路径长度等,并阐述了赫夫曼树的设计思想及其在判定树与编码问题中的应用。通过赫夫曼树,可以有效地减少比较次数和编码长度。

一:基本概念:


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.判定树:

   

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

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


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


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就可以实现前缀编码(可以证明的)

                 

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

            4).赫夫曼编码:

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

                    例:

                             

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

                             

                             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值