MTF算法

MTF(move-to-front)是一种数据编码方式,用于提高数据压缩技术效果。

在数据压缩算法中,MTF可以作为一个额外的步骤。也就是说 ,可以先进行MTF编码,在进行数据压缩。

主要使用的是数据的”空间局部性“,也就是最近出现过的字符很可能在接下来的文本附近再次出现。

MTF的主要思想是:

(1)维护一个文本字符集大小的栈,“recently used symbols”(最近访问过的字符),其中每个不同的字符在其中占一个位置,位置从0开始编号。

(2)扫描需要重新编码的文本数据,对于每个扫描到的字符,使用该字符在“recently used symbols”中的index替换,并将该字符提到“recently used symbols”的栈顶位置(index为0的位置)。

(3)转到(2),直到文本扫描结束。

使用MTF,对于许多连续的、相同的字符,将被替换为多个0;最近使用过的字符,会被小的index替换;最近很久没有使用过的字符,会被较大的index替换。MTF完成之后,文本就可以使用一串数字表示,如果文本数据具有较好的空间局部性,这些数字会很小,便于压缩。

import java.util.LinkedList;
import java.util.List;

public class MTF{
    public static List encode(String msg, String symTable){
        List output = new LinkedList();
        StringBuilder s = new StringBuilder(symTable);
        for(char c : msg.toCharArray()){
            int idx = s.indexOf("" + c);
            output.add(idx);
            s = s.deleteCharAt(idx).insert(0, c);
        }
        return output;
    }

    public static String decode(List idxs, String symTable){
        StringBuilder output = new StringBuilder();
        StringBuilder s = new StringBuilder(symTable);
        for(int idx : idxs){
            char c = s.charAt(idx);
            output = output.append(c);
            s = s.deleteCharAt(idx).insert(0, c);
        }
        return output.toString();
    }

    private static void test(String toEncode, String symTable){
        List encoded = encode(toEncode, symTable);
        System.out.println(toEncode + ": " + encoded);
        String decoded = decode(encoded, symTable);
        System.out.println((toEncode.equals(decoded) ? "" : "in") + "correctly decoded to " + decoded);
    }

    public static void main(String[] args){
        String symTable = "abcdefghijklmnop";
        test("dabc", symTable);
    }
}

你可能感兴趣的:(算法)