首页 > 其他分享 >软设每日打卡——已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能为

软设每日打卡——已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能为

时间:2024-09-04 16:23:59浏览次数:5  
标签:字符 编码 哈夫曼 10 字符集 权值 节点

【题目】已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能为(  )

        A. 00, 1011, 01, 1010, 11, 100

        B. 11, 100, 110, 000, 0010, 01

        C. 10, 1011, 11, 0011, 00, 010

        D. 0011, 10, 11, 0010, 01, 000                                答案:A

解:

        我们首先来根据已知字符集和出现次数构建哈夫曼树(最优二叉树),

        出现次数,是为了将短的二进制码分配给频率高的字母,以达到缩短二进制码长度的目的。

        如何构建?

        1、构建棵只有根节点的二叉树构成森林,根节点的值为n个字母与权值,n个不同的字母,对

        应n个权值。这里我们是5个字母{ a, b, c, d, e, f },对应权值{ 6, 3, 8, 2, 10, 4 }。

        2、在森林里选出两颗根节点值最小的树进行合并,生成一颗新树,根节点值为两颗树根节点

        权值之和,且让两棵树作为新树的左右子树。这两棵树就从森林删除了,新树加入森林。

        (1)这里我们就是先找出两个最小的值,2和3。根据小左右大放进树中

        

        根节点为两树权值之和:2+3=5 。

        

        3、重复2的操作,直到森林只剩一棵树为止,该树即为哈夫曼树。

        (2)这里我们继续选出两个最小的值,4和6。但我们上一步生成的新树已经加入了森林,

        所以是{6,5,8,10,4},5是上一步的根节点,所以这里是4和5。

        

        还是小左右大,根节点为两树权值之和:4+5=9 。

        

       (3)重复,{6,9,8,10},剩余的取两个最小的,6和8。

        

        

        (4)重复,{9,14,10},剩余取两最小,9和10。

        

        

        (5)最后剩{14,19},再把最后这两一组合。小左右大

      

        (6)组合完哈夫曼树后,我们将对应的字符填上去。

        

        (7)最后我们要对各个字母进行编码,编码原则是,从哈夫曼树的根节点开始,进入左子树

        则编码号加0,进入右子树则编码号加1,就可以得到对应字母的二进制编码。就是左0右1。

        

                所以答案是A。

哈夫曼树通常以二叉树的形式出现,所以也称最优二叉树,是一类带权路径长度最短的树。

哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础。

哈夫曼编码(Huffman Coding)

        哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一。

        广泛地用于数据文件压缩的十分有效的编码方法。

        通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列。

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

总忘记这些冗杂琐碎的知识点,做题的时候想不起来,搜索的时候又半天看不懂,其实主要是不简洁明了,看不进去,就顺手记录一下,顺便梳理梳理思绪。

目前我们不必把我每个知识点搞的那么细致,软考需要,得会做类似的题,主要是要记住做题思路。

标签:字符,编码,哈夫曼,10,字符集,权值,节点
From: https://blog.csdn.net/m0_67423784/article/details/141893868

相关文章

  • 日志打印的时候使用占位符而不是用字符串拼接
    日志打印的时候使用占位符而不是用字符串拼接1.logger.info("错误信息:"+e.getMessage());  //字符串拼接2.logger.info("错误信息:{}"+e.getMessage()); //使用占位符(正确使用方式)因为String字符串的拼接会使用StringBuilder的append()方式,有一定的性能损耗。......
  • 给自己复盘的随想录笔记-字符串练习题
    反转字符串344.反转字符串-力扣(LeetCode)双指针+元素交换 classSolution{publicvoidreverseString(char[]s){chartemp;intl=0,r=s.length-1;while(l<r){temp=s[l];s[l]=s[r];s[r]=temp;l++;......
  • CF 2010 C2. Message Transmission Error (hard version) (*1700) 字符串+哈希
    CF2010C2.MessageTransmissionError(hardversion)(*1700)字符串+哈希题目链接题意:给你一个字符串,让你判断是否是由某个字符串首尾拼接重叠而成的。思路:做法很多,最暴力就直接枚举字符串长度,然后哈希即可。代码:#include<bits/stdc++.h>usingnamespacestd;#def......
  • 代码随想录算法day7 - 字符串1
    题目1344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示例1:输入:s=["h","e","l","l","o"]输出:["o","l","l","e",&qu......
  • 字符串行转列 regexp_split_to_table
    在Greenplum数据库中,regexp_split_to_table是一个非常有用的函数,它允许你根据正则表达式将字符串分割成多个部分,并将这些部分作为表中的行返回。这个函数在处理文本数据时特别有用,尤其是当你需要将一个字段中的复合数据分解为独立的元素时。语法regexp_split_to_table(str......
  • string字符串
    string字符串1.翻转字符串#include<bits/stdc++.h>usingnamespacestd;intmain(){ strings; getline(cin,s); /*方法1.reverse搭配迭代器 reverse(s.begin(),s.end()); cout<<s; */ /*方法2.反着输出 for(inti=s.length()-1;i>=0;i--){ cout<<s[i]; }*/ //方法3.一半交换 ......
  • 字符串操作补充
    1.字符串的查找    a.许多时候我们想知道某个特定的单词或短语是否在一篇文章当中,我们可以运用查找解决这一问题,我们以字符串在单词中的查找为例fruit='banana'if'n'infruit:print('yes')    b.讨论完字符串在不在单词之后,我们的下一个目标......
  • python 怎么判断字符串开头
    函数:startswith()作用:判断字符串是否以指定字符或子字符串开头。一、函数说明语法:string.startswith(str,beg=0,end=len(string))或string[beg:end].startswith(str)参数说明:string:被检测的字符串。str:指定的字符或者子字符串。(可以使用元组,会逐一匹配)beg:设置字符串......
  • 《第二十七章 IO 流 - 字符流》
    在Java的输入输出(IO)操作中,除了字节流,字符流也是非常重要的一部分。字符流以字符为单位进行读写,更适合处理文本数据。本章将详细介绍字符流,包括 Reader 和 Writer 类以及字符流的读写操作。一、字符流概述字符流用于处理文本数据,它将字节转换为字符,按照字符的编码方......
  • 批量替换字符串中的某子串序列为对应的另一子串序列(z3求解器解多元方程时很好用)
    标题有点拗口,看问题需求就理解了——一,问题需求有一个字符串s1,其中包含a1、a2、a3到a14这些子串,我需要将s1中出现的这些子串全部对应替换成v[0],v[1],v[2]到v[13]等等,应该怎么编写程序例如:s1='a1*88+a2*67+a3*65-a4*5+a5*43+a6*89+a7*25+a8*1......