“本页输入静态位串 $B[0..N)$。查询沿用rank/select:rank(i)数半开前缀 $[0,i)$ 的1,$0\le i\le N$;select(k)返回第 $k$ 个1的零基…”
形式陈述
定义
作为简洁数据结构的基础接口,对由 0/1 组成的有限序列(位串)
采用半开前缀;
Rank 的合法参数为
位串
因此
rank 的分层索引
把位串分成长度
两级目录分别占
bit,均为
查询
select 的长短间隔
Select 可每隔固定数量的 1 采样一个绝对位置,再按采样间隔的跨度分类。跨越很长位段的间隔数量很少,可显式存其中 1 的位置;短间隔落在少量机器字内,由更细采样或微块表恢复第
当原位串改由RRR类内偏移保存时,索引要读取的短位窗口可先从少量压缩块恢复。理论微表与实际组合逆秩具有不同代价;若参考实现用rank二分select,应保留二分增加的对数因子,不能仅凭输出接口相同就宣称常数时间。
这类“长间隔少、短间隔可查表”的计数负责把 select 的辅助空间压到
直觉
Rank 把位位置映到此前出现次数,select 则沿相反方向把 occurrence 编号映回位置。分层目录只为稀疏边界存绝对计数,微块用共享表恢复局部答案;辅助索引因此可以是
它们不是整个定义域上的互逆函数:若连续几个位置都是
例子与边界
接口与边界
对
上述静态简洁位向量实现把原位串与目录合计控制在
动态插入一位会改变其后许多 rank 值与 select 位置,静态目录不能局部照搬。常数查询时间依赖上述字长和字操作模型,并不免除预处理成本;微块表可以共享,也可以按前面的大小计入单实例空间。
Select 不是数组中选择第
推论与应用
Rank/select 是压缩索引与简洁表示的共同导航原语。Wavelet Tree 用每层位向量的 rank 把查询映到子序列;FM-index 用 BWT 上的 rank 推进 backward search;Elias–Fano 编码借助 select 定位高位一元码。平衡括号树表示则在括号位串上组合 rank/select 与匹配操作恢复树导航。
参考资料
- Guy Jacobson, Succinct Static Data Structures, PhD thesis, Carnegie Mellon University, 1989.
- David R. Clark and J. Ian Munro, “Efficient Suffix Trees on Secondary Storage,” in Proceedings of the Seventh Annual ACM-SIAM Symposium on Discrete Algorithms (SODA ’96), 1996, pp. 383–391.
- Rajeev Raman, Venkatesh Raman, and S. Srinivasa Rao, “Succinct Indexable Dictionaries with Applications to Encoding k-ary Trees, Prefix Sums and Multisets,” ACM Transactions on Algorithms 3(4), 2007, Article 43.