行测 JDK动态代理 远程桌面登陆 MongoDB dataframe date pointers null ftp chartjs cocos2d html5 vue前端开发 jquery获取最后一个子元素 oracle显示所有数据库 重置hosts excel加减混合求和 oracle分析函数 mysql连接 python数据 python3下载安装 python编程教程 java文件流 java文件写入 java初学 java读取文件内容 java正则匹配数字 java文件路径 javastring比较 linux系统安装 ie模拟器 猫爪 r语言和python 脚本之家官网 视频修复工具 god2iso 手机电脑模拟器 小程序开发工具下载 vue引入第三方js 电脑书籍下载 c4d挤压怎么用
当前位置: 首页 > 学习教程  > 编程语言

Java数据结构与算法-树结构实际应用Ⅱ(赫夫曼编码)[day09]

2020/10/8 18:38:56 文章标签:

树结构实际应用 赫夫曼编码 赫夫曼编(霍夫曼、哈夫曼)码基本介绍 1.赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法 2.赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 3.赫夫曼编码广泛地用于…

树结构实际应用


赫夫曼编码

赫夫曼编(霍夫曼、哈夫曼)码基本介绍

1.赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法
2.赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。
3.赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间
4.赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码

赫夫曼编码的原理图解
变长编码的举例说明

1. 通信领域中信息的处理方式1-定长编码

i like like like java do you like a java // 共40个字符(包括空格) 105
32 108 105 107 101 32 108 105 107 101 32 108 105 107 101 32 106 97 118
97 32 100 111 32 121 111 117 32 108 105 107 101 32 97 32 106 97 118 97
//对应Ascii码
01101001 00100000 01101100 01101001 01101011 01100101 00100000 01101100 01101001 01101011 01100101 00100000 01101100 01101001 01101011 01100101 00100000 01101010 01100001 01110110 0110000100100000 01100100 01101111 00100000 01111001 01101111 01110101 00100000 01101100 01101001 01101011 01100101 00100000 01100001 00100000 01101010 01100001 01110110 01100001
//对应的二进制 按照二进制来传递信息,总的长度是359

2.通信领域中信息的处理方式2-变长编码
  • i like like like java do you like a java // 共40个字符(包括空格)

  • d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9 // 各个字符对应的个数0= , 1=a, 10=i, 11=e, 100=k, 101=l, 110=o, 111=v, 1000=j, 1001=u,1010=y, 1011=d

  • 说明:按照各个字符出现的次数进行编码,原则是出现次数越多的,则编码越小,比如 空格出现了9 次, 编码为0 ,其它依次类推.

  • 按照上面给各个字符规定的编码,则我们在传输 “i like like like java do you like a java” 数据时,编码就是 10010110100…

  • 字符的编码都不能是其他字符编码的前缀,符合此要求的编码叫做前缀编码, 即不能匹配到重复的编码(这个在赫夫曼编码中,还要进行举例说明,看不懂,不着急)

赫夫曼编码的原理图解

要传输的字符串:

i like like like java do you like a java

统计各个字符:d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9
// 各个字符对应的个数

按照上面字符出现的次数构建一颗赫夫曼树, 次数作为权值

构成赫夫曼树的步骤:

  1. 从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树

  2. 取出根节点权值最小的两颗二叉树

  3. 组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和

  4. 再将这颗新的二叉树,以根节点的权值大小再次排序, 不断重复 1-2-3-4 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树

在这里插入图片描述

  1. 根据赫夫曼树,给各个字符,规定编码 (前缀编码), 向左的路径为0 向右的路径为1 , 编码如下: o: 1000 u:
    10010 d: 100110 y: 100111 i: 101 a : 110 k: 1110 e: 1111
    j: 0000 v: 0001 l: 001 : 01

  2. 按照上面的赫夫曼编码,我们的"i like like like java do you like a java"
    字符串对应的编码为 (注意这里我们使用的无损压缩)
    1010100110111101111010011011110111101001101111011110100001100001110011001111000011001111000100100100110111101111011100100001100001110 通过赫夫曼编码处理 长度为 133

  1. 长度为 : 133 说明: 原来长度是 359 , 压缩了 (359-133) / 359 = 62.9% 此编码满足前缀编码,
    即字符的编码都不能是其他字符编码的前缀。不会造成匹配的多义性 赫夫曼编码是无损处理方案
  • 注意事项
    这个赫夫曼树根据排序方法不同,也可能不太一样,这样对应的赫夫曼编码也不完全一样,但是wpl 是一样的,都是最小的, 比如: 如果我们让每次生成的新的二叉树总是排在权值相同的二叉树的最后一个,则生成的二叉树为:
    在这里插入图片描述

本文链接: http://www.dtmao.cc/news_show_250083.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?