算法设计与分析(第2版)清华大学出版社 期末考点
一、时间复杂度计算
f ( n ) = { 1 , n = 1 , f ( n 2 ) + n , n > 1. f(n)= \left\{ \begin{aligned} 1&,&n=1, \\ f\Big(\frac{n}{2}\Big)+n&, &n>1. \\ \end{aligned} \right. f(n)=⎩⎨⎧1f(2n)+n,,n=1,n>1.
当 n > 1 n>1 n>1时,
f ( n ) = f ( n 2 ) + n = f ( n 2 2 ) + n 2 + n = f ( n 2 3 ) + n 2 2 + n 2 + n = ⋅ ⋅ ⋅ = f ( n 2 k ) + n 2 k − 1 + n 2 + ⋅ ⋅ ⋅ + n 2 0 = f ( 1 ) + n ( 1 − 1 / 2 k ) 1 − 1 / 2 ( n = 2 k ) = 2 n − 1 \begin{aligned} f(n) &=f\Big(\frac{n}{2}\Big)+n \\ &=f\Big(\frac{n}{2^2}\Big)+\frac{n}{2}+n \\ &=f\Big(\frac{n}{2^3}\Big)+\frac{n}{2^2}+\frac{n}{2}+n \\ &=\cdot\cdot\cdot \\ &=f\Big(\frac{n}{2^k}\Big)+\frac{n}{2^{k-1}}+\frac{n}{2}+\cdot\cdot\cdot+\frac{n}{2^0} \\ &=f(1)+\frac{n(1-1/2^k)}{1-1/2} \ (n=2^k) \\ &=2n-1 \end{aligned} f(n)=f(2n)+n=f(22n)+2n+n=f(23n)+22n+2n+n=⋅⋅⋅=f(2kn)+2k−1n+2n+⋅⋅⋅+20n=f(1)+1−1/2n(1−1/2k) (n=2k)=2n−1
二、KMP
- BF
int BruteForce(string &A, string &B) // A主串;B:子串
{
int i = 0, j = 0;
while (j < B.length() && i < A.length())
{
if (B[j] == A[i])
{
j++;
i++;
}
else // 不相等,i,j同时移动
{
j = 0;
i = i - j + 1;
}
}
if (j == B.length())
{
return i - j;
}
return -1;
}
- KMP
void GetNext(string &B, vector<int> &next)
{
next.resize(B.length());
next[0] = -1;
int k = -1, j = 0;
while (j < B.length() - 1)
{
if (k == -1 || B[k] == B[j])
{
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int KMP(string &A, string &B, vector<int> &next)
{
int i = 0, j = 0;
while (j < B.length() && i < A.length())
{
if (B[j] == A[i])
{
j++;
i++;