0

代码是将唯一的字符串(代码字)分配给字母表中的每个字符。

代码字只包含零和一的代码称为二进制代码。

所有 ASCII 码字具有相同的长度。这确保了一个称为前缀属性的重要属性适用于 ASCII 代码。

来自字母表(明文)的字符串的编码是与明文字符相对应的码字从左到右按顺序串联。如果使用该代码的每个可能的明文的编码都是唯一的,则该代码是唯一可解码的。

基于上述信息,我试图做一些练习:

考虑以下矩阵:

  Code1   Code2  Code3  Code4

A  0       0        1      1

B  100     1       01     01

C  10      00     001    001

D  11      11    0001    000

困惑:

  1. 是否所有上述分配都被认为是codes因为它们具有唯一的字符串???
  2. 我知道它们code 1 and code 2是无前缀的,因为它们的长度不相等。话虽如此,如果您查看code 4字母表D and C,它包含 3 位数字。code 4也会被认为是无前缀的吗?
  3. code 3唯一可解码的代码吗?
4

1 回答 1

0

我认为您误解了前缀属性-它主要与长度无关(但n在每个代码点上强制使用相同的长度将使代码无前缀-否则您不能拥有唯一代码)。

相反,它是关于能够唯一地识别每个代码点,以便解码器可以贪婪地获取第一个匹配的翻译。在固定长度的情况下,解码器知道它必须读取n数字。

可变长度代码(如)的情况下Code1,您在阅读时不知道它10是否可以翻译成,C或者它是否是三位数字的前两位数字B-10100. 这同样适用于Code2:0是 的前缀00并且1是 的前缀11

考虑一次读取100 一个数字的序列:

Code1:
Read 1
; "1" does not match any code -  Remember the 1 and continue.
Read 0
; "10" matches reduction "C" - or is this the beginning of a "B"? Darn!
Read 0
; Ok, this was either "CA" or "B" - but there is no way of knowing which one.

希望这可以帮助您前进!

于 2012-08-11T06:15:23.980 回答