最近我遇到了一个让我很困惑的问题, 问题是 : 我想压缩一个序列,所以没有信息丢失,例如:
a,a,a,b - > A,B
a,b,a,a,c - > a,b,a,a,c(它不能压缩成a,b,a,c因为这样我们就失去了a,a)
有没有算法做这样的事情?这个问题叫什么名字?是压缩吗?或其他什么? 我真的很感激任何帮助 提前致谢
答案 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)
答案 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压缩算法通过使用哈希表来高效,快速地压缩文本文件。