KMP算法目的:快速从主串中匹配出与模式串相同的子串
在梳理之前,先给几个约定吧。
语言:C++
字符串s,其子串的表示方法s[i]~[j]
默认已经了解KMP算法中的一些基本概念,如主串,模式串等。
- 证明并不严谨,只是呢,个人感觉如果知道了证明,就能够掌握住KMP算法的精髓
- 本文的举例子都挺辣眼睛的,就是方便理解,可不看,重要的是证明。
KMP算法目的:快速从主串中匹配出与模式串相同的子串
在梳理之前,先给几个约定吧。
语言:C++
字符串s,其子串的表示方法s[i]~[j]
默认已经了解KMP算法中的一些基本概念,如主串,模式串等。
矩阵链乘法:给定一个n个矩阵的序列(矩阵链),:$A_1A_2\dots A_n \Leftrightarrow \lang A_1,A_2,\dots A_n\rang$ ,这里我们不讨论如何求解计算结果,默认采用$\Theta(n^3)$ 的计算方法。我们可以使用括号去表达计算次序,然后利用标准的矩阵相乘去运算。可以发现不同的加括号方式得到的结果是一样的,但复杂程度却是不一样的。
如$A_1A_2A_3$ 为例子:
那么我们引出定义满足以下性质的矩阵乘积链称为fully parenthesized(完全括号化的):单一矩阵,或者是两个完全括号化的矩阵乘积链的积,且已经外加括号。
如$\lang A_1,A_2,A_3,A_4\rang$有5种完全括号化的矩阵乘积链:1234,1(23)4,12(34),(12)34,(12)(34) 那有没有递推公式???
引出矩阵链乘法问题:给定一个n个矩阵的序列(矩阵链),矩阵规模$Ai:p{i-1}*p_i$(满足行是上一个矩阵的列数)求完全括号化方案,使得乘积次数最少。
首先考虑穷举法,设P(n)为n个矩阵的链的完全括号化方案的个数,考虑我们一定会在某个k矩阵上吧矩阵链分割,于是我们有递推公式:
结果为$\Omega(2^n)$,要求用代入法证明,一会证,有点麻烦。