我在c中有二进制数组,我想压缩数组,请提示我压缩二进制数组的算法。我使用过Lempel-Ziv-Welch(LZW)算法,但它不适合我,因为我的数据没有重复。
答案 0 :(得分:2)
答案 1 :(得分:1)
您可能没有重复,但数据中仍可能存在可以利用的模式。但是,这需要了解更多有关数据的信息,而不是重复信息。
如果您的数据实际上(或几乎)随机分布,那么压缩它将会遇到Pidgin Hole问题。这说明如果你只有X pidgins和Y个洞来放入它们,并且X>是的,那你没有足够的空间。在压缩中,这意味着你无法利用不存储某些pidgins的能力,这些pidgins是已经存在于孔中的同一对双胞胎,只需在解压缩算法中留下注释以克隆该pidgin。在霍夫曼编码中,所有pidgins都是pidgin文库中pidgins的克隆。在其他一些压缩方案中,一些pidgins可能是由其他pidgins组成的巨型pidgins。
答案 2 :(得分:1)
你可以轻松地将空间缩小一半!
由于您的二进制数据没有重复,因此您的唯一选项是[0,1],[1,0]。任何更多的东西都会重复零或一个。因此,你可以用0表示第一组,用1表示第二组。编码看起来像这样......
encode [0, 1] = 0
encode [1, 0] = 1
解码就是......
decode 0 = [0, 1]
decode 1 = [1, 0]
对于haskell语法很抱歉,在这种情况下它更具可读性。这会将您的两个元素数组转换为一个元素数组,并且可以存储在一半的空间中!魔法。
编辑:这忽略了[0]和[1]的简单情况。如果需要处理这些(虽然你不应该真正压缩1位),不可能获得比100%更好的压缩率。
答案 3 :(得分:0)
如果您有二进制数据,则很可能将它们视为char[]
。在您的问题和评论中,您声明(几乎)没有重复,只有在您没有超过256个(char
)数据项时才可以重复。
但我猜您有更多数据,因此压缩是可能的。如果数据项的频率分布不均匀,您可能会对简单的Huffman coding感到幸运。
为了给您提供更精确的建议,我们需要有关您要压缩的数据类型的更多详细信息。
答案 4 :(得分:0)
或者:您的二进制数据代表某些值。您可以减少所有值的位数。您需要知道可能的范围,并按位写入和读取数据。如果您在uint32中存储只需要几位的值,这可能会节省大量空间。
答案 5 :(得分:0)
压缩不是魔术。如果您的数据完全是随机的,则没有可用的压缩算法可以使其更小。
大多数数据并非完全随机,但您需要发现表达它的最佳方式,以便能够检测到模式。图像和声音很常见,已经开发出标准算法,但是如果没有获得更多细节,就不能再说明你的具体问题了。