Compression 序列压缩?

Compression 序列压缩?,compression,sequence,Compression,Sequence,最近我遇到了一个让我很困惑的问题, 问题是: 我想压缩一个序列,这样就不会丢失任何信息,例如: a、 a,a,b->a,b a、 a,a,c->a,b,a,a,c不能压缩成a,b,a,c,因为这样我们就失去了a,a 有什么算法可以做这样的事情吗?这个问题叫什么?是压缩吗?还是别的什么? 我真的很感激任何帮助 提前感谢除非您必须自己编写一些解决方案,否则您可以为正在使用的编程语言使用一些ZIP压缩库 是的,这是数据压缩。是的,压缩。一个简单的算法是运行长度编码。还有信息理论,这是压缩算法的基础 信

最近我遇到了一个让我很困惑的问题, 问题是: 我想压缩一个序列,这样就不会丢失任何信息,例如:

a、 a,a,b->a,b

a、 a,a,c->a,b,a,a,c不能压缩成a,b,a,c,因为这样我们就失去了a,a

有什么算法可以做这样的事情吗?这个问题叫什么?是压缩吗?还是别的什么? 我真的很感激任何帮助
提前感谢

除非您必须自己编写一些解决方案,否则您可以为正在使用的编程语言使用一些ZIP压缩库


是的,这是数据压缩。

是的,压缩。一个简单的算法是运行长度编码。还有信息理论,这是压缩算法的基础

信息论:更常见的输入应该更短,从而缩短句子长度

因此,如果您对二进制编码,其中序列0101非常常见,大约占输入的25%,那么简单的压缩将是:

0101 = 0
anything else = 1[original 4 bits]
因此输入:0101100 0101 0101 1010 0101 1111 0101 将压缩到:0 11100 0 11010 0 11111 0

这是32位->20位的压缩


一个重要的教训是:压缩算法的选择完全取决于输入。错误的算法可能会使数据变长。

每种能够以占用较少内存的方式转换数据的算法都称为压缩。它可能是无损的,也可能是有损的

e、 g.压缩表格,例如:

以下是称为游程长度编码(简称RLE)的简单形式imho:

a,a,a,b,c -> 3a,1b,1c
正如您所看到的,所有相同的后续字符都被压缩为一个字符

您还可以搜索更难的后续模式:

a,b,a,b,a,c --> 2(a,b),1(a),1(c)

有很多关于压缩算法的文献和网络资源,你应该使用它们来获得更深入的了解。

另一个好的算法是

我从魔术师那里发现这个简单的Javascript LZW函数非常棒:


我们可以使用LZW压缩算法,利用哈希表高效、快速地压缩文本文件。

您能解释一下这些转换a、a、a、b->a、b、a、a、c->a、b、a、a、c吗?他们完全不知道任何人知道,这是如何编码的?@Andrey:这是长度下降的RLE。这里实际上有两个变换。@Ignacio Vazquez Abrams我不知道RLE在哪里:a,a,a,b->a,b,a,a,c@Andrey:再说一次,那是两个,一个半的转换。正如我发现的运行长度编码算法,如本例维基百科中所示:wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww?然后你将如何处理,并获得原始信息?谢谢你的回复,我搜索了很多,但没有找到任何真正有用的方法来解决这个问题,你确定有任何解决这个特殊问题的方法吗?在你的第一个示例中,你将5个字符的列表压缩为6个字符的列表,这不是压缩,这就是编码,编码到一个扩展!每一种压缩算法也是一种编码算法。哪一种是5到6?a、 a,a,b->a,b | a,b,a,c->a,b,a,a,c?这是压缩,我在搜索网页时找不到任何东西。最好将示例编辑为:a,a,a,b->a,a,b
function (
    a // String to compress and placeholder for 'wc'.
){

    for (
        var b = a + "Ā", // Append first "illegal" character (charCode === 256).
            c = [], // dictionary
            d = 0, // dictionary size
            e = d, // iterator
            f = c, // w
            g = c, // result
            h; // c

        h = b.charAt(e++);
    )

        c[h] = h.charCodeAt(), // Fill in the dictionary ...
        f = 1 + c[a = f + h] ? a : (g[d++] = c[f], c[a] = d + 255, h); // ... and use it to compress data.

    return g // Array of compressed data.

}