直接把作业帖上来是不是有点不太公道呀。。。
无所谓啦反正各位看着开心就行KMP算法对于模式串PP,建立其前缀函数NN ,其中N[q]N[q] 表示在PP中,以qq位置为结束的可以匹配到前缀的最长后缀的长度(也可以理解为那个前缀的结束位置),在匹配中,若P[i]P[i]与S[j]S[j]失配,则令i=N[i?1]+1i=N[i?1]+1 ,否则现考虑如何构造NN ,设当前以计算出N[1..i?1]N[1..i?1] ,则令k=N[i?1]k=N[i?1] ,若 P[k+1]=P[i]P[k+1]=P[i],则令N[i]=k+1N[i]=k+1 ,否则令k=N[k]k=N[k] 。重复上述过程,直至找到可证该算法能在Θ(|P|)Θ(|P|) 的时间内构造出前缀函数NN ,在Θ(|S|)Θ(|S|) 的时间内完成匹配,总的时间复杂度为KMP算法的正确性证明先证明匹配过程的正确性:在过程中,若P[1..q]P[1..q] 与S[s+1...s+q]S[s+1...s+q] 匹配,而P[q+1]P[q+1]与S[s+q+1]S[s+q+1] 失配,那么由NN的定义可立即得出P[1..N[q]]P[1..N[q]] 与 S[s+q?N[q]+1...s+q]S[s+q?N[q]+1...s+q] 匹配,而S[1...t]S[1...t]与S[s+q?t+1...s+q]S[s+q?t+1...s+q] 失配(N[q]<t<q)(N[q]<t<q) ,即只需检验P[N[q]+1]P[N[q]+1] 与S[s
无所谓啦反正各位看着开心就行KMP算法对于模式串PP,建立其前缀函数NN ,其中N[q]N[q] 表示在PP中,以qq位置为结束的可以匹配到前缀的最长后缀的长度(也可以理解为那个前缀的结束位置),在匹配中,若P[i]P[i]与S[j]S[j]失配,则令i=N[i?1]+1i=N[i?1]+1 ,否则现考虑如何构造NN ,设当前以计算出N[1..i?1]N[1..i?1] ,则令k=N[i?1]k=N[i?1] ,若 P[k+1]=P[i]P[k+1]=P[i],则令N[i]=k+1N[i]=k+1 ,否则令k=N[k]k=N[k] 。重复上述过程,直至找到可证该算法能在Θ(|P|)Θ(|P|) 的时间内构造出前缀函数NN ,在Θ(|S|)Θ(|S|) 的时间内完成匹配,总的时间复杂度为KMP算法的正确性证明先证明匹配过程的正确性:在过程中,若P[1..q]P[1..q] 与S[s+1...s+q]S[s+1...s+q] 匹配,而P[q+1]P[q+1]与S[s+q+1]S[s+q+1] 失配,那么由NN的定义可立即得出P[1..N[q]]P[1..N[q]] 与 S[s+q?N[q]+1...s+q]S[s+q?N[q]+1...s+q] 匹配,而S[1...t]S[1...t]与S[s+q?t+1...s+q]S[s+q?t+1...s+q] 失配(N[q]<t<q)(N[q]<t<q) ,即只需检验P[N[q]+1]P[N[q]+1] 与S[s