Java 自定义压缩算法的效率
我有一个压缩算法的想法,我有两个问题:Java 自定义压缩算法的效率,java,algorithm,compression,Java,Algorithm,Compression,我有一个压缩算法的想法,我有两个问题: 我应该处理它吗?它会有效率吗 我如何优化它 这是我到目前为止创建的算法 int i = 0,j, diff, beginIndex = 0; while(i < tmp.length){ j = i; byte first = tmp[i]; int total = 0; while(j < tmp.length && first == tmp[j] && total < 1
int i = 0,j, diff, beginIndex = 0;
while(i < tmp.length){
j = i;
byte first = tmp[i];
int total = 0;
while(j < tmp.length && first == tmp[j] && total < 127){ j++; total++;}
if(total > 3){
if(beginIndex != i){
diff = i - beginIndex;
packed.put((byte)diff);
packed.put(tmp, beginIndex, diff);
}
packed.put((byte)(0x80 | total));
packed.put(tmp[i]);
beginIndex = j;
}
i = j;
if(i-beginIndex == 127){
packed.put((byte)127);
packed.put(tmp, beginIndex, 127);
beginIndex = i;
}
}
if(beginIndex < i){
diff = i - beginIndex;
packed.put((byte)diff);
packed.put(tmp, beginIndex, diff);
}
示例输出
[0x80, A, B, C, D, E, E, B, B, 0x8D, A, 0x84, B, 0x82, C, C] = 16 bytes
在示例中,0x80是压缩位。表示是否将重复以下字母。0xFF-0x80=0x7F是maksimum重复计数(127)。所以,0x8D表示以下字节将重复0xD(13)次
有优化算法的想法吗?它有用吗?还是我应该放弃这个想法?问题是,你的算法的目的是什么 要发明真正的新东西,你需要检查一下,以前发明了什么。阅读一些关于数据压缩等方面的论文和书籍是一个很好的开始 如果你只是想练习写算法,那完全可以。继续改进您的算法、重构、加速、评测等 如果您希望您的算法实用,请再次检查之前创建的算法。开源压缩算法等值得研究 如果您想检查您的算法与其他算法的比较,请在一些流行的测试上运行它,例如。这会给你一个直觉,你的立场(这可能有点令人失望,但不要放弃) 最后,如果你想玩得开心,就做你想做的事,不要听任何人的。你已经发明了。大多数压缩算法已经结合了一种运行长度编码,它将在更多情况下比您的实现表现更好。所以如果我是你,我就不会追求它
如果您对数据压缩感兴趣,我强烈建议您阅读第2章和第6章。通过将结果与现有的著名算法(如gzip)进行比较,您可以轻松检查它的效率。但是,由于在现实生活数据中,字母重复出现的情况相对较少(现有的算法已经处理了这一问题,而且效率更高),我认为这不会产生很好的结果。这种算法类似于,你可以在互联网上找到很多关于它的信息。你可以使用拼写检查器,尤其是标题。压缩在20世纪80年代很有趣。在投入大量时间之前考虑一下您的目标(并记下两者)。第一个问题是它无法处理数据中出现的0x80位。你需要设计一个逃避的惯例,不要忘记一个逃避的惯例。它只不过是运行长度编码,几十年前就已经发明了。
[0x80, A, B, C, D, E, E, B, B, 0x8D, A, 0x84, B, 0x82, C, C] = 16 bytes