算法:最小编码,纠错,请帮助?

时间:2010-01-21 22:48:15

标签: compression forwarderrorcorrection delta-row-compression

假设有一个1024位的数组全部为零:

示例:[0,0,0,0,0,0,0,...]

然后我用完全随机位置的那些覆盖20个零:

示例:[0,1,0,0,0,0,0,...]

假设我有一个完美的编码器,编码这20个随机放置位的位置所需的理论最小位数是多少?

我知道有通信理论方程会告诉我这个,但我想仔细检查我的计算。

更难的奖励问题:向我展示实现接近此最低限制的编码的算法代码。

奖励加值:如果位翻转字节级别而不是位级别怎么办?例如翻转整个字节。同样的结果?

3 个答案:

答案 0 :(得分:5)

ceiling(log2(1024选择20))= 139位

(calculation on Wolfram Alpha)

其他答案说143位遗漏我们知道完全 20个。这是一个具体的编码,用于显示使用该知识的一种方法:使用arithmetic coding,连续发送1024个'0'或'1'符号。第一个符号在20/1024的概率为'1'时被加权;但每个后来的符号加权不同。如果第一个符号为'0',则在下一个符号上使用20/1023;但如果它是'1',请使用19/1023。以同样的方式继续到最后。只要我们告诉它正确的概率,算术编码就可以完成大约139位的所有艰苦工作。

关于“奖金奖励”:错误更正不在原始问题中。您可以在首次找到最佳编码之前对错误纠正代码进行分层,假设没有错误,如上所述(这通常是解决问题的好方法)。你不会失去任何编码效率,虽然我认为你可能会失去稳健性 - 例如,如果你得到的错误超过你的ECC可以纠正的错误,那么这条消息会不会像垃圾一样消失,还是会更优雅地降级呢? / p>

答案 1 :(得分:2)

如果你要使用基于字典的编码,解码器也有字典,那就没有绝对的最小值。但是,对于基于频率的编码,您需要的是计算熵:

E = -(P(0) * log_2(P(0)) + P(1) * log_2(P(1)))
E = -(1004/1024 * log_2(1004/1024) + 20/1024 * log_2(20/1024))
E = 0.1388005

因此,输入的每个位平均需要输出0.1388005位。总计:

0.1388005 * 1024 = 142.1317 bits.

这意味着理论上,使用最佳算法,您可以使用143位编码任何字符串,其中包含1004个零和20个(或相反)。

答案 2 :(得分:1)

如果你将一个200位的字符串视为一个包含二十个10位数字的数组,每个数字列出一位的一位,你将节省824位。

但我认为这不是最低限度。例如,如果您将每个数字视为相对于前一项而不是绝对位置,则某些分析可能表明平均而言,您只需要8位来编码到下一位的距离。所以在前面加一点:当为0时,则后跟绝对位置为200位。当为1时,则160位跟随相对位置。这应该产生较低的平均位数来编码完整值。

概括,这只是数据压缩。可能有许多压缩算法可以将“1024位二十一位”编码所需的平均位数减少到非常小的数量。计算一个合适的二叉树,存储它的表示,然后存储遍历树所需的位可能会产生一个非常有效的算法(这实际上是现代数据压缩的基础)。