Encoding 有效地将位数组编码为有限的字母表

Encoding 有效地将位数组编码为有限的字母表,encoding,compression,Encoding,Compression,这是一个有效的编码问题 输入是一个最大长度为63的可变长度位数组。例如: [0, 0, 0, 1, 0, 0, 1] 0s在该数组中比1s更常见。假设1s大约有5%的时间被发现 我的输出格式也受到限制。我可以输出一个仅由36个字符a-z和0-9组成的字符串。可变长度输出很好 我想要一个无损编码算法,使我的平均输出字符串长度最小化 一种简单的无损编码方法是将输出字母表中的前32个字母分配给一个唯一的5位序列,将输入拆分为5位输出,然后每5位输出一个字母。这给了我一个预期的字符串长度:input

这是一个有效的编码问题

输入是一个最大长度为63的可变长度位数组。例如:

[0, 0, 0, 1, 0, 0, 1]
0
s在该数组中比
1
s更常见。假设
1
s大约有5%的时间被发现

我的输出格式也受到限制。我可以输出一个仅由36个字符a-z和0-9组成的字符串。可变长度输出很好

我想要一个无损编码算法,使我的平均输出字符串长度最小化

一种简单的无损编码方法是将输出字母表中的前32个字母分配给一个唯一的5位序列,将输入拆分为5位输出,然后每5位输出一个字母。这给了我一个预期的字符串长度:input array size/5

但是,这既没有利用输入中
0
s的低概率,也没有利用我的字母表中剩余的4个字母


你能推荐一个更好的编码方案吗?

可能类似于--将可变数量的输入位映射到单个输出字母符号的代码。“最大长度为63”--我假设这意味着1到63之间的任何长度,包括在内?在这种情况下,我发现您提出的编码有一个问题——它只能处理5的倍数长度。4个缺失的代码可用作“转义”,表示最后一个符号中只能使用1-4位。(允许以1个额外编码符号为代价对任意长度进行编码)。下面是一个生成编码树的小脚本:节点/叶ID将映射到输出字母表。最后一个id是为“转义符号”保留的。这样做的目的是根据输入降低树的高度。一旦你到达一片叶子,你就会发出它的id并再次从根开始。如果在到达叶子之前到达输入的末尾,则会发出转义和所在节点的ID。解码只是一个简单的表查找,转义后的符号使用第二个表。由于1的概率为1/20,它几乎像一元代码。该方案期望输入符号被硬编码的概率,并且输入源是无内存的。您可以通过使用第一个写入的符号以1/36的步长表示零的概率来提高灵活性,从而使算法更加灵活(然后解码器可以根据该信息重新生成匹配树)。是的,任何长度在1和63之间(包括1和63)。编码需要区分
[0,0]
[0,0,0]
。树的描述是有意义的,但确定树的最佳结构成为关键。