字母表的明确二进制编码方案

时间:2014-08-23 13:38:46

标签: encoding character-encoding binary information-theory

旧的British Informatics Olympiad question(3c)询问字母表中最小的明确编码方案(仅使用两个符号 - 因此是二进制)是什么。据我所知,答案是130 - 5位需要存储每个字母,如2 ^ 4< 26.字母表有26个字符,因此编码方案长度为5 * 26位。但是,标记方案表明可以使用124位。什么是那么长的编码方案?

2 个答案:

答案 0 :(得分:2)

我认为这有效:

a - 0010
b - 0011
c - 0100
d - 0101
e - 0110
f - 0111
g - 10000
h - 10001
i - 10010
j - 10011
k - 10100
l - 10101
m - 10110
n - 10111
o - 11000
p - 11001
q - 11010
r - 11011
s - 11100
t - 11101
u - 11110
v - 11111
w - 00000
x - 00001
y - 00010
z - 00011

毫不含糊。如果符号以两个或更少的零开头,则长度为4.如果以1开头,则为长度5.如果以000开头,则长度为5.

我从一个长度为4的h开始,使用0作为第一个符号。然而,像这样的方案是短两个符号(如果长度完全由第一个符号决定),所以我寻找一种方法将四个符号代码的数量减少两个......并注意到00000001是唯一拥有三0的人。两位给你四个字符,其余的是一个明确的编码方案:)

6 * 4 + 20 * 5 = 124

或者

4 + 16 + 6 = 26

答案 1 :(得分:2)

这里的技巧是不使用固定长度编码(正如你所指出的,ld(26)介于4和5之间,因此我们在5位编码方案中有未使用的块),但是改变了我们的数据字的长度,所以我们得到每个字母的优化位数。

当创建32个组合的表时,我们可以为每个值分配字母A-Z,A从00000开始,B = 00001,依此类推。 Z将是11001 - 其余的(11010 ... 11111)将被闲置。

现在它变得有点棘手了。我们最后有六种组合没有使用,但我们不能简单地删除它们,因为没有"半数信息"。因此,我们需要分配六种组合,以便我们可以删除每种组合的最后一位。例如:

10100 = U,10101 = V

变为

10100 = U,10110 = V

相应地移动其他组合,因此最后六个字母中的每一个的最后一位是" 0"。然后这个位可以删除,所以我们以这些字母结尾:

<00> 00000 = A,00001 = B,...,10011 = T,1010 = U,1011 = V,1100 = W,1101 = X,1110 = Y,Z = 1111

重要:虽然这个方案没有前缀(即没有组合是另一个组合的开始,更长的组合)并且因此明确,它不是自我同步的,所以我们不能只是潜入编码字符流,绝对可以获得正确的输出。这需要具有同步&#34;字符&#34;任何其他字母都没有包含 - 但这是不可能的,因为这是一种无冗余方案。