2020.9.26日记
补了几道学校的题,又学了不少关于字符串的操作
然而周四t1的期望还是在思考中
关于kmp复杂度证明一篇既有趣的blog
同时也提供了一些高级的复杂度计算思路👇
https://www.cnblogs.com/elpsycongroo/p/7565128.html
再拿kmp算法是失配回退时使用的摊还分析技术:
这个可以用势能分析法来分析:
关于匹配指针的位置cur
操作A:匹配时,cur++;
操作B:失配时,cur=next[cur−1]; (根据不同实现有所出入)
这个 next[cur−1]<=cur−1 是成立的。
根据势能分析(cur≥0 恒成立),我们可以证明,操作A的执行次数一定比操作B要多,两个操作都是O(1)。
而操作A的执行次数是很容易分析最坏上界是 O(n)
那么 O(n)=T(A)≥T(B)
因此匹配时的时间复杂度T(A+B)=O(n)
其实上述操作类似于栈操作,直接类比进行复杂度分析即可。
最后一句是精华,可以再反推上面势能分析的方法