BWT (Burrows–Wheeler_transform)数据转换算法

2023-05-16

原网址:https://blog.csdn.net/luanzheng_365/article/details/78575429

BWT (Burrows–Wheeler_transform)数据转换算法

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解码

  因为进行的是循环移位,且是循环左移注意下面的性质:

      1、L的第一个元素是Text中的最后一个元素

      2、对于M中的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素。

      也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。

 

  这样,就需要

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

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

  (3)转到(1),直到结束。

  因为F列是已经排序的,可以从L列获得,所有只需要保存L列就可以。从L列中的字符获取在F列中的位置时,需要:

  (1)前缀和数组,记录小于当前字符的字符数个数。

  (2)count计数,计算L中从开始位置到当前字符位置等于该字符的字符数。(保证多个相同字符下"L"到“F”的相对位置不变)。

3.BWT文本块编码、解码实例

复制代码


 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <string.h>
 5 using namespace std;
 6 
 7 ///编码,生成last数组
 8 int getLastArray(char *lastArray,const string &str){    ///子串排序
 9     int len=str.size();
10     string array[len];
11 
12     for(int i=0;i<len;i++){
13         array[i] = str.substr(i);
14     }
15     sort(array,array+len);
16     for(int i=0;i<len;i++){
17         lastArray[i] = str.at((2*len-array[i].size()-1)%len);
18     }
19     return 0;
20 }
21 
22 int getCountPreSum(int *preSum,const string &str){
23     memset(preSum,0,27*sizeof(int));
24     for(int i=0;i<str.size();i++){
25         if(str.at(i) == '#')
26             preSum[0]++;
27         else
28             preSum[str.at(i)-'a'+1]++;
29     }
30 
31     for(int i=1;i<27;i++)
32         preSum[i] += preSum[i-1];
33     return 0;
34 }
35 
36 ///解码,使用last数组,恢复原来的文本块
37 int regainTextFromLastArray(char *lastArray,char *reGainStr,int *preSum){
38     int len=strlen(lastArray);
39     int pos=0;
40     char c;
41     for(int i=len-1;i>=0;){
42         reGainStr[i] = lastArray[pos];
43         c = lastArray[pos];
44         pos = preSum[c-'a']+count(lastArray,lastArray+pos,c);
45         i--;
46     }
47     return 0;
48 }
49 
50 int main (){
51     string str("sdfsfdfdsdfgdfgfgfggfgdgfgd#");
52     int preSum[27];
53     int len=str.size();
54 
55     char *lastArray = new char[len+1];
56     char *reGainStr = new char[len+1];
57     lastArray[len]='\0';
58     reGainStr[len]='\0';
59 
60     getCountPreSum(preSum,str);
61     getLastArray(lastArray,str);
62     regainTextFromLastArray(lastArray,reGainStr,preSum);
63 
64     cout<<"       str: "<<str<<endl;
65     cout<<"lastArray : "<<lastArray<<endl;
66     cout<<"reGainStr : "<<reGainStr<<endl;
67 
68     delete lastArray;
69     delete reGainStr;
70     return 0;
71 }  

复制代码

 代码执行输出:

参考:

http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform

