为什么KMP算法的预处理时间是Θ(m)?
来源:互联网 发布:finale for mac 编辑:程序博客网 时间:2024/05/29 15:48
《算法导论》P590已经描述过,但并没有细说,或者只是描述一个名词“摊还分析”,所以我按自己的理解重新描述
COMPUTE-PREFIX-FUNCTION(P)
m=P.lengthlet π[1..m] be a new arrayπ[1]=0k=0for q=2 to mwhile k>0 and P[k+1]!=P[q]k=π[k]if P[k+1]==P[q]k=k+1π[q]=kreturn π
(1)初始化时,k=0,q=2,每次for循环后q都会增加1。但是,k只有在if中才会增加,在while中只会减少,所以k<q始终都成立,所以k的增加次数不超过m。你可以想象一下:
q不会减少,而且每次都增加1;
k有可能会减少,每次增加1,也有可能不增加,因为if不一定成立
(2)上面也说了,k的增加次数不会超过m,而且k>0必须成立。
所以,当k==0时,while只会在每次for循环执行一次;
当k>0时,就会不断地减小。
但是,由于(1)中说了,k的增加次数不会超过m,所以,k的减少次数也不会超过m
----------------------------------------------无耻的分割线-----------------------------------------------
所以,相当于在每次for循环中,while循环一般都执行1次。
while总的执行次数 < for循环执行次数+k
for循环次数大概是m,而k<m,所以while的总的执行次数<2m。
----------------------------------------------无耻的分割线-----------------------------------------------
所以,KMP算法的预处理时间是Θ(m)QES
1 0
- 为什么KMP算法的预处理时间是Θ(m)?
- 2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )
- 冒泡算法的时间复杂度为什么是O*2
- KMP算法的时间复杂度
- 为什么要有KMP算法
- 为什么JDK中String类的indexof不使用KMP或者Boyer-Moore等时间复杂度低的算法编辑器
- 求n^m 时间复杂度log(m)的算法
- 快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
- 为什么TIME_WAIT的时间是2MSL
- 字符串模式匹配——KMP算法(时间复杂度为O(m+n))
- 3.1-3 为什么“算法A的运行时间至少是O(n^2)”这一表述是无意义的
- 为什么linux kernel默认的页面大小是4K,而不是4M或8M?
- 为什么linux kernel默认的页面大小是4K,而不是4M或8M?
- KMP(字符串匹配)算法 O(m+n)
- POJ 1062 昂贵的聘礼(预处理和dijkstra算法)(M)
- 算法的是时间复杂度分析
- 排序的最低时间复杂度为什么是O(nlogn)
- 为什么建堆的时间复杂度是O(n)?
- Java之详解坦克大战游戏(四)
- itext poi 学习之旅 (2)创建excel
- itext poi 学习之旅 (3)读取数据库信息并由excel展现出来
- Leetcode解题笔记(Array)
- sip协议呼叫流程详解
- 为什么KMP算法的预处理时间是Θ(m)?
- C++中的友元函数、static函数、常函数小结(理论篇)
- 移动支付时代的手机和app安全设置
- Swift - 访问控制(private,internal,public)
- lis算法(nlogn)
- Python学习笔记14:Python执行环境
- 安卓项目之淘忆2.0的代码实现之主页底部的导航栏功能
- 纯虚函数 & 实例化
- HDU 1061 快速幂算法