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<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);
    }
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值