序列压缩?

时间:2010-10-20 11:33:47

标签: compression sequence

最近我遇到了一个让我很困惑的问题, 问题是 : 我想压缩一个序列,所以没有信息丢失,例如:

a,a,a,b - > A,B

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

有没有算法做这样的事情?这个问题叫什么名字?是压缩吗?或其他什么? 我真的很感激任何帮助 提前致谢

6 个答案:

答案 0 :(得分:2)

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

e.g。 (压缩形式为“示例”: - )

以下是imho的简单形式,称为行程长度编码,简称RLE:

a,a,a,b,c -> 3a,1b,1c

正如您所看到的,所有后续相同的字符都被压缩为一个。

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

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

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

答案 1 :(得分:1)

RLE

答案 2 :(得分:1)

是的,压缩。一种简单的算法是游程长度编码。还有信息理论,它是压缩算法的基础。

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

所以,如果你是编码二进制文件,其中序列0101非常通用(大约是输入的25%),那么简单的压缩就是:

0101 = 0
anything else = 1[original 4 bits]

所以输入:0101 1100 0101 0101 1010 0101 1111 0101
将被压缩为:0 11100 0 0 11010 0 11111 0

32位压缩 - > 20位。

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

答案 3 :(得分:1)

另一个好的算法是Lempel–Ziv–Welch

我发现这个简单的Javascript LZW功能非常出色,来自140 bytes of javascript的魔术师:

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.

}

答案 4 :(得分:0)

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

是的,这是数据压缩。

答案 5 :(得分:0)

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