MTF(Move-to-front transform)数据转换

1.什么是MTF

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

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

2.MTF基本原理

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

  MTF的主要思想是:

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

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

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

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

3.MTF图解

  (1)先建立字符集大小的栈,“recently used symbols”,这里只考虑26个小写字母a~z。

    recently used
symbols:queue=(abcdefghijklmnopqrstuvwxyz)。

  其中字符在栈中的位置表示该字符的index。起初,字符a的index为0,b的index为1,以此类推,z的index为25。

  (2)扫描文本,如”bananaaa“。

    编码如下:

    

  如上,bananaaa经MTF之后变成了list=(1,1,13,1,1,1,0,0)。MTF只可逆的过程,只要记录下转换之前的queue和转换之后的list,就完全可以快速的回复原始文本数据。

  解码如下:

    

4.MTF数据转换的使用

  MTF转换主要是利用空间局部性原理来减少信息熵。因为最近访问的字符总是出现在“recently used
symbols”的前面位置,如果字符的空间局部性较好,编码之后就会出现很多小的数字,如”0“或”1“。然而,并不是所有的文本数据,都具有较好的局部相关性。

  一个重要的应用就是基于Burrows–Wheeler transform压缩算法。Burrows-Wheeler
transform能将文本转换为局部相关性很好的序列。

  一般压缩可以将文本先使用Burrows–Wheeler transform生成局部相关性很好的序列,再使用MTF减少信息熵,最后再进行压缩。

5.MTF转换代码实例

下面的代码是对文本进行move-to-front数据编码:


 1 #include <iostream>
2 #include <algorithm>
3 #include <string>
4 #include <list>
5 using namespace std;
6
7 int MTF_transform(const string &text,int* result_MTF,list<char> &mylist){
8 list<char>::iterator it;
9 for(int i=0;i<text.size();i++){
10 it=find(mylist.begin(), mylist.end(),text[i]); ///查找当前字符
11 result_MTF[i]=distance(mylist.begin(),it); ///保存当前字符在mylist中的索引
12 mylist.erase(it); ///删除元素
13 mylist.push_front(text[i]); ///把当然元素添加到index为0的位置
14 }
15 return 0;
16 }
17
18 int main(int argc,char* argv[])
19 {
20 string text = "bananaaa";
21 int *result_MTF = new int[text.size()];
22 list<char> mylist;
23 for(int i=0;i<26;i++){
24 mylist.push_back(‘a‘+i);
25 }
26
27 MTF_transform(text,result_MTF,mylist);
28 for(int i=0;i<text.size();i++){
29 cout<<result_MTF[i]<<" ";
30 }
31 delete [] result_MTF;
32 return 0;
33 }

参考:http://en.wikipedia.org/wiki/Move-to-front_transform

额外阅读:http://en.wikipedia.org/wiki/Least_Recently_Used#LRU

MTF(Move-to-front transform)数据转换,布布扣,bubuko.com

时间: 2024-11-08 18:19:27

MTF(Move-to-front transform)数据转换的相关文章

Gym 100342F Move to Front

用树状数组动态和查询修改排名. 树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置, 查询出这个位置,就可以知道这个点的排名了.更改这个点的排名的时候只要把原来位置修改成0,然后在新的位置加上1就行了. 把询问离线,数据范围比较大,先用快排+去重离散(用map也可,就是慢了一点), 很久以前看的了,今天第一次实现 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5,

BWT (Burrows–Wheeler_transform)数据转换算法

转自:http://www.cnblogs.com/xudong-bupt/p/3763814.html 具体分析见:http://blog.csdn.net/windroid/article/details/50570450 1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续或者相邻,之后可以使用其他技术如:Move-to-front trans

CSS3 Transform变形理解与应用

CSS3 Transform变形理解与应用 Transform:对元素进行变形:Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束.Animation:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.可以设置多个关键贞. Transition与Animation:transition需要触发一个事件 ,而animation在不需要触发任何事件的情况下也可以显式的随着时间变化来改变元 素cs

D3、openlayers的一次尝试

近期尝试了一个webgl相关的内容,有些小激动,及时分享一下我的测试示例,效果如下: 此示例分从业务角度分为两部分,一个部分为d3展示的柱图,另一部分则为用openlayers展示的地图.而其难点却在界面的交互效果.实现内容的翻面. 一.翻面效果的实现 此效果看似神奇,理解清楚原理后也还是很简单的.主要用到css3的backface-visibility属性,他表示元素正面运动到用户不可见的位置时,当前元素是否可见. <div class="flip-container">

HTML+CSS鼠标悬停效果

HTML+CSS实现鼠标悬停效果 HTML: <link href="style.css" rel="stylesheet"> <a class="social" href="https://webbb.be" target="_blank"> <div class="front"> <i class="fa fa-facebook&q

css3动画由浅入深总结

回到顶部 一:过渡动画---Transitions 一:过渡动画---Transitions 含义:在css3中,Transitions功能通过将元素的某个属性从一个属性值在指定的时间内平滑过渡到另一个属性值来实现动画功能. Transitions属性的使用方法如下所示: transition: property | duration  | timing-function | delay transition-property: 表示对那个属性进行平滑过渡. transition-duratio

关于方法的学习和应用,递归的应用

一:随机数(seed): package Demo; import javax.swing.JOptionPane; import java.util.Scanner; public class Seed { public static void main(String[]args) { String n=JOptionPane.showInputDialog("请输入你想打印的随机数的个数"); int m=Integer.parseInt(n); int[] a=new int [

css3学习以及移动端开发基本概念的思考

html{ height:1000px; background-color: red; } @media screen and (width:2560px){ html{ background-color: blue; } } 注意:首先必须弄清楚,我们的width/height值得是浏览器的可视区域的大小(缩小或者放大浏览器会发生变化),而device-width和浏览器的缩放是没有关系的.如我的iMac是 2560*1440,那么当我缩小的时候颜色是红色,而全屏的时候颜色就是蓝色了!然而,如

CSS图片翻转动画技术详解

因为不断有人问我,现在我补充一下:IE是支持这种技术的!尽管会很麻烦.需要做的是旋转front和back元素,而不是旋转整个容器元素.如果你使用的是最新版的IE,可以忽略这一节.IE10+是支持的,IE9完全不支持CSS动画. CSS动画非常的有趣:这种技术的美就在于,通过使用很多简单的属性,你能创建出就连皮克斯动画制作公司也会赞叹的漂亮的消隐效果.其中代表性的一种就是CSS图片翻转效果,能让你看到一张卡片的正反两面上的内容.本文就是要用最简单的方法向大家介绍如何创建这种效果. 简单说明:这并不