BWT(Burrows-Wheeler Transformation)

1.什么是BWT

  压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码。

BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续或者相邻,之后可以使用其他技术如:Move-to-front transform 和 游程编码 进行文本压缩。

2.BWT原理

2.1 BWT编码

  (1)首先,BWT先对需要转换的文本块,进行循环右移,每次循环一位。可以知道长度为n的文本块,循环n次后重复,这样就得到看n个长度为n的字符串。如下图中的“Rotate Right”列。(其中‘#’作为标识符,不在文本块的字符集中,这样保证n个循环移位后的字符串均布相同。并且定义'#'小于字符集中的任意字符)。

(2)对循环移位后的n个字符串按照字典序排序。如下图中的“Sorted (M)”列。

(3)记录下“Sorted (M)”列中每个字符串的最后一个字符,组成了“L”列。(其中"F"列是“Sorted (M)”列中每个字符串的前缀)

这样,原来的字符串“banana#”就转换为了“annb#aa”。在某些情况下,使用L列进行压缩会有更好的效果。“L”列就是编码的结果。

2.2 BWT解码

因为进行的是循环移位,且是循环左移注意下面的性质:

      1、L的第一个元素是Text中的最后一个元素
      2、对于M中的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素。
 也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。
 
这样,就需要
(1)通过"F"列中的元素,找到他前面的字符,就是对应的同一行“L”列;
(2)通过“L”列中的元素,找到他在“F”列中的对应字符位置。但是“L”中有3个字符a,如何对应F中的3个a呢?因为L是F的前一个元素,多个具有相同前缀的字符串排序,去掉共同前缀后相对次序没有变化。所有遇到多个相同的字符,相对位置不变;
(3)转到(1),直到结束。

      排序后的字符串              BWT变换后的字符串


先在BWT变换后的字符串中找到美元符号"$",和它同一行的字母是B,我们先写下,$B找到B之后我们在右边一栏里找B,与其对应的是A

然后记下$BA,

现在A的在左边是第三次出现的,故在右边一栏里找A,同样是第三次出现的,与之对应的是N,然后记下$BAN,左边的N

是第二次出现的,故在右边一栏里找N同样是第二次出现的,与之对应的是A

然后记下$BANA,现在A的在左边是第二次出现的,故在右边,一栏里找A同样是第二次出现的,与之对应的是N,然后记下$BANAN

左边N的是第一次出现的,故在右边一栏里找N同样是第一次出现的,

与之对应的是A,然后记下$BANANA,现在的A在左边是第一次出现的,故在右边一栏里找A同样是第一次出现的,与之对应的是"$",结束。

package cn.genekang.io.test;

import java.util.Arrays;

public class BWTtest {

    public static void main(String[] args) {
String str = "banana";
System.out.println("输入的字符串是:"+str);
String enCodeStr = enCode(str);
System.out.println("编码后的字符串是:"+enCodeStr);
System.out.println("解码后的字符串是:"+deCode(enCodeStr));
} // bwt编码
public static String enCode(String line) {
String str = line + "&";
int len = str.length();
// 1.轮转
char[] charArray = str.toCharArray();
char[][] ch = new char[len][len];
for (int i = 0; i < len; i++) {
char[] c_tmp = charArray.clone();
for (int j = 0; j < len; j++) {
ch[i][j] = c_tmp[j];
if (j <= len - 2)
charArray[j + 1] = c_tmp[j]; }
charArray[0] = c_tmp[len - 1]; }
// 2.排序,按照字典顺序
String[] strings = new String[len];
for (int i = 0; i < len; i++) {
StringBuffer chline = new StringBuffer();
for (char c : ch[i]) {
chline.append(c);
}
strings[i] = chline.toString();
} Arrays.sort(strings);
// 3.取最后一行
StringBuffer sBuffer = new StringBuffer();
for (String s : strings) {
sBuffer.append(s.substring(len - 1, len));
}
return sBuffer.toString();
} // bwt解码
public static String deCode(String str) {
int len = str.length();
String[] strArr = new String[len];
for (int i = 0; i < len; i++) {
strArr[i] = str.substring(i, i + 1) + ":" + i;
}
Arrays.sort(strArr);
// for(String string : strArr)
// System.out.println(string);
StringBuffer sb = new StringBuffer();
int num = 0;
int corr = Integer.parseInt(strArr[0].split(":")[1]);
while (num < len-1) {
sb.append(strArr[corr].split(":")[0]);
corr =Integer.parseInt( strArr[corr].split(":")[1]);
num++;
}
return sb.toString(); } }

BWT(Burrows-Wheeler Transformation)的讲解及java实现的更多相关文章

  1. Programming Assignment 5: Burrows–Wheeler Data Compression

    编程作业五 作业链接:Burrows-Wheeler Data Compression & Checklist 我的代码:MoveToFront.java & CircularSuff ...

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

    1.什么是BWT 压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码. BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续 ...

  3. 第十节:详细讲解一下Java多线程,随机文件

    前言 大家好,给大家带来第十节:详细讲解一下Java多线程,随机文件的概述,希望你们喜欢 多线程的概念 线程的生命周期 多线程程序的设计 多线程的概念 多线程的概念:程序是静态的,进程是动态的.多进程 ...

  4. HDU 4644 BWT(Burrows–Wheeler transform+KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4644 题意:给出一个串,按照下面的步骤得到一个新串: (1)首先将其后面增加一个美元符号: (2)将每 ...

  5. 快捷键和功能键、进入DOS命令行的方法、DOS命令讲解、java跨平台原理、JRE和JDK的定义、书写格式

    快捷键和功能键A:键盘功能键* a:Tab* b:Shift* c:Ctrl* d:Alt* e:空格 * f:Enter* g:Window* h:上下左右键* i:PrtSc(PrintScree ...

  6. 透彻讲解,Java线程的6种状态及切换

    Java中线程的状态分为6种. 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法.2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...

  7. zookeeper基本讲解(Java版,真心不错)

    1. 概述 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 它有如下的一些特点: 简单 Zookeeper的核 ...

  8. SpringTask定时任务实例讲解【Java获取微信公众平台accessToken及jsapiTicket】

    项目中调用微信公众平台的接口时,因为获取到的accessToken及jsapiTicket有效时长只有两个小时,需要不断更新. 所以做了个定时任务,记录一下. .SpringTask实现有两种方式,一 ...

  9. 通俗易懂的讲解一下Java的代理模式

    一.基本概念 代理模式是对象的结构模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用) 二.静态代理 静态代理是指,代理类在程序运行前就已经定义好,其与**目标类 ...

随机推荐

  1. DIV+CSS 网页布局之:两列布局

    1.宽度自适应两列布局 两列布局可以使用浮动来完成,左列设置左浮动,右列设置右浮动,这样就省的再设置外边距了. 当元素使用了浮动之后,会对周围的元素造成影响,那么就需要清除浮动,通常使用两种方法.可以 ...

  2. 怎么样调试正在运行的exe?

    最近在调虚幻的编辑器的时候遇到了一个问题. 调试模式运行UE4Editor.exe 实际上只是一个带参的命令行. 打开后,它又通过这个参数生成了一份详细配置,重新调用了自己.如图 这就悲剧了,断点都没 ...

  3. PDO操作mysql数据库(一)

    PHP连接mysql数据库: <?php$server = "localhost";$user = "root";$pwd = "123456& ...

  4. 【python】【转】if else 和 elif

    else和elif语句也可以叫做子句,因为它们不能独立使用,两者都是出现在if.for.while语句内部的.else子句可以增加一种选择:而elif子句则是需要检查更多条件时会被使用,与if和els ...

  5. Poco之ftp获取文件列表以及下载文件

    #include <iostream>#include <string>#include <vector>#include <algorithm>#in ...

  6. vs2013调试崩溃,重启电脑依旧崩溃

    如果大家遇到 VS断点调试程序崩溃的问题,可以排查是不是有这个问题 VSx新安装了插件 点击工具---扩展和更新  禁用最新安装的程序 一般就没有问题了

  7. QLGame 2d Engine源码地址

    QLGame 2d Engine源码地址已经提交到github上,地址为:https://github.com/wsgzxl/QLGame2dEngine

  8. forward:hello 与 redirect:hello的区别

    对于某些Controller的处理方法,当返回值为String类型时,返回的结果中可能含有forward或redirect前缀: 如: @Controller @RequestMapping(&quo ...

  9. 你晓得吗?大多数企业根本没有做到 DevOps!

    作为当代 IT 企业提升效率的葵花宝典,DevOps 对 IT 企业效率的提升有目共睹 ,一时之间各大企业纷纷用提升效率的 DevOps 开发.协作.管理工具武装自己. 对比 2014 年上半年,CS ...

  10. JQ模仿select

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...