紧凑后缀数组中压缩与搜索时间的权衡
1. 后缀数组反转与LCP值计算算法
首先介绍两个重要算法,分别用于反转后缀数组和计算后缀数组中相邻后缀的最长公共前缀(LCP)值。
反转后缀数组算法
Reverse(in out SA, in n):
(1)
for each i ∈[1 . . . n] do begin
(2)
j ←SA(i); x ←i
(3)
while state(j) = false do begin
(4)
j′ ←j; j ←SA(j′); SA(j′) ←x; state(j′) ←true; x ←j′ end end
计算LCP值算法
SAtoLCP(in T, in SA, out LCP):
(1)
n ←|T|; Copy(SA, LCP); Reverse(LCP, n); last ←0; new ←0
(2)
for each i ∈[1 . . . n] do begin
(3)
i′ ←LCP(i)
(4)
if i′ = 1 then LCP(i) ←0
(5)
else begin
(6)
last ←max(0, last −1)
(7)
new ←CalcLCP(TSA(i′−1)+last...n, TSA(i′)+last...n)
(8)
LCP(i) ←last + new −1 end
(9)
last ←LCP(i) end
(10) Reverse(SA,
超级会员免费看
订阅专栏 解锁全文
16

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



