图解BWT(Burrows-Wheeler Transform) 算法

Burrows-Wheeler Transform (BWT) 是一种数据转换算法, 主要用于数据压缩领域. 它由 Michael Burrows 和 David Wheeler 在 1994 年提出, 广泛应用于无损数据压缩算法(如 bzip2)中. BWT 的核心思想是通过重新排列输入数据, 使得相同的字符更容易聚集在一起, 从而提高后续压缩算法的效率.


1. BWT 的基本概念

BWT 是一种可逆的变换, 它不会改变数据的内容, 而是通过重新排列数据的顺序, 使得数据更容易被压缩. BWT 的主要特点是:

  • 局部相似性增强: 将输入字符串中的相似字符聚集在一起.
  • 可逆性: 变换后的数据可以通过逆变换恢复为原始数据.

2. BWT 的算法步骤

2.1 Naive 方法

BWT 的算法步骤如下:

步骤 1: 生成所有循环移位

假设输入字符串为 S, 长度为 n. 首先, 生成 S 的所有循环移位(cyclic rotations).

例如, 对于字符串 "banana$"($符号是结束符, 不存在于输入串中), 其循环移位包括:

banana$
anana$b
nana$ba
ana$ban
na$bana
a$banan
$banana

这里请读者思考一个问题: 如果没有结束符$, 那么是否能够恢复原始字符串?

步骤 2: 按字典序排序

将所有循环移位按字典序排序. 排序后得到的结果被称为BW矩阵. 对于 "banana$", 排序后的结果为:

$banana
a$banan
ana$ban
anana$b
banana$
na$bana
nana$ba
步骤 3: 提取最后一列

从排序后的循环移位中提取最后一列字符, 形成 BWT 变换后的字符串. 对于 "banana$", 最后一列是:

$banan[a]
a$bana[n]
ana$ba[n]
anana$[b]
banana[$]
na$ban[a]
nana$b[a]

因此, BWT 变换后的结果为 "annb$aa".

再举一些例子:

字符串 BWT
"mississippi$" "ipssm$pissii"
a_friend_in_need_is_a_friend_indeed$" "dsaadddn$_enneneednii__rr___ieei_ffi"
"It_was_the_best_of_times,_it_was_the_worst_of_times$" "ss$e,ttssfftteww_hhmmbootttt_ii__woeeaaressIi_______"

从这些例子可以看出, 相同的字母容易成块出现.

代码实现
def bwt_transform(s):
    """对字符串 s 进行 BWT 变换"""
    s = s + '$'
    n = len(s)
    # 生成所有循环移位
    rotations = [s[i:] + s[:i] for i in range(n)]
    # 按字典序排序
    rotations_sorted = sorted(rotations)
    # 提取最后一列
    last_column = ''.join([row[-1] for row in rotations_sorted])
    return last_column

2.2 使用 SA 数组高效计算 BWT

观察上面的例子, 可以发现: 由于'$'符号的 ASCII 小于任何一个字母(a-z,包含大小写), 这意味着比较时不会用到$符号之后的字符串, 可以删去他们. 排序结果等价于后缀数组.

Bwt vs SA

解决了排序问题之后接着需要关注第二个问题, 即最后的字母的确定. 这个问题比较简单, 因为所有的序列都是循环产生的, 所以序列的最后一位字母其实就是首字母的左侧字母. 用公式表示就是:

