首页 > 其他分享 >软设每日打卡——霍夫曼编码将频繁出现的字符釆用短编码,出现频率较低的字符采用长编码。具体的操作过程为: i)以每个字符的出现频率作为关键字构建最小优先级队列;ii)取出关键字最小的两个结点生成子树..

软设每日打卡——霍夫曼编码将频繁出现的字符釆用短编码,出现频率较低的字符采用长编码。具体的操作过程为: i)以每个字符的出现频率作为关键字构建最小优先级队列;ii)取出关键字最小的两个结点生成子树..

时间:2024-09-06 12:20:54浏览次数:15  
标签:编码 12 哈夫曼 字符 关键字 长度

【题目】霍夫曼编码将频繁出现的字符釆用短编码,出现频率较低的字符采用长编码。具体

        的操作过程为: i)以每个字符的出现频率作为关键字构建最小优先级队列;ii)取出关键

        字最小的两个结点生成子树,根节点的关键字为孩子节点关键字之和,并将根节点插入

        到最小优先级队列中,直至得到一颗最优编码树。霍夫曼编码方案是基于( 1 )策略的。

        用该方案对包含 a 到 f 6个字符的文件进行编码,文件包含 100000个字符,每个字符的

        出现频率(用百分比表示)如下表所示,则与固定长度编码相比,该编码方案节省了( 2 )

        存储空间。

        

         1.  A.分治         B.贪心         C.动态规划         D.回溯                        答案:B


         2.  A. 21%         B. 27%         C. 18%         D. 36%                           答案:A

        1、第一问,基于贪心策略,对文本压缩以获得较短的编码。

        2、我们根据字符和出现频率画出哈夫曼树(上一篇有讲怎么画)

        

        昨天我纠结在e画在12左边还是右边,因为画在左边的字符对应的二进制数刚好可以算出结

        果,但这里我们不是根据编码计算节省存储空间的,而是根据编码的位数,这里就牵扯到

        长编码相关的知识点。

        

等长编码是一种简单且译码具有唯一性的编码方式,这种编码方式的特点是每个字符的编码长度相同(编码长度就是每个编码所含的二进制位数)。每个字符都有对应的二进制编码,且长度是固定。所以很容易设计,也很方便读写。假设字符集只含有4个字符A,B,C,D,用两位二进制表示的编码分别为00,01,10,11。

变长编码使得编码长度得到了大幅的缩小,但是多义性,所以如何设计编码很重要,这时我们就要用到哈夫曼编码

哈夫曼编码(Huffman Coding),是由麻省理工学院的哈夫曼博所发明,这个编码方式解决了变长编码多义性的问题。

        所以我们再回归到题目,在等长编码上,编写6个字符至少需要3位(a:000,b:001,c:

        010……),那么等长编码需要 3*100000 =300*1000 存储空间。

        霍夫曼编码需要:18 * 2(这里乘的是编码长度,也就是编码位数)+32 * 2+4 * 4+8 * 4+12

         * 3+26 * = 236*1000(这里的 *1000),这里我再看看!

        那么节省的空间为(300-236)/ 300 = 21.333...%

        答案就为21%

        

———————————————————————

普通构建哈夫曼树求哈夫曼码的做法我上一篇有讲,

昨天在画哈夫曼图这里卡了好久,因为碰到了根节点和12等于题目中的e=12的情况,

在画在左边还是右边算出结果不同卡住了,现在终于解决啦,和画法没有关系,

编码长度一样就不影响结果。

标签:编码,12,哈夫曼,字符,关键字,长度
From: https://blog.csdn.net/m0_67423784/article/details/141923936

相关文章

  • 代码随想录算法训练营第十天| 232.用栈实现队列 、 225. 用队列实现栈 、20. 有效的括
    学习文章链接:代码随想录文章目录一、232.用栈实现队列二、225.用队列实现栈三、20.有效的括号四、1047.删除字符串中的所有相邻重复项一、232.用栈实现队列题目链接:232.用栈实现队列栈的操作:stack<int>s;s.empty();//如果栈为空则返回true,......
  • leetcode刷题day9|字符串部分(151.翻转字符串里的单词、卡码网:55.右旋转字符串)
    前言:字符串章节的第二部分,复习第一部分的知识加提升。151.翻转字符串里的单词链接:https://leetcode.cn/problems/reverse-words-in-a-string/前言:不使用Java内部方法实现思路:先去除字符串中的空格;将整个字符串反转;将单词再一次反转。代码如下:classSolution{pub......
  • leetcode刷题day8|字符串部分(344.反转字符串、541. 反转字符串II)
    前言:字符串部分还是比较简单的344.反转字符串链接:https://leetcode.cn/problems/reverse-string/description/思路:这个比较简单,因为字符串也是数组类型的,用两个指针进行交换即可。代码如下:classSolution{publicvoidreverseString(char[]s){inti=0......
  • 【C++ 关键字】谈谈你对volatitle、extern 关键字的理解
    文章目录1.volatitle的概念2.volatitle的作用3.1.volatitle的概念......
  • 2024.9.5 leetcode 3174 清除数字(字符串)
    题面3174.清除数字-力扣(LeetCode)题解:今天的每日一题比较简单,思路是遍历字符串,遇到第一个数字x的时候,把数字x和前面的字母y删除,也就是删除yx。1、为什么前面一定是字母,因为遇到的是第一个数字,前面不可能再有数字。2、如何实现删除yx,重新定义一个字符串,每一次遍历将y前面的字......
  • 章10——面向对象编程(高级部分)——final关键字
    基本介绍注意事项final修饰不同东西属性:相当于常量,需要赋初值(构造器(除static)、代码块、定义时)。构造器不可以是静态的,因为构造器中隐含了super和this。类:不可继承。方法:不可重写,但可继承。因为不可以重写的特质不可以修饰构造方法。final和static搭配效率高是因为:不会导......
  • 【自由能系列(中级),代码模拟】预测编码的核心:三个关键方程式的详解
    预测编码的核心:三个关键方程式的详解——探索预测编码背后的数学原理与应用核心结论:预测编码是一种基于贝叶斯定理的理论框架,它通过三个关键方程式描述了大脑如何处理和解释来自环境的信号。这些方程式分别建立了贝叶斯定理的简化形式、生成模型以及观察者模型,共同揭示了......
  • 字符串拼接的几种形式
    字符串拼接的几种形式##一.算术运算符1.//+-*/%(取余)2.     intnum=10+10;//20      intnum1=10-10;//0      intnum2=10*10;//100      intnum3=10/10;//1      intnum4=10%......
  • LeetCode 3174. 清除数字(字符串、模拟)
    题目:3174.清除数字思路:用字符串t模拟操作要求,当x是数字时,删除t的最后一个字符。不是的话,直接插入xclassSolution{public:stringclearDigits(strings){stringt="";for(autox:s){if('0'<=x&&x<='9'){......
  • 20240905_154516 python 填空题 字符串方法2
    有字符串列表li=["a","b","c"],让列表成员用+拼接,保存给变量rr="+".join(li)有字符串s,把它的内容变成小写,保存给变量rr=s.lower()有字符串s,把它内部的java全替换为python,保存结果给变量rr=s.replace("java","python")有字符串s="abc",请把它按空符号进行分割,得......