Skip to content

模型Model

Wavelet Tree

施工中 · 内容逐步修订

wavelet tree · 小波树

递归划分有序字母表,并用节点位向量映射序列位置以支持 access、rank、select 与区间选择。

形式陈述 ​

构造 ​

对序列 S[0..n)、固定 σ≥1 的有序字母表 [0,σ),递归构造一棵二叉树:根把字母表分成左右两半,并写位向量 B:元素进左半记 0、右半记 1;按位稳定分割得到两个子序列,递归直到单字母。每次把字母区间分成大小相差至多一的两半,奇数个字符时左半多一个,树高为 h=⌈log2⁡σ⌉。若字符 c 的叶深度为 dc、出现次数为 fc,位向量本体共有 B=∑cfcdc≤nh 位。σ 不是二的幂时,叶深度可能不同,最后一层也未必仍有 n 位。

位置映射 ​

access(i) 读根位 b=B[i],到相应孩子的位置是 rankb(B,i),沿路恢复字符。rankc(i) 按字符 c 的固定路径映射前缀长度;selectc(k) 从字符 c 的叶开始,令局部零基位置 j=k−1;每次向父节点移动时,若来自其 b 孩子,就令 j=selectb(B,j+1)。最后得到原序列下标。若位置、字符编号和计数各能装入一个机器字,且每层 access/rank/select 为常数成本,三种操作都是 O(1+log⁡σ)。空序列的 rank 为零,access/select 无有效位置;σ=1 时无需任何位向量,合法查询直接由长度和唯一字符回答。

区间第 k 小 ​

对合法半开区间 0≤l<r≤n 和整数 1≤k≤r−l,左子区间元素数是

z=rank0(r)−rank0(l).

若 k≤z 就映射到左子区间,否则令 k←k−z 并进右子区间。日志查询中这可直接求时间区间内第 k 小状态码,不必抽取排序。

直觉

每层位向量既记录字符落入字母表哪一半,也用 rank 把父序列位置稳定映射到对应子序列。查询携带的位置或区间随路径不断收缩,到叶便恢复字符;区间第 k 小则用左侧元素数决定进入哪一半并调整秩。

Wavelet Tree示意图
例子与边界

边界与消歧 ​

rank 端点若一处含 i、一处不含,会让位置逐层漂移。空间须分别计算位向量、rank/select 索引和树结构;不能把“树高约为 log⁡σ”写成每一层都恰有 n 位。Huffman-shaped、wavelet matrix 和熵压缩需另写保证。动态更新要维护各层位向量,不由静态结构自动支持。Wavelet tree 与信号处理的小波变换只同名,不做数值基函数分解。

推论与应用

构建与范围计数 ​

按字符全序稳定分割各节点序列,产生位向量的工作为 O(n(1+log⁡σ));若显式建立整个字母表树,再加 O(σ)。实际只建非空节点可避免空子树,字母表的坐标压缩与映射仍须另计。

基本指针版本的位向量不超过 n⌈log2⁡σ⌉ 位,树和节点区间等元数据另占 O(σlog⁡(n+σ)) 位;各短位向量的索引头也必须计入,不能只把单张长位串的 o(n) 逐节点照抄。采用统一的位向量编码与索引,可以得到经典上界 n⌈log2⁡σ⌉+o(n)log⁡σ+O(σlog⁡n)(取已编码、2≤σ≤n 的字母表)。进一步改变平衡划分形状,并把各层拼入一个可导航大位串,可以去掉拓扑指针项;这是另一个具体表示方案,不是任意指针树都自带的空间界。

区间内值落在 [a,b] 的计数可沿字母表树递归:节点字母区间完全包含就返回当前位置区间长度,不交则零,部分相交时用 rank 映射到孩子。时间 O(1+log⁡σ) 的界来自值区间的树分解:每层至多两个节点与查询边界部分相交,报告所有位置仍需加输出成本。

区间映射的完整轨迹 ​

图取等价的字符编号 [1,6],原串为 (3,1,4,1,5,2,6,2)。完整树各内部节点位向量的长度为 8,5,3,4,2,合计 22 位,小于上界 8⌈log2⁡6⌉=24,也说明它不等于 8log2⁡6。

查询原区间 [1,7) 的第三小值,根先映到左区间 [1,4),再映到 [0,3)。在字符 1,2 的最后分叉,左边有两个 1,所以把 k=3 改成 k=1 进入右叶,返回 2;直接排序该区间得到 (1,1,2,4,5,6),核对一致。

在节点位向量 B 上,父区间 [l,r) 映到左孩子为

[rank0(l),rank0(r)),

映到右孩子为 [rank1(l),rank1(r))。区间长度始终等于当前字母范围内的元素数,这是沿层递归的核心不变量。

求第 k 小时先计算左段数量 z=rank0(r)−rank0(l)。若 k≤z,携原 k 进入左孩子;否则进入右孩子并令 k←k−z。到叶时字母范围只剩一个值,它就是答案。若 k 从 1 开始,判断必须是 k≤z;改成 0-based 时条件和减量要一起改。

构建每层必须稳定分割,否则下一层位置不再对应原区间的相对次序。动态插入不仅要在根位向量插一位,还要沿路径在子序列对应位置插入,静态 packed bit vector 的空间与时间结论不能原样复用。

参考资料
  • Roberto Grossi, Ankur Gupta, Jeffrey Vitter, High-Order Entropy-Compressed Text Indexes, SODA, 2003.
  • Gonzalo Navarro, Wavelet Trees for All, Journal of Discrete Algorithms 25, 2014, pp. 2–20;作者会议版,§2 的基本表示、Tracking symbols 与 Reducing redundancy。
关系图谱11 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

被这些条目使用