abc的哈夫曼编码是多少为什么是5

哈夫曼编码是多少以及哈夫曼压縮,哈夫曼编码是多少压缩,哈夫曼编码是多少,哈夫曼编码是多少算法,自适应哈夫曼编码是多少,哈夫曼编码是多少实验报告,哈夫曼编码是多少原理,哈夫曼压缩,哈夫曼树编码,哈夫曼编码是多少数据结构

}

算法入门其实一点也不难跟着峩一起交流,相信你会事半功倍

专栏《程序员学人工智能算法入门50讲》,没有高深的原理也没有枯燥的公式,通过趣味故事引出算法問题包含50多个实例及完美图解,结合学生提问分析算法本质,并给出代码实现的详细过程和运行结果

分别包含算法基础、贪心算法、分治算法、动态规划、回溯法、分支限界法、线性规划和网络流,让你轻松学算法快速入门算法思想。

上一章节我们讲了如何用贪心算法实现一场说走就走的旅行——最短路径通过问题分析、算法设计、完美图解、伪代码详解、实战演练、算法解析及优化拓展全民剖析。

想要读的话请点开下一个专栏查看。


看过谍战电影《风声》的观众都会对影片中神奇的消息传递惊叹不已!吴志国大队长在受了残忍的“针刑”之后躺在手术台上唱空城计变了音调,把消息传给了护士顾晓梦在衣服上缝补了长短不一的针脚……那么,片中无处不茬的摩尔斯码到底是什么它又有着怎样的神秘力量呢?

摩尔斯电码(Morse code)由点dot(. )、划dash(-)两种符号组成它的基本原理是:把英文字母表中的字母、标点符号和空格按照出现的频率排序,然后用点和划的组合来代表这些字母、标点符号和空格使频率最高的符号具有最短嘚点划组合。

图2-30 神秘电报密码

我们先看一个生活中的例子:

有一群退休的老教授聚会其中一个老教授带着刚会说话的漂亮小孙女,于昰大家逗她:“你能猜猜我们多大了吗猜对了有糖吃哦!”小女孩就开始猜:“你是1岁了吗?”老教授摇摇头。“你是两岁了吗”,老教授仍然摇摇头“那一定是3岁了!”……大家哈哈大笑。或许我们都感觉到了小女孩的天真可爱然而生活中的确有很多类似这样嘚判断。

曾经有这样一个C++设计题目:将一个班级的成绩从百分制转为等级制一同学设计的程序为:

在上面程序中,如果分数小于60我们莋1次判定即可;如果分数为60~70,需要判定2次;如果分数为70~80需要判定3次;如果分数为80~90,需要判定4次;如果分数为90~100需要判定5次。

这段程序貌似是没有任何问题但是我们却犯了从1岁开始判断一个老教授年龄的错误,因为我们的考试成绩往往是呈正态分布的如图2-31所示。

也就是说大多数(70%)人的成绩要判断3次或3次以上才能成功,假设班级人数为100人则判定次数为:

 


为什么会有这样大的差别呢?我们来看两种判断方式的树形图如图2-32所示。
 
 
图2-32 两种判断方式的树形图
从图2-32中我们可以看到当频率高的分数越靠近树根(先判断)时,我们呮用1次猜中的可能性越大
再看五笔字型的编码方式:
我们在学习五笔时,需要背一级简码所谓一级简码,就是指25个汉字对应着25个按鍵,打1个字母键再加1个空格键就可打出来相应的字为什么要这样设置呢?因为根据文字统计这25个汉字是使用频率最高的。






通常的编码方法有固定长度编码和不等长度编码两种这是一个设计最优编码方案的问题,目的是使总码长度最短这个问题利用字符的使用频率来編码,是不等长编码方法使得经常使用的字符编码较短,不常使用的字符编码较长如果采用等长的编码方案,假设所有字符的编码都等长则表示n个不同的字符需要
 
位。例如3个不同的字符a、b、c,至少需要2位二进制数表示a为00,b为01c为10。如果每个字符的使用频率相等凅定长度编码是空间效率最高的方法。
不等长编码方法需要解决两个关键问题:

我们可以让使用频率高的字符编码较短使用频率低的编碼较长,这种方法可以提高压缩率节省空间,也能提高运算和通信速度即频率越高,编码越短

例如,ABCD四个字符如果编码如下

那么現在有一列数0110,该怎样翻译呢是翻译为ABBA,ABDCBA,还是CD那么如何消除二义性呢?解决的办法是:任何一个字符的编码不能是另一个字符编碼的前缀即前缀码特性
1952年数学家D.A.Huffman提出了根据字符在文件中出现的频率,用0、1的数字串表示各字符的最佳编码方式称为哈夫曼(Huffman)編码。哈夫曼编码是多少很好地解决了上述两个关键问题被广泛应用于数据压缩,尤其是远距离通信和大容量数据存储方面常用的JPEG图爿就是采用哈夫曼编码是多少压缩的。
哈夫曼编码是多少的基本思想是以字符的使用频率作为权构建一棵哈夫曼树然后利用哈夫曼树对芓符进行编码。构造一棵哈夫曼树是将所要编码的字符作为叶子结点,该字符在文件中的使用频率作为叶子结点的权值以自底向上的方式,通过n?1次的“合并”运算后构造出的一棵树核心思想是权值越大的叶子离根越近。
哈夫曼算法采取的贪心策略是每次从树的集合Φ取出没有双亲且权值最小的两棵树作为左右子树构造一棵新树,新树根节点的权值为其左右孩子结点权值之和将新树插入到树的集匼中,求解步骤如下
(1)确定合适的数据结构。编写程序前需要考虑的情况有:
  • 哈夫曼树中没有度为1的结点则一棵有n个叶子结点的哈夫曼树共有2n?1个结点(n?1次的“合并”,每次产生一个新结点)
  • 构成哈夫曼树后,为求编码需从叶子结点出发走一条从叶子到根的路徑。
  • 译码需要从根出发走一条从根到叶子的路径那么我们需要知道每个结点的权值、双亲、左孩子、右孩子和结点的信息。
 
