rambo

字符串匹配(一)

字符串匹配问题

假定文本是一个长度为n的数组T[1,...,n],而模式是一个长度为m的数组P[1,...,m],其中m\leq n,进一步假设P和T的元素都是来自一个有限字母集\sum的字符。

QQ截图20150810200731

QQ截图20150810200703

朴素算法

时间复杂度分析

在最坏情况下,朴素字符串匹配算法运行时间为O(n-m+1)m)。例如,在考察文本字符串a^{n}(一串由n个a组成的字符串)和模式a^{m}时,对偏移s的n-m+1个可能值中的每一个,在第四行比较相应字符的隐式循环必须执行m次来确定偏移的有效性。因此,最坏情况下的运行时间是\Theta((n-m+1)m)

相关问题:
1)假设模式P中的所有字符都不同,试说明如何对一段n个字符的文本T加速过程的执行速度,让朴素字符串匹配的速度达到O(n)呢?(和m没有关系咯)

答:当比较过程进行到P[j+1]和T[i+1]时,必有P[1,...,j]=T[i-j+1,...,i]。因为模式P中的所有字符都不相同,所以T[i-j+1,...,i]中的字符也均不同。也就是说,对于T[i-j+2,...,i]中的每个字符c,c!=T[i-j+1]=P[1]。

若T[i+1]!=P[j+1],下一步比较只需从T[i+1]和P[1]开始比较,而不是从T[i-j+2]和P[1]开始。

QQ截图20150810210758

2)(很好的题目)假设允许模式P中包含一个间隔字符#,该字符可以和任意字符串匹配(甚至可以与长度为0的字符串匹配)。注意,间隔字符可以在模式中出现任意次,但假定它不会出现在文本中,试给出一种多项式运行时间的算法,以确定这样的模式P是否出现于给定的文本T中。

QQ截图20150810211916

 

答:设模式P中有k-1个# (k>1),以#为分隔符把P分为k个部分,P1,P2,Pk,然后在文本T中使用NAIVE算法查找这k个部分。查找到Pi时,就从查找所在位置的后一位开始查找Pi+1)。

时间复杂度为( 假设k个部分的长度为a1,a2,...,ak)。

O(n-a1+1)a1)+O((n-a1-a2)a2)+...+O((n-m-k+1)ak)
<O(n+1)a1)+O((n+1)a2)+...+O((n+1)ak)
<O(n+1)m)