首页 > 其他分享 >数据结构(哈夫曼树):判定编码方案是否为前缀编码

数据结构(哈夫曼树):判定编码方案是否为前缀编码

时间:2023-08-14 17:46:26浏览次数:42  
标签:编码 00 01 前缀 哈夫曼 011 000 数据结构 编码方案

前缀编码定义:
(字符集中)任一编码都不是其它字符的编码的前缀
(字符集中)任一编码都不是其它字符的编码的前缀
(字符集中)任一编码都不是其它字符的编码的前缀
重要的话说三遍!
例:
(1)找出下面不是前缀编码的选项
A{1,01,000,001}
B{1,01,011,010}
C{0,10,110,11}
D{0,1,00,11}

第一步:看A中的第一个数1,看看其他数有没有1开头的。没有。
第二步:看A中的第二个数01,看看其他数有没有01开头的。没有。
第三步:看看A中的第三个数000,看看其他数有没有000开头的。没有。
第四步:看看A中的第四个数001,看看其他数有没有001开头的。没有。
所以A是前缀编码。

其他选项也一样。B、C也一样。来说说D:

第一步,看D中的第一个数,找有0开头的的数,有,是00;其实到这里已经不用看了,因为D已经不是前缀编码了。但第二个数1,是第四个数11的前缀,所以也能作为D不是前缀编码的理由。

(2)5 个字符有如下 4 种编码方案,不是前缀编码的是:

A.01,0000,0001,001,1

B.011,000,001,010,1

C.000,001,010,011,100

D.000,00,01,011,10

对于A选项
第一步:看A中的第一个数01,找有没有其他数是01开头的,没有。
第二步:看A中的第二个树0000,找有没有其他数是0000开头的,很显然没有
…略,反正就是每个数都要和其他3个数比较,看看有没有是它开头的。
对于D选项
第一步:看D的000,没有000开头的,好,继续看00。
第二步:看D的00,找00开头的数,有,是000,所以D不是前缀编码。同理01是011的前缀,所以也可以成为D不是前缀编码的原因。

既然写了就说完去吧,这样搞的原因是:

比如有以下编码串,01101001011用(2)中的A表示,那就是:
01-1-01-001-01-1
如果交由D表示:011-01-00-10-1或者01-10-10-01-011。

很显然,D有两种表示方法。

但如果D中000表示a,00表示b,01表示c,011表示d,10表示e,那D中的两种表示方法,会使信息产生歧义!如果这是以前的通讯编码,用D类型的编码编译或解译,会产生严重的歧义。

标签:编码,00,01,前缀,哈夫曼,011,000,数据结构,编码方案
From: https://www.cnblogs.com/zhu-yue/p/17629303.html

相关文章

  • redis数据结构链表
    redis数据结构链表数据结构链表节点typedefstructlistNode{//前置节点structlistNode*prev;//后置节点structlistNode*next;//节点的值void*value;}listNode;多个listNode可以通过prev和next指针组成双端链表链表typedefstructlist{//表头节点......
  • redis数据结构sds
    简单字符串sds数据结构structsdshdr{//记录buf数组中已使用字节的数量//等于SDS所保存字符串的长度intlen;//记录buf数组中未使用字节的数量intfree;//字节数组,用于保存字符串charbuf[];};特性空间预分配空间预分配用于优化SDS的字符串年增长操作:当SD......
  • 考研数据结构——每日一题[哈希表]
    840.模拟散列表维护一个集合,支持如下几种操作:Ix,插入一个数x;Qx,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为Ix,Qx中的一种。输出格式对于每......
  • Redis设计与实现——数据结构(二刷)
    SDS动态字符串Redis是c语言实现的,传统c字符串存在不可变导致的频繁内存分配,一些API函数可能引起缓冲区溢出等问题。Redis在c字符串的基础上,封装实现了SDS动态字符串,能够根据每次存储关键字的大小自动申请额外缓冲区内存,避免频繁申请和缓冲区溢出问题。SDS定义str......
  • 数据结构与算法 --- 如何分析排序算法
    引言排序算法是最基础的算法,对于排序算法,除学习算法原理,代码实现之外,更重要的是学习每个算法的特点,知道在什么场景下选择那种算法。那一定是选择时间复杂度最低的排序算法就是最优的吗?可以从以下几个方面分析一下。排序算法的执行效率对于排序算法的执行效率,一般从以下几个方......
  • 数据结构与算法 --- 组数、链表、栈和队列(一)
    数组、链表、栈和队列是四种基础数据结构,他们是高级、复杂的数据结构和算法的基础。本篇先来讲述数组,链表,及算法的优化策略。数组定义数组:数组是一种线性表数据结构,它用一组连续的内存空间存储一组具有相同类型的数据。定义中有三个关键词:线性表连续的内存空间相同类型数......
  • 数据结构与算法 --- “哨兵”思想
    引言哨兵思想是指在算法中使用一个特殊值来检测或标记某些条件的发生,它的目的是为了简化代码,并使其更容易理解,常常用于在循环中优化边界条件的判断。介绍在算法中,"哨兵"思想是指在循环中设置一个特殊的元素(称为哨兵),以便在循环过程中能够更高效地处理某些边界情况或结束条件。......
  • 数据结构与算法 --- 组数、链表、栈和队列(二)
    继数据结构与算法---组数、链表、栈和队列(一)讲解完数组,链表及算法的优化策略之后,接下来继续讲解两种特殊的线性表结构,栈和队列。栈对“栈”有一个很形象的比喻,栈就像一摞叠在一起的盘子,放盘子时,只能放在上面,不能将盘子插入到中间的任意位置;取盘子时,只能从最上面取,不能从中间任......
  • 数据结构与算法 --- 排序算法(一)
    引言按照时间复杂度,将一些常见排序算法进行分类,分为以下三类:\(O(n^2)\):冒泡排序,插入排序,选择排序。\(O(nlogn)\):快速排序,归并排序。\(O(n)\):桶排序,计数排序,基数排序。本篇文章讨论以下第一类:冒泡排序,插入排序,选择排序。上一篇数据结构与算法---如何分析排序算法提......
  • 数据结构与算法 --- 递归(二)
    引言上文数据结构与算法---递归(一)讲述了什么是递归算法,如何编写递归算法及如何写好递归算法,本文着重讲述一下如何避免递归过深导致的堆栈溢出问题。探究产生堆栈溢出的原因函数调用采用函数调用栈来保存当前“快照”(局部变量,返回地址等)。函数调用栈是内存中开辟的一块存储空......