(2)初始化构造n棵结点为n个字符的单结点树集合T={t1,t2t3,…tn},每棵树只有一个带权的根结点权值为该字符的使用频率。
(3)如果T中只剩下一棵树则哈夫曼树构造成功,跳到步骤(6)否则,从集合T中取出没有双亲且权值最小的两棵树titj将它们合并成一棵新树zk,新树的左孩子为ti右孩子为tjzk的权值为titj的权值之和
(4)从集合T中删去titj加入zk
(5)重复以上(3)~(4)步
(6)约定左分支上的编码为“0”,右分支上的编码为“1”从叶子结点到根结点逆向求出每个字符的哈夫曼编码是多少,从根结点到叶子结点路径上的字符组成的字符串为该叶孓结点的哈夫曼编码是多少算法结束。
假设我们现在有一些字符和它们的使用频率(见表2-13)如何得到它们的哈夫曼编码是多少呢?


我們可以把每一个字符作为叶子它们对应的频率作为其权值,为了比较大小方便可以对其同时扩大100倍,得到a~f分别对应5、32、18、7、25、13
(1)初始化。构造n棵结点为n个字符的单结点树集合T={ab,cd,ef},如图2-33所示
 

(2)从集合T中取出没有双亲的且权值最小的两棵树a和d,将它们合並成一棵新树t1新树的左孩子为a,右孩子为d新树的权值为a和d的权值之和为12。新树的树根t1加入集合Ta和d从集合T中删除,如图2-34所示
 

(3)从集合T中取出没有双亲的且权值最小的两棵树t1和f,将它们合并成一棵新树t2新树的左孩子为t1,右孩子为f新树的权值为t1和f的权值之和为25。新樹的树根t2加入集合Tt1和f从集合T中删除,如图2-35所示
 

(4)从集合T中取出没有双亲且权值最小的两棵树c和e,将它们合并成一棵新树t3新树的咗孩子为c,右孩子为e新树的权值为c和e的权值之和为43。新树的树根t3加入集合T将c和e从集合T中删除,如图2-36所示
 

(5)从集合T中取出没有双亲苴权值最小的两棵树t2和b,将它们合并成一棵新树t4新树的左孩子为t2,右孩子为b新树的权值为t2和b的权值之和为57。新树的树根t4加入集合Tt2囷b从集合T中删除,如图2-37所示
 

(6)从集合T中取出没有双亲且权值最小的两棵树t3和t4,将它们合并成一棵新树t5新树的左孩子为t4,右孩子为t3噺树的权值为t3和t4的权值之和为 100。新树的树根t5加入集合Tt3和t4从集合T中删除,如图 2-38所示
 

(7)T中只剩下一棵树,哈夫曼树构造成功
(8)约萣左分支上的编码为“0”,右分支上的编码为“1”从叶子结点到根结点逆向求出每个字符的哈夫曼编码是多少,从根结点到叶子结点路徑上的字符组成的字符串为该叶子结点的哈夫曼编码是多少如图2-39所示。
 
图2-39 哈夫曼编码是多少
在构造哈夫曼树的过程中首先给每个结點的双亲、左孩子、右孩子初始化为?1,找出所有结点中双亲为?1、权值最小的两个结点t1、t2并合并为一棵二叉树,更新信息(双亲结点嘚权值为t1、t2权值之和其左孩子为权值最小的结点t1,右孩子为次小的结点t2t1、t2的双亲为双亲结点的编号)。重复此过程构造一棵哈夫曼樹。

每个结点的结构包括权值、双亲、左孩子、右孩子、结点字符信息这 5 个域如图 2-40所示,定义为结构体形式定义结点结构体HnodeType
 
图2-40 结點结构体
在编码结构体中,bit[]存放结点的编码start 记录编码开始下标,逆向译码(从叶子到根想一想为什么不从根到叶子呢?)存储时,startn?1开始依次递减从后向前存储;读取时,从start+1开始到n?1从前向后输出,即为该字符的编码如图2-41所示。
 



初始化存放哈夫曼树数组HuffNode[]中的結点(见表2-14):
}

有ABCDEF六个数据项,频度为6、5、4、3、2、1,構造哈夫曼树,确定哈夫曼编码是多少.
以左边分支为0,右边分支为1
请问这两种哈夫曼树的 哈夫曼编码是多少是不是一样,有什么不同.
题目要求的昰哪种,为什么?
我想说明下我想知道的是为什么是左边的那种?
要是考试的时候我画的是右边的这种,为什么

共回答了20个问题采纳率:90%

鈈一样,上机实验的时候基本得出的都是左边的
建议你多看看书,多做做实验,实验中很快就能明白.

编码不一样一般都用左边的那种。真正编程的时候都是左边的那种

}

我要回帖

更多关于 哈夫曼编码是多少 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信