BWT压缩算法其经典地位无可撼动, 思想真是个奇妙的东西, 废话不多说, 让我们来看看她的奇妙之处吧。

假设有一串字符串S="acaacg", 长度为6, 如果直接对此串进行压缩, 可能是a 1, c 1, a 2, c 1, g 1, 对于更长的串, 由于其随机性, 使得同一个字母的大量重复更多, 因此我们需要一种更好的办法,既能提高压缩效率同时可以完美还原原序列, BWT算法这就登场了:

1, 首先将原字符串开头添加一个结束字符,一般取$, 得到S'="$acaacg",长度为 7

2, 将S'往右轮转,得到一个数组M,它只是一个中间产物, 但是对于后面的理解会有帮助

$acaacg

g$acaac

cg$acaa

acg$aca

aacg$ac

caacg$a

acaacg$

3, 紧接着对这个数组按照字典序排序,得到 M',后续的处理都是基于这个数组,( 请开动您的脑筋, 来一次天马星空吧)

$acaacg

aacg$ac

acaacg$

acg$aca

caacg$a

cg$acaa

g$acaac

4,这里我们定义M' 的第一列为F="$aaaccg", 长度为7,这个看起来挺适合压缩, 但我们的目的还要还原, 而F不能还原成S(自己想想为什么?),

在定义M' 的最后一列为L="gc$aaac",长度为7,g 1, c 1, a 3, c 1, 发现这个序列更有规律,较原序列更易压缩, 这里要说明下矩阵M' 两个性质,

A. L的第一个元素是S中的最后一个元素

B.  对于M' 中的每一行(第一行除外)第一个元素都是最后一个元素在原序列中的下一个元素。(这句请多想想), 例如M' 第2行a, 该行最后一个字母是c, 再回到S中可发现,a就是紧跟c后面的一个字符。也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。

至此, 压缩初步完成,即得到L序列, 后面更完整的压缩是根据L更容易还原的特性来处理, 我们先讲到这里。

5, 现在我们就从L开始还原了,还原之前我们要对M' 矩阵进行统计, F中每个字符(相同字符取第一个)前面有多少个字符,$不计入,总共三个字母a, c, g, 于是得到SF={1,4,6};L中每个字母之前有多少个与自己相同的字母,有这些字母 g, c, a, a, a, c,得到SL={0,0,0,1,2,1},

现在就可以还原了, 首先取L的第一个字母g, 根据性质A它是原序列中的最后一个字母, 再根据B性质,依次还原每个字母的前一个字母,于是为了得到g的前一个字母,我们要找到g开头的序列,M'的最后一行, 然后找到该行最后一个字母c, 就是原序列g的前一个字母,得到cg, 继续找c的前一个字母, 找到以c开头的行,发现有两行, 怎么办, 就要用到刚才统计好的数组了, 刚才的c前面有一个c, 故现在得到的两行中的第二行是我们要找的目标行, 于是c前面的字母就是a,得到acg, 这个a前面有两个a, 所以我们找到M' 中的第四行,那么a的前一个字母就是a,得到aacg,依照此规律开动您的小脑袋继续探索吧。 (如果觉得文字说明太乱,请看下面图示)

上面所讲全是理论性质的, 有兴趣的朋友可以动手谢谢代码, 同时可以参考网上其他朋友已经实现了的代码。

关于FM搜索算法, 未完待续, 恳请各位前辈们多多批评指正, 本人一定多学习借鉴, 谢谢。

BWT压缩算法及FM搜索算法详解相关推荐

  1. A*启发式搜索算法详解 人工智能

    A*启发式搜索算法详解 人工智能 我们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地.路径搜索(Pathfinding)的目标是找到一条好的路径--避免障碍物.敌人,并把 ...

  2. 1-Wire搜索算法详解(1)

    最近一直在proteus上仿真单总线搜索算法,虽然参考了美信公司的应用笔记以及其他的一些资源,仍然没有成功,估计应该是protues问题.这里先转载一篇不错的博文,以供参考. 原文连接 http:// ...

  3. 1-Wire搜索算法详解(2)

    原文连接:http://blog.sina.com.cn/s/blog_57ad1bd20102uxxv.html 1-Wire搜索算法详解(2) 4 实例及算法分析 要理解算法,或制定算法,我们需要 ...

  4. DS18B20 1-WIRE ROM搜索算法详解

    转自:http://blog.sina.com.cn/s/blog_57ad1bd20102uxxw.html 1-WIRE搜索算法详解(1) 0前言 美信公司(http://www.maximint ...

  5. fm算法详解_FM算法原理分析与实践

    一.简介 FM是Steffen Rendle在2010年提出的,FM算法的核心在于特征组合,以此来减少人工参与特征组合工作.对于FM,其优势可分以下三点: FM能处理数据高度稀疏场景,SVM则不能: ...

  6. (DFS)深度优先搜索算法详解

    背景 DFS 英文全称为(Depth First Search),中文简称深度优先搜索算法,其过程为沿着每一个可能的路径向下进行搜索,直到不能再深入为止,并且每一个节点只能访问一次. 算法的搜索遍历图 ...

  7. FM系列—FM+FFM详解

    文章目录 FM 基本思想 模型学习 FM vs SVM FFM 基本思想 模型学习 双线性FFM(Bilinear-FFM) FFM应用 预估CTR/CVR,业界常用的方法有人工特征工程 + LR(L ...

  8. fm算法详解_Python实现FM算法解析

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

  9. fm算法详解_FM算法解析及Python实现

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

最新文章

  1. 问题解决java.lang.IllegalArgumentException at org.springframework.asm.ClassReader
  2. java 数据库连接池 实例_java数据库连接池和数据库连接示例
  3. Hibernate抓取策略
  4. JS转换HTML转义符
  5. 码这么多字只为搞懂如何在Python和Java中使用JSON
  6. java 正则 小数_详解Java判断是否是整数,小数或实数的正则表达式
  7. 只显示小方格_不妨谈谈二维方格子吧
  8. OkHttp3的连接池及连接建立过程分析
  9. 阿里开源的Arthas竟然还不会用?最佳实践来了!
  10. 水滴石穿C语言之指针、数组和函数
  11. 【信仰充值中心】Firefox 97 后续更新一览
  12. LRU算法的实现(STL+模拟)
  13. php中几个操作函数参数的函数func_num_args() func_get_args() func_get_arg($i)php
  14. 20190618每日一句
  15. Landsat-8 介绍
  16. vuejs中根据用户名生成头像背景色
  17. cim系统(cim系统包含哪些部分)
  18. 北大软微计算机动画,【新增】2019年北京大学软微学院【电影方向】考研653、905参考书真...
  19. 985研究生在华为年薪30万,室友同学在美国亚马逊,一晒收入,蒙了!
  20. ABAP ONF4 事件 查找表

热门文章

  1. Linux 认识系统服务(daemon)
  2. Windows10下简约桌面的简单操作方法(无需下载软件)
  3. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类设计
  4. Validator 参数校验springboot整合Validator,自定义手机号参数校验
  5. 免费视频资源 网站 网易学院 webcast csdn课堂 等等
  6. 基于Web的二手房爬虫系统案例
  7. VML与SVG 矢量绘图
  8. Java 100以内找质数(多种方式实现)
  9. 怎么改vue项目的标题_Vue动态修改网页标题的方法及遇到问题
  10. 动量效应 matlab,十万火急!!我的这个动量效应的R语言程序正确么??