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数据编码:
#include <iostream>
#include <algorithm>
#include <string>
#include <list>
using namespace std; int MTF_transform(const string &text,int* result_MTF,list<char> &mylist){
list<char>::iterator it;
for(int i=;i<text.size();i++){
it=find(mylist.begin(), mylist.end(),text[i]); ///查找当前字符
result_MTF[i]=distance(mylist.begin(),it); ///保存当前字符在mylist中的索引
mylist.erase(it); ///删除元素
mylist.push_front(text[i]); ///把当然元素添加到index为0的位置
}
return ;
} int main(int argc,char* argv[])
{
string text = "bananaaa";
int *result_MTF = new int[text.size()];
list<char> mylist;
for(int i=;i<;i++){
mylist.push_back('a'+i);
} MTF_transform(text,result_MTF,mylist);
for(int i=;i<text.size();i++){
cout<<result_MTF[i]<<" ";
}
delete [] result_MTF;
return ;
}
参考:http://en.wikipedia.org/wiki/Move-to-front_transform
额外阅读:http://en.wikipedia.org/wiki/Least_Recently_Used#LRU
MTF(Move-to-front transform)数据转换的更多相关文章
- EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...
- Gym 100342F Move to Front (树状数组动态维护和查询)
用树状数组动态和查询修改排名. 树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置, 查询出这个位置,就可以知道这个点的排名了.更改这个点的排名的时候只要把 ...
- [IR] BWT+MTF+AC
BWT (Burrows–Wheeler_transform)数据转换算法 MTF(Move-to-front transform)数据转换 基于统计的压缩算法:游程编码 良心PPT: bwt_bas ...
- BWT (Burrows–Wheeler_transform)数据转换算法
1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续 ...
- CSS3之3D效果中的transform运用
css3中添加了很多新的标签 属性 描述 css transform 向元素应用 2D 或 3D 转换. 3 transform-origin 允许你改变被转换元素的位置. 3 transform-s ...
- 关于css3中transform的理解(只是改变状态未改变其真正的属性)
众所周知,在css3中可以用animation实现动画效果,在这里用一个transform:translateX举例. <div class="div1"></d ...
- transform做2d和3d变形(css动画一)
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 有段时间我是没理清transform.translate.transition和animation之间的关 ...
- Drag(拖拽)和Move(移动)两个脚本
Drag using System.Collections; using System.Collections.Generic; using UnityEngine; public class Dra ...
- SVG.js 元素操作整理(二)-Transform
一.transform()获取或设置矩阵变换 var draw = SVG('svg1').size(300, 300); //Transforming SVG元素矩阵变换 var rect = dr ...
随机推荐
- php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法
而关于php的也有,但是大多都是用phpExcel导出的方法或者spreadsheet等类或者控件之类的导出方法,而我所在维护的系统却用很简单的方法,如下,网上很少有讲如何设置要导出数据的EXcel格 ...
- js-方法
最近觉得自己的基础貌似太薄弱了,找了几本电子书,整理了一下基础的 方法: Concat:返回一个新数组 var a=['a','b','c']; var b=['x','y','z']; var c= ...
- 从oracle数据表中读取表结构
drop table aa_tab;create table aa_tab asselect A.TABLE_NAME 表名, A.column_name 字段名,A.data_type 数据 ...
- sql cross join table
A 表数据如下图所示 B表数据如下图所示
- 统一的mvc异常处理
mvc异常处理 using System; using System.Configuration; using System.Web.Mvc; using Infrastructure.Excepti ...
- 查看IIS哪个应用程序池占用CPU过高
1. 进入cmd 2. %systemroot%\system32\inetsrv\AppCmd.exe list wp 这样就能找到活动的应用程序池的PID了 3. 对照资源管理器的PI ...
- 数据库的Instance/Crash Recovery
crash recovery是指单实例数据库发生了failure.或者rac数据库中的所有实例都发生了failure后进行的recovery.rac数据库crash后,rac中第一个重启启动的inst ...
- 20145320《Java程序设计》第五次实验报告
20145320<Java程序设计>第五次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18: ...
- 小试牛刀C#作为脚本语言执行解密
背景 我们知道Unity3d是通过C#脚本语言的形式来实现游戏的逻辑代码编写,同样SCOTT服务器也设置了通过C#脚本来实现游戏逻辑,但是本文并不是想真正分析解密他们的运行机制,只是想通过自己的一个需 ...
- wampserver---------如何让局域网其他电脑访问我的apache
wamp版本:wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 修改方式,看图:修改完记得重启.