B W T [ i ] = { S [ S A [ i ] − 1 ] if  S A [ i ] > 0 $ if  S A [ i ] = 0 BWT[i] = \begin{cases} S[SA[i] - 1] & \text{if } SA[i] > 0 \\ \$ & \text{if } SA[i] = 0 \end{cases}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/965410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek辅助学术写作【句子重写】效果如何?

句子重写(功能指数:★★★★★) 当我们想引用一篇文章中的一-些我们认为写得很好的句子时,如果直接将原文加人自己的文章,那么即使我们标注上了引用,也依旧会被查重软件计算在重复比例中。查重比例过高的话,会影响投稿或毕业答辩送…

【CAD】卸载清理注册表后安装失败/错误 1402无法打开主键:UNKNOWN Components DAFE。。。

这是因为注册表中的 CurrentVersion\Installer\UserData二级子目录中Components的文件缺少权限,只需要将权限添加为administors即可 一图流,就是把权限给到Administrators,然后就再以管理员权限安装就可以了,还有如果破解的软件可…

w192中国陕西民俗网的设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

2.6日学习总结

题目一&#xff1a; AC代码&#xff1a; #include <stdio.h>// 宏 _for 用于简化 for 循环 #define _for(i, a, b) for (int i (a); i < (b); i)// 最大节点数 #define MAXN 1000010// 树节点结构体 typedef struct {int left;int right; } Node;// 树节点数组 Nod…

【数据结构】(4) 线性表 List

一、什么是线性表 线性表就是 n 个相同类型元素的有限序列&#xff0c;每一个元素只有一个前驱和后继&#xff08;除了第一个和最后一个元素&#xff09;。 数据结构中&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列。 二、什么是 List List 是 Java 中的线性…

工控机的主要功能有那些?

工控机的主要功能包括&#xff1a;数据采集与处理&#xff0c;工控机可以连接多种传感器和输入设备&#xff0c;实时采集数据&#xff0c;并进行必要的处理和分析。其次 就是控制执行&#xff1a;在自动化生产线或机器人控制系统中&#xff0c;工控机根据预设的程序或实时数据执…

链式结构二叉树(递归暴力美学)

文章目录 1. 链式结构二叉树1.1 二叉树创建 2. 前中后序遍历2.1 遍历规则2.2 代码实现图文理解 3. 结点个数以及高度等二叉树结点个数正确做法&#xff1a; 4. 层序遍历5. 判断是否完全二叉树 1. 链式结构二叉树 完成了顺序结构二叉树的代码实现&#xff0c;可以知道其底层结构…

凝思60重置密码

凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式&#xff0c;在此模式下&#xff0c;用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动&#xff0c;解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…

MDPI的论文书写

一、作者信息 二、摘要 1、先写背景&#xff0c;将问题放到大背景里面&#xff0c;然后重点说明研究的目的。

2-kafka服务端之延时操作实现原理

文章目录 背景案例延时生产实现原理延时拉取实现原理 总结 背景 上篇我们说到了kafka时间轮是延时操作内部实现的重要数据结构&#xff0c;这篇我们来说下kafka内部的延时操作实现原理。这里我们以延时生产和延时拉取为例说明延时操作的实现原理。 案例 延时生产 我们知道如…

无心剑七绝《深度求索》

七绝深度求索 深研妙理定乾坤 度世玄机启智门 求路千难兼万险 索萦华夏自为尊 2025年2月1日 平水韵十三元平韵 无心剑七绝《深度求索》以平水韵十三元平韵写成&#xff0c;意境深远&#xff0c;气势磅礴。诗中“深研妙理定乾坤”开篇点题&#xff0c;展现出对深奥道理的钻研与探…

C++多级指针图解

AudioResample **pResample 指针的地址图解AudioResample **pResample; // pResample 存储 AudioResample* 的地址 AudioResample *ar *pResample; // ar 现在指向 AudioResample 结构体 pResample → 指向 AudioResample* 的地址 (0x2000)*pResample → 取出 AudioResample…

oracle基础语法

oracle基础语法 1、增删改查1.1查询语句1.2 修改语句1.3 删除表1.4 删除数据1.5 增加数据1.6 创建视图1.7 添加视图字段注释 1、增删改查 oracle与sql server语法上大致相同&#xff0c;但有些细微的不同&#xff0c;以下是我个人记录工作中常用到的一些语法句。 1.1查询语句…

数据库------------

一 mysql ----数据库就相当于一个端口 1. 三层结构 1&#xff09;数据库中 表的本质仍然是文件 1.1 mysql常用数据类型---&#xff08;即 mysql列类型&#xff09; 1&#xff09; 数值类型 2&#xff09; 文本类型 3&#xff09; 二进制数据类型 4&#xff09;日期类型 2. sq…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…

25/2/6 <机器人基础> 运动学中各连杆的变换矩阵求法

变换矩阵 机器人通常包含多个关节和连杆&#xff0c;每个关节和连杆都有自己的局部坐标系。变换矩阵能够将一个点或向量从一个坐标系转换到另一个坐标系&#xff0c;从而实现对机器人各个部件位置和姿态的统一描述 变换矩阵能够将复杂的运动分解为旋转和平移的组合。通过矩阵乘…

CS 与 BS 架构的差异

在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…

Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践

Vuex 是 Vue.js 中的状态管理模式&#xff0c;广泛应用于 Vue 2 和 Vue 3 中&#xff0c;其内部实现存在一些差异。 1. 什么是 Vuex &#xff1f; Vuex 是 Vue.js 官方提供的状态管理库&#xff0c;用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状…

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天&#xff0c;IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上&#xff0c;IP属地的显示往往让人联想到用户的地理位置。然而&#xff0c;关于IP属地到底与手机号还是手机位置有关&#xff0c;却存在着不少误解和混淆。本文将深入…

【C语言高级特性】预处理指令(二)

目录 一、取消宏定义&#xff08;#undef&#xff09; 1.1. 详细介绍 1.2. 代码示例 1.3. 使用场景 1.4. 注意事项 二、#line 指令 2.1. 详细介绍 2.2. 代码示例 2.3. 使用场景 2.4. 注意事项 三、#error 和 #warning 指令 3.1. #error 3.2. #warning 3.3 注意事项…