形式陈述
构造
对序列理路序列Sequence以自然数为定义域的函数。 、固定 的有序字母表 ,递归构造一棵二叉树理路二叉树Binary tree由空树或根节点及左右两个子树槽位递归组成的有限结构;单孩子所在的左右位置也属于树形。:根把字母表分成左右两半,并写位向量 :元素进左半记 0、右半记 1;按位稳定分割得到两个子序列,递归直到单字母。每次把字母区间分成大小相差至多一的两半,奇数个字符时左半多一个,树高为 。若字符 的叶深度为 、出现次数为 ,位向量本体共有 位。 不是二的幂时,叶深度可能不同,最后一层也未必仍有 位。
位置映射
access 读根位 ,到相应孩子的位置是 rank理路Rank 与 Select 查询Rank and select在位串上计算前缀频数或定位第 j 次出现,并固定端点和索引约定。,沿路恢复字符。rank 按字符 的固定路径映射前缀长度;select 从字符 的叶开始,令局部零基位置 ;每次向父节点移动时,若来自其 孩子,就令 。最后得到原序列下标。若位置、字符编号和计数各能装入一个机器字,且每层 access/rank/select 为常数成本,三种操作都是 。空序列的 rank 为零,access/select 无有效位置; 时无需任何位向量,合法查询直接由长度和唯一字符回答。
区间第 k 小
对合法半开区间 和整数 ,左子区间元素数是
若 就映射到左子区间,否则令 并进右子区间。日志查询中这可直接求时间区间内第 小状态码,不必抽取排序。
推论与应用
构建与范围计数
按字符全序理路全序Total order · Linear order任意两个元素都可比较的偏序。稳定分割各节点序列,产生位向量的工作为 ;若显式建立整个字母表树,再加 。实际只建非空节点可避免空子树,字母表的坐标压缩与映射仍须另计。
基本指针版本的位向量不超过 位,树和节点区间等元数据另占 位;各短位向量的索引头也必须计入,不能只把单张长位串的 逐节点照抄。采用统一的位向量编码与索引,可以得到经典上界 (取已编码、 的字母表)。进一步改变平衡划分形状,并把各层拼入一个可导航大位串,可以去掉拓扑指针项;这是另一个具体表示方案,不是任意指针树都自带的空间界。
区间内值落在 的计数可沿字母表树递归:节点字母区间完全包含就返回当前位置区间长度,不交则零,部分相交时用 rank 映射到孩子。时间 的界来自值区间的树分解:每层至多两个节点与查询边界部分相交,报告所有位置仍需加输出成本。
区间映射的完整轨迹
图取等价的字符编号 ,原串为 。完整树各内部节点位向量的长度为 ,合计 位,小于上界 ,也说明它不等于 。
查询原区间 的第三小值,根先映到左区间 ,再映到 。在字符 的最后分叉,左边有两个 ,所以把 改成 进入右叶,返回 ;直接排序该区间得到 ,核对一致。
在节点位向量 上,父区间 映到左孩子为
映到右孩子为 。区间长度始终等于当前字母范围内的元素数,这是沿层递归的核心不变量。
求第 小时先计算左段数量 。若 ,携原 进入左孩子;否则进入右孩子并令 。到叶时字母范围只剩一个值,它就是答案。若 从 1 开始,判断必须是 ;改成 0-based 时条件和减量要一起改。
构建每层必须稳定分割,否则下一层位置不再对应原区间的相对次序。动态插入不仅要在根位向量插一位,还要沿路径在子序列对应位置插入,静态 packed bit vector 的空间与时间结论不能原样复用。