BWT算法解析及Java语言实现
BWT算法将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续或者相邻,之后可以使用其他技术如:Move-to-fronttransform 和 游程编码 进行文本压缩。
BWT原理:
1. BWT编码
①对需要转换的字符串后加“$”符号($作为标识符,保证n个循环移位后的字符串均布相同),进行循环右移,每次循环一位,记录下每次右移后的结果。
②对循环移位后得到的n个字符串按照字典序排序。
③记录下排序后得到的每个字符串的最后一个字符(得到L字符串)和第一个字符(得到F列)。
例如:apple
序号 |
移位记录M |
排序后NM |
F |
L |
1 |
apple$ |
$apple |
$ |
e |
2 |
$apple |
apple$ |
a |
$ |
3 |
e$appl |
e$appl |
e |
l |
4 |
le$app |
le$app |
l |
p |
5 |
ple$ap |
ple$ap |
p |
p |
6 |
pple$a |
pple$a |
p |
a |
2. BWT解码
因为进行的是循环移位,有如下性质:
① L的第一个元素是输入字符串中的最后一个元素
② 同一行中F是L的下一个元素,L是F的前一个元素。
所以我们就可以得到:
① F字符串可由L字符串推理得到
② 由于F序列中的字符与其相对位置和L序列中的字符与其相对位置是相对应的。因此,在每个字符串中,我们需要记录每个字符的相对位置(相对位置即指在本序列中该字符出现的第几次),例如:
F序列 |
$ |
a |
e |
l |
p |
p |
相对位置 |
1 |
1 |
1 |
1 |
1 |
2 |
L序列 |
e |
$ |
l |
p |
p |
a |
相对位置 |
1 |
1 |
1 |
1 |
2 |
1 |
根据上表,我们可得出原来的字符串:
如上例:字符串最后一位是e,根据L序列的e字符及其相对位置1,找到F序列中对应的(字符e及其相对位置1), 与F序列的e字符及其相对位置1的同一行L序列字符为l其相对位置为1,所以原字符串e的前一位为l。以此类推,可得到原字符串。
参考:http://blog.csdn.net/blackjack_/article/details/73801003
https://www.cnblogs.com/xudong-bupt/p/3763814.html
Java语言实现:
package bwt;import java.util.Arrays;
import java.util.Scanner;public class bwt2 {public static void main(String[] args) {System.out.print("请输入字符串:");Scanner sc = new Scanner(System.in);String str = sc.nextLine();String enCodeStr = enCode(str);System.out.println("编码后的字符串是:"+enCodeStr.split(":")[0]);System.out.println("解码后的字符串是:"+deCode(enCodeStr.split(":")[0],enCodeStr.split(":")[1]));}// bwt编码public static String enCode(String line) {String str = line+"$";int len = str.length();char[] charArray = str.toCharArray();char[][] ch = new char[len][len];char[] c_tmp = charArray.clone();for (int i = 0; i < len; i++) {for (int j = 0; j < len; j++) {ch[i][j] = c_tmp[j];}char zj = c_tmp[len-1];for(int k = len-1;k>0;k--){c_tmp[k]=c_tmp[k-1];}c_tmp[0]=zj;}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);StringBuffer sBuffer = new StringBuffer();StringBuffer sBuffer2 = new StringBuffer();for (String s : strings) {sBuffer.append(s.substring(len - 1, len));}for (String s2 : strings) {sBuffer2.append(s2.substring(0, 1));}return sBuffer.toString()+":"+sBuffer2.toString();}// bwt解码public static String deCode(String str1,String str2) {int len=str1.length();char[] L = str1.toCharArray();char[] F = str2.toCharArray();int [] L1=new int[len];int [] F1=new int[len];for(int i=0;i<len;i++){L1[i]=1;F1[i]=1;}for(int i=0;i<len-1;i++){int num = 1;int num1 = 1;for(int j=i+1;j<len;j++){if(L[i]==L[j] && L1[j]==1){num++;L1[j]=num;}if(F[i]==F[j] && F1[j]==1){num1++;F1[j]=num1;}}}char result[]=new char[len];result[len-1]='$';result[len-2]=L[0];int newlen=len-2;int n1=0;while(newlen>0){for (int i=0;i<len;i++){if(F[i]==L[n1] && L1[n1]==F1[i]){newlen--;result[newlen]=L[i];n1=i;break;}}}String resultline = "";for(int i=0;i<len-1;i++){resultline=resultline+result[i];}return resultline;}
}
BWT算法解析及Java语言实现相关推荐
- java 离散算法_用JAVA语言实现离散数学算法
用JAVA语言实现离散数学算法 用JAVA语言实现离散数学算法 * 显示离散数学算法的真值表 * 提供将一个中缀合适公式的真值表输出到某一PrintStream流中的功能 * 以单个大写字母表示变量( ...
- 算法与数据结构java语言描述 英文版_CVPR2020 |室内设计师失业?针对语言描述的自动三维场景设计算法...
近日,计算机视觉顶会CVPR 2020接收论文结果公布,从6656篇有效投稿中录取了1470篇论文,录取率约为22%.在<Intelligent Home 3D: Automatic 3D-Ho ...
- 银行家算法课程设计java语言_Java语言的银行家算法
<Java语言的银行家算法>由会员分享,可在线阅读,更多相关<Java语言的银行家算法(12页珍藏版)>请在人人文库网上搜索. 1.湖北中医学院信息技术系 操作系统课程设计操作 ...
- Josephus Problem的详细算法及其Python, Java语言的实现
笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0. ...
- 排序算法之插入排序--Java语言
插入排序是一种简单且有效的比较排序算法.在每次迭代过程中算法从输入序列中移除一个元素,并将该元素插入待排序序列的正确位置.重复该过程,直到所有输入元素都被选择一次. 算法优点: a.实现简单 b.数据 ...
- JAVA、PHP身份证、统一社会信用代码算法解析验证
JAVA.PHP身份证算法解析验证 JAVA身份证号算法解析验证(待更新) JAVA统一社会信用代码算法解析验证(待更新) PHP统一社会信用代码算法解析验证 JAVA.PHP身份证算法解析: 其实上 ...
- 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...
商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...
- python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析
本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...
- A*算法解决八数码问题 Java语言实现
A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...
最新文章
- JESD204B概述
- Nignx平滑升级(1.8.0-1.8.1)
- 论文阅读:Multi-Scale Triplet CNN for Person Re-Identification
- Trie Tree 实现中文分词器
- The Water Bowls POJ - 3185(开关问题+暴力)
- oracle删除重复字段数据库,用Oracle的分析函数删除重复的数据,
- 2017年的第一周,你吸了多少雾霾?R语言告诉你(代码)
- 推荐PDG阅读器UnicornViewer
- NETBEAN 启动报错 CANNOT LOCATE JAVA INSTALLATION IN SPECIFIED JDKHOME的解决办法
- android 颜色抓取工具,颜色抓取(Color Grab)
- 离散实验一 油管铺设 (求最小生成树的Prim算法的实际应用)
- 蓄电池维护——蓄电池的基本构造和原理
- 日本计划建造世界上速度最快的超级计算机
- 安徽计算机在职研究生学校,安徽在职研究生招生学校2020
- 教育邮箱通知获取(通过QQ邮箱代发)
- 蓝桥杯 历届试题 小数第n位(C语言)
- DataTable属性详解
- matlab变量及操作
- python bokeh_使用 Bokeh 为你的 Python 绘图添加交互性
- 数电实验七:译码显示电路