自定义压缩算法的效率

时间:2015-10-17 15:54:21

标签: java algorithm compression

我有一个压缩算法的想法,我有两个问题:

  1. 我应该处理吗?会有效吗?
  2. 我该如何优化它?
  3. 这是我到目前为止创建的算法。

    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);
    }
    

    示例输入(每个字母描述一个字节)

    [A, B, C, D, E, E, B, B, A, A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, C, C] = 27 bytes
    

    示例输出

    [0x80, A, B, C, D, E, E, B, B, 0x8D, A, 0x84, B, 0x82, C, C] = 16 bytes
    

    在示例中,0x80是打包位。表示是否会重复以下信件。 0xFF - 0x80 = 0x7F是最大重复次数(127)。因此,0x8D表示后续字节将重复0xD(13)次

    任何想法优化该算法?它会有用还是我会摆脱这个想法?

2 个答案:

答案 0 :(得分:0)

问题是,算法的目的是什么?

要发明一些非常新的东西,你需要检查一下之前发明的东西。阅读一些关于数据压缩等的论文和书籍。Data Compression Explained可以是一个很好的起点。

如果您只想练习编写算法,那就完全没问题了。继续改进算法,重构,加速,分析等。

如果您希望算法切实可行,请再次检查之前创建的内容。开源压缩算法,如zlib值得研究。

如果您想检查算法与其他算法的比较,请在某些常用测试中运行,例如Silesia Open Source Compression Benchmark。这会给你一个直觉(你可能有点令人失望,但不要放弃)。

最后,如果你想玩得开心,就做任何你想做的事,不要听任何人的话。

答案 1 :(得分:0)

你发明了run-length encoding。大多数压缩算法已经包含了一种运行长度编码,它将执行您的实现并在更多情况下更好地工作。如果我是你,我就不会追求它。

如果您对数据压缩感兴趣,我强烈建议Managing Gigabytes第2章和第6章作为一个非常易于理解的阅读。