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语言实现相关推荐

  1. java 离散算法_用JAVA语言实现离散数学算法

    用JAVA语言实现离散数学算法 用JAVA语言实现离散数学算法 * 显示离散数学算法的真值表 * 提供将一个中缀合适公式的真值表输出到某一PrintStream流中的功能 * 以单个大写字母表示变量( ...

  2. 算法与数据结构java语言描述 英文版_CVPR2020 |室内设计师失业?针对语言描述的自动三维场景设计算法...

    近日,计算机视觉顶会CVPR 2020接收论文结果公布,从6656篇有效投稿中录取了1470篇论文,录取率约为22%.在<Intelligent Home 3D: Automatic 3D-Ho ...

  3. 银行家算法课程设计java语言_Java语言的银行家算法

    <Java语言的银行家算法>由会员分享,可在线阅读,更多相关<Java语言的银行家算法(12页珍藏版)>请在人人文库网上搜索. 1.湖北中医学院信息技术系 操作系统课程设计操作 ...

  4. Josephus Problem的详细算法及其Python, Java语言的实现

      笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0. ...

  5. 排序算法之插入排序--Java语言

    插入排序是一种简单且有效的比较排序算法.在每次迭代过程中算法从输入序列中移除一个元素,并将该元素插入待排序序列的正确位置.重复该过程,直到所有输入元素都被选择一次. 算法优点: a.实现简单 b.数据 ...

  6. JAVA、PHP身份证、统一社会信用代码算法解析验证

    JAVA.PHP身份证算法解析验证 JAVA身份证号算法解析验证(待更新) JAVA统一社会信用代码算法解析验证(待更新) PHP统一社会信用代码算法解析验证 JAVA.PHP身份证算法解析: 其实上 ...

  7. 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...

  8. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  9. A*算法解决八数码问题 Java语言实现

    A*算法解决八数码问题 Java语言实现 参考文章: (1)A*算法解决八数码问题 Java语言实现 (2)https://www.cnblogs.com/beilin/p/5981483.html ...

最新文章

  1. JESD204B概述
  2. Nignx平滑升级(1.8.0-1.8.1)
  3. 论文阅读:Multi-Scale Triplet CNN for Person Re-Identification
  4. Trie Tree 实现中文分词器
  5. The Water Bowls POJ - 3185(开关问题+暴力)
  6. oracle删除重复字段数据库,用Oracle的分析函数删除重复的数据,
  7. 2017年的第一周,你吸了多少雾霾?R语言告诉你(代码)
  8. 推荐PDG阅读器UnicornViewer
  9. NETBEAN 启动报错 CANNOT LOCATE JAVA INSTALLATION IN SPECIFIED JDKHOME的解决办法
  10. android 颜色抓取工具,颜色抓取(Color Grab)
  11. 离散实验一 油管铺设 (求最小生成树的Prim算法的实际应用)
  12. 蓄电池维护——蓄电池的基本构造和原理
  13. 日本计划建造世界上速度最快的超级计算机
  14. 安徽计算机在职研究生学校,安徽在职研究生招生学校2020
  15. 教育邮箱通知获取(通过QQ邮箱代发)
  16. 蓝桥杯 历届试题 小数第n位(C语言)
  17. DataTable属性详解
  18. matlab变量及操作
  19. python bokeh_使用 Bokeh 为你的 Python 绘图添加交互性
  20. 数电实验七:译码显示电路

热门文章

  1. 【PAT甲】A1019
  2. Java比较器-Comparable和Comparator
  3. windows- 怎么查看本地网卡速度
  4. 大数据技术十大核心原理 1
  5. javascript小练习之给表格中数据排序
  6. IDEA第二章----配置git、tomcat(热部署)、database,让你的项目跑起来
  7. 2.2 allure
  8. Spring Security使用记录
  9. Adaptive Autosar 整体架构理解
  10. dialog框dismiss之后,键盘隐藏之后,键盘再次弹起的问题