标签:比特 使用 png inf 合并 不难 二叉树 五个 编码
哈夫曼树是一种最优二叉树,其定义是:给定n个权值作为n个叶子节点,构造一棵二叉树,若树的带权路径长度达到最小,这样的树就达到最优二叉树,也就是哈夫曼树,示例图如下:
深入学习哈夫曼树前,先了解一下基本概念,并以上面的哈夫曼树图为例
前面说到,哈夫曼树是最优二叉树,因为符合哈夫曼树特点的树的带权路径长度一定是最小的,我们将哈夫曼树和普通的二叉树做个比较,仍以上图为例,上图的哈夫曼树是结点10,20,50,100组成的二叉树,WPL是350,用这四个结点组成普通的二叉树,结果如下:
不难计算,该二叉树的WPL = 210 + 220 + 250 + 2100 = 360,明显比哈夫曼树大,当然二叉树的组成结果不唯一,但WPL一定比哈夫曼树大。所以说哈夫曼树是最优二叉树。
现在假定有n个权值,设为w1、w2、…、wn,将这n个权值看成是有n棵树的森林,根据最小带权路径长度的原则,我们可以按照下面步骤来将森林构造成哈夫曼树:
以森林 (16,20,23,24,50) 为例,其构造步骤如下:
① 合并权值为16和20的树,构成权值为36的新树,森林变为(36,23,24,50);
② 合并最小的两棵树23和24,组成新的树47,这时森林变为(36,47,50);
③ 合并36和47的树作为权值83的新树,并和50结合组成根节点权值为133的哈夫曼树。
最终结果图如下:
哈夫曼是一种无前缀编码,使用一种特别的方法为信号源中的每个符号设定二进制码,解码时不会混淆。其主要应用在数据压缩,加密解密等场合。可以与哈夫曼树进行结合生成。
给哈夫曼树的根节点分配比特0,左子树分配0,右字数分配1,一直递归下去,然后就可以得到符号的码值了。假设我有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1。
这样结点对应的编码为:16 - > 100,20 - > 101,23 - > 110,24 - > 111,50 - > 0
标签:比特 使用 png inf 合并 不难 二叉树 五个 编码
原文地址:https://www.cnblogs.com/yeya/p/9835895.html