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

Compression 算法:最小编码,纠错,请帮忙?,compression,forwarderrorcorrection,delta-row-compression,Compression,Forwarderrorcorrection,Delta Row Compression,假设有一个1024位的数组,它们都是零: 示例:[0,0,0,0,0,0,0,…] 然后我在完全随机的位置用1覆盖20个零: 示例:[0,1,0,0,0,0,0,…] 假设我有一个完美的编码器,那么对这20个随机放置的位的位置进行编码所需的理论最小位数是多少 我知道有一些通信理论方程可以告诉我这一点,但我想再次检查我的计算 更难的额外问题:向我展示一个算法的代码,该算法实现了接近这个最小限制的编码 额外的好处:如果位翻转字节级别而不是位级别,该怎么办?e、 整个字节翻转。相同的结果?如果将200

假设有一个1024位的数组,它们都是零:

示例:[0,0,0,0,0,0,0,…]

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

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

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

我知道有一些通信理论方程可以告诉我这一点,但我想再次检查我的计算

更难的额外问题:向我展示一个算法的代码,该算法实现了接近这个最小限制的编码


额外的好处:如果位翻转字节级别而不是位级别,该怎么办?e、 整个字节翻转。相同的结果?

如果将200位的字符串视为20个10位数字的数组,每个数字列出其中一位的位置,则可以节省824位

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


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

如果将一个200位的字符串视为20个10位数字的数组,每个数字列出其中一位的位置,您将节省824位

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


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

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

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.

这意味着,从理论上讲,使用最佳算法,你可以用1004个0和20个1对任何字符串进行编码,或者用143位进行编码。

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

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.

这意味着,从理论上讲,使用最佳算法,您可以使用1004个0和20个1对任何字符串进行编码,或者使用143位进行编码。

ceilinglog21024选择20=139位

其他答案说143位遗漏了我们知道正好有20位。这里有一个具体的编码来展示使用该知识的一种方法:使用,依次发送1024个“0”或“1”符号中的每一个。第一个符号以20/1024的概率为“1”加权;但后面的每个符号的权重不同。如果第一个符号为“0”,则在下一个符号上使用20/1023;但如果是“1”,则使用19/1023。以同样的方式继续到最后。算术编码做了所有艰苦的工作,以适应约139位,只要我们告诉它正确的概率


关于奖金:错误纠正不在原始问题中。在假设没有错误的情况下,您可以在首先找到最佳编码的基础上分层纠错代码,如上文所述,这通常是解决问题的好方法。这样您就不会失去任何编码效率,尽管我认为您可能会失去健壮性—例如,如果您得到的错误超过了ECC所能纠正的,那么消息将以完全垃圾的形式出现,还是会更优雅地降级?

ceilinglog21024选择20=1 39位

其他答案说143位遗漏了我们知道正好有20位。这里有一个具体的编码来展示使用该知识的一种方法:使用,依次发送1024个“0”或“1”符号中的每一个。第一个符号以20/1024的概率为“1”加权;但后面的每个符号的权重不同。如果第一个符号为“0”,则在下一个符号上使用20/1023;但如果是“1”,则使用19/1023。以同样的方式继续到最后。算术编码做了所有艰苦的工作,以适应约139位,只要我们告诉它正确的概率


关于奖金:错误纠正不在原始问题中。在假设没有错误的情况下,您可以在首先找到最佳编码的基础上分层纠错代码,如上文所述,这通常是解决问题的好方法。这样,您不会损失任何编码效率,尽管我认为您可能会失去健壮性—例如,如果您得到的错误超过ECC所能纠正的错误,那么消息将以完全垃圾的形式出现,还是会更优雅地降级?

那么现在是1044位,还是仍然只有1024位?我的意思是覆盖,而不是插入,好捕获。还有1024位。那么现在是1044位,还是只有1024位?我的意思是覆盖,而不是插入,很好的捕获。还有1024位。我很高兴能弄明白为什么会这样。很好。那么有没有关于这个的编码算法的想法?错误的位置是提前知道的,正如我在这个问题中所展示的。我只想把这些错误的位置编码成我能做到的绝对最小字节数。啊,我不清楚这1位代表错误。这确实改变了答案,但你可以用同样的方法来处理它;答案可能会看起来更复杂。而且,这个精确的20个错误的东西是非常学术的-我从来没有听说过任何错误源有足够的帮助,总是注入20个错误,而不是19或21个错误。:-不管怎样,我希望你喜欢。我很喜欢弄明白为什么会这样。很好。那么有没有关于这个的编码算法的想法?错误的位置是提前知道的,正如我在这个问题中所展示的。我只想把这些错误的位置编码成我能做到的绝对最小字节数。啊,我不清楚这1位代表错误。这确实改变了答案,但你可以用同样的方法来处理它;答案可能会看起来更复杂。而且,这个精确的20个错误的东西是非常学术的-我从来没有听说过任何错误源有足够的帮助,总是注入20个错误,而不是19或21个错误。:-我希望你还是喜欢。