http://emily2ly.iteye.com/blog/742869

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BWT (Burrows–Wheeler_transform)数据转换算法 的相关文章

  • 为 R 中具有相同符号的连续数字的每个范围分配一个值

    我正在尝试创建一个数据框 其中存在一列 该列保存表示正数和负数的运行长度的值 如下所示 Time V Length 0 5 2 1 5 1 0 1 1 5 1 5 0 0 0 2 0 2 1 0 2 5 0 0 0 3 0 1 1 75 3
  • 在查找上转换 MongoDB 数据

    是否可以转换 MongoDB 中查找查询返回的数据 举个例子 我有一个first and last用于存储用户名字和姓氏的字段 在某些查询中 我希望仅返回名字和姓氏首字母 例如 Joe Smith 返回为 Joe S 在 MySQL 中SU
  • CSS3 变换比例和容器并溢出

    我正在尝试使用 CSS3 Transform 缩放 为容器创建放大功能 并且一切似乎都运行良好 但是当缩放图像时 溢出仅覆盖图像的一部分 而将左上角部分排除在外溢出 代码如下 HTML div class outer img src htt
  • 如何GPU加速CSS变换?

    我知道有时浏览器会使用 GPU 加速 CSS 转换 但这种情况什么时候发生 有没有办法强制 GPU 加速以获得流畅的动画 本文 http blog teamtreehouse com increase your sites performa
  • 颤振 MatrixGestureDetector 规模所有表情符号变大并在屏幕中跳跃

    这段代码有什么问题 我希望表情符号也像文本一样与文本一起正确缩放 但表情符号会跳跃并变大 如果我只放表情符号也会发生同样的问题 主程序 dart Scaffold appBar AppBar body SizedBox height Get
  • CSS3 旋转 - Firefox 和 Safari 中的渲染问题

    我正在尝试使用 CSS3 属性 旋转 将简单的文本行旋转一定角度 精确1 5度 webkit transform rotate 1 5deg moz transform rotate 1 5deg ms transform rotate 1
  • XSLT 使用命名空间转换 XML

    我正在努力改变一些XML into HTML using XSLT Problem 我无法让它工作 有人可以告诉我我做错了什么吗 XML
  • 如何将 270 度旋转的文本对齐到左上角?

    这应该是一个你会想到的非常简单的问题 我有一个带有一些标题文本的框 我想将其旋转 90 度 我希望它是绝对定位的 以便单词的末尾被轻推到左上角 我可以很容易地将其对齐到底部 但问题是 对于可变长度文本 在对齐到顶部时似乎不可能始终将其保留在
  • 运行 .msi 安装程序后能否确定生成的命令行?

    如果我想要静默安装 是否有任何简单的方法来运行安装程序 选择所需的选项 然后确定等效安装所需的 msiexec 选项 开关 最好没有实际安装任何东西 不要点击 完成 或者您可以通过挖掘 MSI 数据库来找到所需的属性吗 是的 听起来您需要创
  • 不规则 Div 形状 仅扭曲一角

    我如何创建这样的 div 形状 我读过很多技术 但我无法弄清楚这一点 div 内部是不应扭曲的文本 每种技术都受欢迎 但不一定是纯 CSS 我的 HTML 结构 div class intro div class intro header
  • 在 Firefox 中使用缩放变换实现 CSS 过渡效果后的图像移动/跳跃

    我最近遇到一个问题Firefox浏览器版本34 系统 Windows 7 屏幕宽度 1600px 将鼠标悬停在图像上 在某些容器中 后 我通过缩放图像来实现效果 我在用变换 缩放 1 1 with 过渡 变换 0 3s 缓入缓出 但是当我将
  • 如何使用 gdal 通过一个命令将 png 平铺的投影从 epsg:4326 转换为 epsg:3857

    我平铺了 png 文件 这些投影是 EPSG 4326 我使用以下 2 个命令将投影转换为 EPSG 3857 gdal translate of Gtiff a ullr 135 00000000000003 36 59788913307
  • 根据另一个单元格中的值更改单元格中的值

    搜索了这个但找不到方法 我希望能够将一个单元格中的值转换为不同单元格中的另一个值 如下所示 当列中的单元格A包含Y在列中设置相同数量的单元格B to Male或者当列中的单元格A包含N在列中设置相同数量的单元格B价值Female 例如 A2
  • 将 List[Tuple2[A,B]] 转换为 Tuple2[Seq[A],Seq[B]]

    卡在这里 尝试将案例类元组列表转换为序列元组并对结果进行多重分配 val items repo foo list gives me a List A B 我可以像这样完成多项任务 val a b items map 1 toSeq item
  • NuGet 包如何包含 app.config 和 web.config 的转换?

    我正在尝试创建一个 nuget 包 它将添加 DLL 并在正确的配置文件中对其进行配置 该包可以在控制台 表单应用程序或 Web 应用程序中使用 因此我想更新适当的配置文件 app config 或 web config nu spec 文
  • 计算 Matplotlib 文本旋转[重复]

    这个问题在这里已经有答案了 我试图弄清楚如何在 matplotlib 中旋转文本以与图中的曲线对齐 但我还没有弄清楚什么转换可以为旋转文本提供正确的坐标系以匹配数据坐标中的特定斜率 这是绘制一条线并尝试沿其对齐一些文本的最小示例 Make
  • 如何将距离从度转换为米?

    我将 OpenLayers 与普通墨卡托地图一起使用 并尝试通过查找经纬度中的点网格来对边界框进行采样 bbox 以 latlon 表示 例如 48 1388 15 3616 55 2057 3 9359 我可以定义一个距离degrees
  • Unity3D本地尺度问题

    下面的代码 Debug LogWarning updating scale fix scalefactor scaleFactor Current scale is cell transform localScale x cell tran
  • 如何围绕 WPF 中的特定点旋转、平移和缩放控制对象

    我有一个自定义的控件 它是一个矩形 里面有一些细节 但它是一个矩形 我有一个中心点 X Y 我称之为 重心 它 代表 该点 这意味着当我为对象设置新位置时 我希望该点位于设置的位置 当我旋转对象时 我需要它围绕该点旋转 当我缩放对象时 该点
  • css 旋转与过渡似乎会影响其他元素的不透明度?

    我遇到了使用 1s 过渡通过 CSS3 变换旋转 DIV 的问题 在 OSX 10 7 5 上的 Chrome 23 和 Safari 6 中 在 rotate divs 转换期间 其他容器中的字体会稍微变暗 关于造成这种情况的原因以及如何

