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

Encoding 字母表的明确二进制编码方案,encoding,character-encoding,binary,information-theory,Encoding,Character Encoding,Binary,Information Theory,旧的(3c)询问字母表(仅使用两个符号,因此是二进制)的最小无歧义编码方案是什么。据我所知,答案是130-5位需要存储每个字母,如2^4

旧的(3c)询问字母表(仅使用两个符号,因此是二进制)的最小无歧义编码方案是什么。据我所知,答案是130-5位需要存储每个字母,如2^4<26。字母表有26个字符,因此编码方案为5*26位长。然而,标记方案规定可以使用124位。那么长的编码方案是什么?

我认为这是可行的:

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

我的想法是从a到h的长度为4开始,使用0作为第一个符号。然而,这样的方案是短两个符号(如果长度完全由第一个符号预测),因此我寻找一种方法将四个符号代码的数量减少两个。。。并注意到
0000
0001
是仅有的两个三元组
0
。两位为您提供四个字符,其余为明确的编码方案:)

6*4+20*5=124

或者


4+16+6=26

这里的诀窍是不要使用固定长度编码(正如您所指出的,ld(26)介于4和5之间,因此我们在5位编码方案中有未使用的块),而是改变数据字的长度,以便为每个leter获得优化的位数

创建包含32个组合的表时,我们可以将字母a-Z分配给每个值,a从00000开始,B=00001,依此类推。Z将为11001–其余(11010…11111)将未使用

现在它变得有点棘手了。最后我们有六个组合没有使用,但我们不能简单地放弃它们,因为没有“半点信息”这样的东西。因此,我们需要分配六个组合,这样我们就可以删除每个组合的最后一位。例如:

10100=U,10101=V

变成

10100=U,10110=V

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

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


重要提示:虽然此方案是无前缀的(即,没有组合是另一个较长组合的开始),因此明确无误,但它不是自同步的,因此我们不能只是潜入编码字符流中,并肯定获得正确的输出。这需要有一个同步“字符”,它不包含在任何其他字母中,但这是不可能的,因为这是一个无冗余的方案。

回答得好。一般来说,如果字母表中有N个字母,那么最佳无歧义编码的位数由“二进制熵函数”给出:更喜欢这个答案,因为它更详细地描述了这一切背后的思想。此外,我还想补充一点,这种方法是在任何时候,使0的可能性与1的可能性相同(通过尽最大努力使两者的概率“相等”)。如信息论所示,如果产生的所有符号的概率相等(本例中为50%),则离散符号源(此处为位)每比特具有最大平均信息(即熵)。