后缀数组---后缀数组的计算

字符串后缀(Suffix)指的是从字符串的某个位置开始到其末尾的字符串子串。我们认为原串和空串也是后缀。反之,从字符串开头到某个位置的字符串子串则成为前缀。
后缀数组指的是将某个字符串的所有后缀按字典序排序后得到的数组。不过数组中并不需要直接保存所有的后缀字符串,只要记录对应的起始位置就好了。下文中,我们用S[i..]来表示字符串S从位置i开始的后缀。这里写图片描述
后缀数组不但能够高效计算得到,而且能够用于解决许多问题,是非常强有力的工具。
下面我们来讲解一下后缀数组的计算
假设我们要计算长度为 n的字符串S的后缀数组。最朴素的做法就是直接把所有后缀进行排序,将n个长度为O(n)的字符串进行排序复杂度为O(n^2logn)。而如果灵活运用所有的字符串都是S的后缀这一性质,就可以得到更高效的算法。下面就给大家介绍其中较为简单地一种—–由Manber和Myers发明的O(nlog^2n)复杂度的算法

该算法是基本思想是倍增,首先计算从每个位置开始的长度为2的子串顺序,在利用这个结果计算长度为4的子串顺序,接下来计算长度为8的子串地顺序,不断倍增,直到长度大于等于n就得到了后缀数组。下面,我们用S[i,k]来表示从位置i开始的长度为k的字符串子串。其中,当从位置i开始,剩余字符不足k个时,表示的是位置i开始字符串末尾的子串。
这里写图片描述
要计算长度为2的子串地顺序,只要排序两个字符组成的数对就好了。现在假设已经求得了长度为k的子串地顺序,要求长度为2k的子串地顺序。记rank(i)为S[i,k]在所有排好序的长度为k的子串中的是第几小的。要计算长度为2k的顺序,就只要对两个 rank组成的数对进行排序就好了。我们通过对rank(i)与rank(i+k)的数对和rank(j)与rank(j+k)的数对比较来替代对S[i,2k]和S[j,2k]的直接比较。因为比较rank(i)与rank(j)就相当于比较S[i,k]与S[j,k],比较rank(i+k)和rank(j+k)就相当于比较S[i+k,k]和S[j+k,k].所以,我们可以这样高效地比较长度为2k的子串,并将它们排序。这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值