轻量级Lempel - Ziv解析与高效Rank&Select结构技术解析
一、匹配统计计算方法
在进行匹配统计计算时,目标是计算$MS_{A|B}$,实际常关注$MS_{AB|B}[1..kb]$,与一般计算的差异在于起始计算区间是$S_{AB}$中的$B$ - 区间而非$\epsilon$ - 区间。
- 标准方法
- 利用后缀数组计算匹配统计,为每个位置$i$计算后缀$A[i..|A|]$的最长前缀$P_i = A[i..i + \ell_i)$,使$S_{AB}$中的$P_i$ - 区间非空,$MS_{A|B}[i] = (p_i, \ell_i)$,其中$p_i$是$P_i$ - 区间中的任意后缀。
- 可通过对$A$进行正向扫描,利用扩展右和收缩左操作从$P_{i - 1}$ - 区间计算$P_i$ - 区间;也可反向扫描,利用扩展左和收缩右操作从$P_{i + 1}$ - 区间计算$P_i$ - 区间。这里采用反向扫描且使用更大更快的数据结构。
- 扩展左操作通过反向搜索实现,需要大小为$\sigma$的数组$C$和BWT上的rank函数实现,rank函数使用Ferragina等人的快速rank数据结构,占用$4b$字节。
- 收缩右操作使用对$LCP_B$的NSV和PSV操作实现,将NSV/PSV值以偏移量形式存储在普通数组中,每个偏移量用2字节。若偏移量过大,使用Cánovas和Navarro的NSV/PSV数据结构,该结构所需空间小于$0.1b$字节。此算法的峰值内存使用为$n + (24.1)b + O(\sigma)$字节。
- 新方法
- 与
超级会员免费看
订阅专栏 解锁全文
19

被折叠的 条评论
为什么被折叠?



