BWT (Burrows–Wheeler_transform) 解码分析

news/2024/11/13 3:50:53/

原文地址:
BWT (Burrows–Wheeler_transform)数据转换算法
原文讲解十分详细,但关键地方有点绕,故作分析注释

这里写图片描述

  因为进行的是循环移位,且是循环左移注意下面的性质:
  1、L的第一个元素是Text中的最后一个元素
  2、对于M中的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素。
     也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。

这里就是说:F列和L列,相同次序的元素,是相邻关系
具体是:相同次序时,L列的元素是F列的前一个
例如:
F[1] == ‘#’ L[1] == ‘a’ , ‘a’在’#’的前面(循环来看)
F[5] == ‘b’ L[5] == ‘#’ , ‘#’在’b’的前面


  这样,就需要
  (1)通过”F”列中的元素,找到他前面的字符,就是对应的同一行“L”列;

因为F列是按字母序排列的,而我们的标记字符“#”又小于所有的文本字符,所以:F[1]一定是我们的标记字符“#”

这样,根据上面的结论:相同次序时,L列的元素是F列的前一个,可以得到:L[1] == ‘a’就是原字符串的最后一个字符


  (2)通过“L”列中的元素,找到他在“F”列中的对应字符位置。但是“L”中有3个字符a,如何对应F中的3个a呢?因为L是F的前一个元素,多个具有相同前缀的字符串排序,去掉共同前缀后相对次序没有变化。所有遇到多个相同的字符,相对位置不变;

上一步我们找到了原字符串的最后一个字符,就是L[1] == ‘a’,那么下一步呢?

既然我们刚刚根据字符串的第一个字符找到了它的前一个字符(通过“#”找到了“a”),那么我们就可以继续找“a”的前一个字符,如此重复,就完成了解码的任务。

如何找“a”的前一个字符?还是继续利用我们最开始的结论:相同次序时,L列的元素是F列的前一个,只要找到“a”在F列中的位置x,就可以知道“a”的前一个元素为L[x]

但问题是,F中有多个“a”,如何确定哪一个“a”对应的是我们现在的“a”?
即:是否可以找到 L和F中重复元素的对应关系


这句话很关键:

因为L是F的前一个元素,多个具有相同前缀的字符串排序,去掉共同前缀后相对次序没有变化。

  • 先来看L列的排列方式。
    因为我们知道:相同次序时,L列的元素是F列的前一个 (又是这个),而F列是循环右移得到的字符串,按字母序排列后,每个串的第一个字母。
    换句话说就是:
    L列按每个元素后面的字符串的字母序排列

  • 再来看F列的排列方式。
    F列按字母序排列,而我们可以把字母序排列这样描述:

    • 当首字母不同时,按首字母的字母序排列;
    • 当首字母相同时,按后面的字符串的字母序排列

这里我们就能发现,当首字母相同时,为得到L列和F列而使用的排列方式是相同的,而首字母相同就是L列和F列中的重复元素。

这里写图片描述

换句话说,我们把L列中的“a”和F列中的“a”按从前往后或者从后往前的顺序取出,他们本就是一一对应的。

整个解码的问题到这里就结束了。



http://www.ppmy.cn/news/669513.html

相关文章

BWT算法

BWT算法 来自mengbi_er BWT算法可以将原文本转换成相似文本,并且可以用其他技术进行压缩。 编码方式 (1) 将文本串后加一个文本中不会出现的字符‘#’。(定义#小于文本串中任一字符) (2) 将…

一阶BWT过程

BWT是一种以数据块为操作对象的可你的数据变换方法,其核心思想是对字符串循环移动后得到字符矩阵进行排序和变换。也就是对参考基因组进行了一次有规律的重新排序,变换的目的就是为了方便后续进行查找。 一阶BWT构造和查找的具体过程如下: 一…

C++读取BWT901CL传感器的数据

1 简述 最近在学习人体姿态设别的算法。想着买个角度传感器去尝试下。这个传感器最好是无线的带电池的,这样对我来说是比较方便使用的。我就在淘宝上找到一个一款BWT901CL,这个角度传感器。这个模块挺好用的,有加速度、角速度、角度。而且都…

学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信;需要看产品文档的可以直接官网搜索文档&am…

BWT压缩算法及FM搜索算法详解

BWT压缩算法其经典地位无可撼动, 思想真是个奇妙的东西, 废话不多说, 让我们来看看她的奇妙之处吧。 假设有一串字符串S"acaacg", 长度为6, 如果直接对此串进行压缩, 可能是a 1, c 1, a 2, c 1, …

Spring计时器StopWatch

文章目录 StopWatch介绍StopWatch属性详解StopWatch方法详解StopWatch使用示例 StopWatch介绍 StopWatch类是Spring框架中用于测量代码执行时间的工具类,它提供了一系列属性来记录监测信息。 本文基于spring-boot-starter-web:2.2.2RELEASE版本。 源码&#xff1…

BWA/BWT 比对软件

名称 bwa – Burrows-Wheeler Alignment Tool 内容 摘要 描述 命令行与选项 SAM 比对格式 短序列比对注意事项 比对精确性 估计插入大小分布 内存需求 速度 Bwa-0.6中的改变 其他 作者 引用与授权 历史 摘要 b w a i n d e x r e f . f a b w a m e m r e f . f …

STM32读取BWT901CL传感器数据

1 简述 最近想做一个检测小孩或者是老人,在家摔倒项目。大致和大家说一下项目的框架。 要用到一个能检测运动姿态的传感器,最好是无线的。于是我在网上找了一款带蓝牙的姿态角度传感器。给大家看下这个模块。 下面和大家分享下代码 2 程序设计 串口…