去年的时候弄了一阵子的后缀数组,当时一直都没有弄懂!今年再看后缀数组,似懂非懂!其实还是没懂!但比去年的完全不懂,还是有进步的!

    下来把思路理了理,要看明白后缀数组,是需要一些知识储备的!

     1、基数排序要会,快速排序会更好!

     2、最好学习了一些字符串匹配的数据结构或者算法,比如:KMP,Trie树!虽然没有直接的应用,但在思维上还是有些帮助的!

    有了知识储备后,再来读后缀数组的论文:

1、《Suffix arrays: A new method for on-line string searches》 (后缀数组的原始论文)

2、《后缀数组》(2004 许智磊)

3、 《后缀数组——处理字符串有有力工具》(2009 罗穗骞)

   后缀数组只是一个一维的数组,这是它的逻辑形式,我们更关心是的数组里面存储的是什么东西!

    那么数组中存储的是什么东西呢?数组中存储的是下标:字符串所有后缀的首字母在字符串中起始位置的下标。 存储下标是没有什么值得惊叹的,对于一个长度为N的字符串,其下标就是{0,1,2,……,N-1}嘛!关键是数组它不是这样按依次存储的,而是对所有的后缀按其大小排序后(别告诉我你不知道字符串怎么比较大小!),按后缀的大小把后缀的下标从小到大存储在数组中(一般定义为SA)。

   当然后缀数组真正应用的时候不只这一个数组,一般是三个:

SA(真正意义上的后缀数组)rank(名次数组) height(后缀的公共前缀长度数组)

   这就是后缀数组的所有家当了!其实rank数组只是辅助用的,是个助手!后缀数组之难,不在于其形式,而在于求解每个数组时精妙的过程!

    比如求解SA数组,你有什么办法? 最简单的办法就是从战略上把每个后缀看作一个整数,然后用什么冒泡啊之类的经典排序算法去排! 这样的话,战术上运作的时候,就需要我们一个个字符去比较!如果字符串的长度为100W,你就慢慢去比较吧!如果你的计算机看到你这样做,肯定会说:你就累死我吧!

    后缀数组之所以经典,就在于这里:充分挖掘后缀之间的联系(KMP是充分挖掘模式内部的联系),然后用其它经典的方法对后缀排序!论文中介绍两种求解方法:倍增和DC3。

    SA数组求解出来后,另一个难点出来了:怎么求height数组!

因为height数组存储的是前缀的长度,所以会用到前缀相关的定理,这里许智磊大牛有证明,反正我的数学差了,是没看明白的!

    有了SA和height数组后,很多题都可以做了!当然如果仅仅作为模板来用,而没有理解那么深的话,比如我就只会套简单题!

   接着去啃吧:time,pressure,time pressure!