MTF算法

来源:互联网 发布:邻家女孩在淘宝有店吗 编辑:程序博客网 时间:2024/05/16 01:45

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<Integer> encode(String msg, String symTable){        List<Integer> output = new LinkedList<Integer>();        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<Integer> 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<Integer> 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);    }}
0 0
原创粉丝点击