📜  霍夫曼编码练习题

📅  最后修改于: 2021-09-28 10:54:06             🧑  作者: Mango

从 GATE 的角度来看,霍夫曼编码是一个重要的主题,并且从这个主题提出了不同类型的问题。在理解本文之前,您应该对 Huffman 编码有基本的了解。

这些是基于霍夫曼编码的 GATE 中提出的问题类型。

类型 1. 基于霍夫曼编码的概念性问题 –
以下是基于霍夫曼编码的几个关键点:

  • 它是一种无损数据压缩技术,可为不同的符号生成可变长度的代码。
  • 它基于贪婪方法,该方法考虑了用于生成代码的字母表的频率/概率。
  • 它的复杂度为 nlogn,其中 n 是唯一字符的数量。
  • 一个字符的代码长度与其出现的频率成反比。
  • 没有代码是另一个代码的前缀,因为代码序列可以明确地解码为字符。

Que – 1.以下关于霍夫曼编码的说法正确的是?
(A) 在某些情况下,霍夫曼编码可能会变得有损
(B) 在某些情况下,霍夫曼码可能不是最佳的无损码
(C) 在霍夫曼编码中,没有代码是任何其他代码的前缀。
(D) 以上所有

解决方案:如前所述,霍夫曼编码是一种无损压缩技术。因此,选项(A)和(B)是错误的。选项 (C) 是正确的,因为这是从给定代码解码消息的基础。

类型 2。要查找用于编码给定消息的位数 –
要解决此类问题:

  • 如果没有给出,首先计算字符的频率
  • 生成霍夫曼树
  • 使用字符的频率和表示这些字符所需的位数来计算位数。

Que – 2.对消息“mississippi”进行编码可能需要多少位?

解:以下为“密西西比”字符频非降序排列表:
11
生成的哈夫曼树为:
xyz (1)

以下是代码:
111
总位数
= freq(m) * 码长(m) + freq(p) * code_length(p) + freq(s) * code_length(s) + freq(i) * 码长(i)
= 1*3 + 2*3 + 4*2 + 4*1 = 21

此外,每个字符的平均位数可以计算为:
所需的总位数/总字符数 = 21/11 = 1.909

类型 3. 从代码到消息的解码 –
要解决此类问题:

  • 使用霍夫曼树为每个字符生成代码(如果没有给出)
  • 使用前缀匹配,用字符替换代码。

Que – 3.字符a 到 h 具有基于前 8 个斐波那契数的一组频率,如下所示:

a : 1, b : 1, c : 2, d : 3, e : 5, f : 8, g : 13, h : 21

使用霍夫曼码来表示字符。以下代码对应的字符序列是什么?

110111100111010

(一) fdheg
(二) ecgdf
(C) dchfg
(D) 饲料

解决方案:使用问题中给出的频率,可以生成霍夫曼树:

以下是代码:
0

使用前缀匹配,给定的字符串可以分解为

110 11110 0 1110 10
f   d     h  e   g

类型 4. 使用霍夫曼编码保存的位数 –

Que – 4.网络公司在通过网络传输之前使用压缩技术对消息进行编码。假设消息包含以下字符及其频率:
00

请注意,输入消息中的每个字符占用 1 个字节。

如果使用的压缩技术是霍夫曼编码,那么消息中将节省多少位?
(一) 224
(乙) 800
(三) 576
(四) 324

解决方案:不使用霍夫曼查找位数,
字符总数 = 频率总和 = 100
1 个字符的大小 = 1 字节 = 8 位
总位数 = 8*100 = 800

使用霍夫曼编码,所需的总位数可以计算为:

5*4 + 9*4 + 12*3 + 13*3 + 16*3 + 45* 1 = 224

节省的位数 = 800-224 = 576。
xyz (2)