BWT(Burrows-Wheeler Transformation)的讲解及java实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了BWT(Burrows-Wheeler Transformation)的讲解及java实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2919字,纯文字阅读大概需要5分钟。
内容图文
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解码
因为进行的是循环移位,且是循环左移注意下面的性质:
排序后的字符串 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编码publicstatic String enCode(String line) { String str = line + "&"; int len = str.length(); // 1.轮转char[] charArray = str.toCharArray(); char[][] ch = newchar[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解码publicstatic 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(); } }
原文:http://www.cnblogs.com/6tian/p/4076539.html
内容总结
以上是互联网集市为您收集整理的BWT(Burrows-Wheeler Transformation)的讲解及java实现全部内容,希望文章能够帮你解决BWT(Burrows-Wheeler Transformation)的讲解及java实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。