术语解释:
后缀数组:常用SA[i]来表示,可以理解成rank[i].flag,意为字典序为i的后缀的起始位置。
名次数组:常用rank[i]来表示,可以理解成flag[i].rank,意为起始位置为i的后缀的字典序。
简单地说,后缀数组是“排第几的是谁?”,名次数组是“你排第几? ” 。可以看出,SA[i]和rank[i]是互逆的(看上面的[理解]就知道了)。举个例子,如下图:
增算法的主要思路是:用倍增的方法对每个字符开始的长度为 2^k 的子字符串进行排序,求出排名,即 rank 值。k 从 0 开始,每次加 1,当 2^k 大于 n 以后,每个字符开始的长度为 2^k 的子字符串便相当于所有的后缀。并且这些子字符串都一定已经比较出大小,即 rank 值中没有相同的值,那么此时的 rank 值就是最后的结果。每一次排序都利用上次长度为 2^(k-1) 的字符串的 rank 值,那么长度为 2^k 的字符串就可以用两个长度为 2 ^(k-1) 的字符串的排名作为关键字表示,然后进行基数排序,便得出了长度为 2^k 的字符串的 rank 值。以字符串 “aabaaaab ”为例,整个过程如图 2 所示。其中 x 、 y 是表示长度为 2^k 的字符串的两个关键字 。
Reference:部分文字及所有图片来自罗穗骞的论文,非常感谢。