随机推荐

  • 十套精美个人博客网站模板

    文件资源 点击下载 展示在下方 xff0c 点击你想下载的文件 xff0c 然后点击普通下载就能下载了 紫色的图片博客个人页面模板 红色的微博社交平台HTML模板 响应式生活博客设计网站HTML5模板 程序员个人博客模板 响应式的互联网IT
  • 高性能无锁环形队列 Disruptor

    Disruptor 环形队列 JLog 秒级百G级日志搜集 传输 存储解决方案 高性能无锁队列 Disruptor 高性能队列 Disruptor 使用教程 高性能队列Disruptor框架的详细说明与实战使用 SpringBoot 并发框
  • ubuntu20.04更换阿里的软件源

    新安装的ubuntu20 04的软件源是使用的国外的源 xff0c 因此在使用apt安装软件时速度并不怎么快 xff0c 建议大家更换为国内的源 xff0c 这样在使用apt安装软件时速度会有明显的提升的 ubuntu20 04 apt的配
  • mpi运行窗口无反应或者闪退

    原因有三 1 xff0c 服务未启动 2 xff0c 系统防火墙拦截
  • Newtonsoft.Json使用,C# Json文件读取,写入

    用学校作为例子 xff0c 有学校名称 xff0c 学校下面有班级 xff0c 班级有名字 xff0c 班级下面有学生 xff0c 这里面有数组 xff0c 有字段 using System using System Collections
  • Motrix全能下载工具使用

    Motrix是一款界面简约 功能丰富 专业可靠的全能下载工具 先下载 CSDN下载 Motrix zip下载 官方下载地址 Motrix 打开Motrix xff0c 将种子文件放到这里 开始下载
  • ActiveMQ-JMS(五):ObjectMessage的安全问题

    安全问题 按照apache官网的说明 xff0c 为了避免收到恶意代码 xff0c 引入了安全机制 xff0c 只允许指定的包里的对象能够被传输 原文如下 xff1a ObjectMessage objects depend on Java
  • 剑指offer 03

    span class token keyword class span span class token class name Solution span span class token punctuation span span cla
  • 「得印度者,得天下」聊聊你不知道的印度在线视频江湖

    印度 xff0c 一个神奇古老的国度 千百年来 xff0c 恒河水鉴证了古印度王朝的兴衰更迭 xff0c 壮丽的历史文化 xff0c 和印度文明缘起缘灭的生死轮回 时光飞转 xff0c 来到公元 2018年 恒河水波澜不惊一切如昨 xff0
  • Trinity简介(1)--用于无参考基因组的转录组de novo组装

    一 Trinity简介 Trinity xff0c 是由 the Broad Institute 开发的转录组de novo组装软件 xff0c 由三个独立的软件模块组成 xff1a Inchworm Chrysalis和Butterfly
  • Trinity进行转录组组装(2))

    1 Trinity进行转录组组装 Trinity进行转录组组装的典型命令如下 opt biosoft trinityrnaseq r20131110 Trinity pl seqType fq JM 50G left sample1 1 c
  • python的两种退出方式

    os exit vs sys exit 转自 xff1a http www cnblogs com gaott archive 2013 04 12 3016355 html 概述 python的程序有两种退出方式 xff1a os exi
  • R语言数据类型转化

    R语言数据类型转化 转自 xff1a http www wangluqing com 2014 09 10 r share34 有时候 xff0c 对于一些问题 xff0c 需要进行数据类型之间的转换 R提供了基本类型转换函数以解决数据类型
  • ubuntu20.04安装中文输入法

    虽然搜狗的官网已经宣传说已经支持2004 2010 xff0c 但是支持的并不完美 xff0c 闪退 xff0c 打不出字各种问题不断 xff0c 所以本文带领大家安装几款能够正常使用的中文输入法 但是正在我要发这篇博客的时候 xff0c
  • R语言做柱状图

    R语言做柱状图 转自 xff1a http www phperz com article 16 0102 180120 html 条形图代表在与条成比例的变量的值的长度矩形条数据 R使用函数barplot 来创建柱状图 R能够绘制柱状图垂直
  • R语言 PCA(主成分分析)

    R语言 PCA 转自 xff1a http www cnblogs com longzhongren p 4300593 html 1 关键点 综述 xff1a 主成分分析 因子分析 典型相关分析 xff0c 三种方法的共同点主要是用来对数
  • 使用Pandas对数据进行筛选和排序

    使用Pandas对数据进行筛选和排序 转自 xff1a http bluewhale cc 2016 08 06 use pandas filter and sort html 筛选和排序是Excel中使用频率最多的功能 xff0c 通过这
  • linux 下安装blat软件

    linux 下安装blat软件 blat是一款很经典的比对工具 xff0c 与blast相比 xff0c 具有速度快 共线性输出比对结果等优点 但是 xff0c blat源码包里面的README文件写得很不清楚 xff0c 这里 xff0c
  • 基于统计的压缩算法:游程编码

    原网址 xff1a http www cnblogs com xudong bupt p 3761417 html 基于统计的压缩算法 xff1a 游程编码 1 游程编码概念 游程编码又称 运行长度编码 或 行程编码 xff0c 是一种统计
  • BWT (Burrows–Wheeler_transform)数据转换算法

    原网址 xff1a https blog csdn net luanzheng 365 article details 78575429 BWT Burrows Wheeler transform 数据转换算法 1 什么是BWT 压缩技术主