字符匹配用KMP时间复杂度为O(m+n)
但如果一时间写不出KMP,该怎么办呢,用暴力法吗?
暴力法的时间复杂度为O(mn),不可取
这里介绍一种时间复杂度为O(m)的简单方法
假如str1的长度为m,匹配串的长度为n,其中m>n,则要比较m-n个串,并且每个串比较n次,时间复杂为O(mn)
我们可以用多项式进行匹配,就是把每个子串用多项式转化为一个数字,因为每个ASSIC码都代表一个数字。
如 “abc”
转化为 ‘a’10^2+’b’10+’c’
不能各位简单求和,因为这样就丢失了顺序信息
但这样还是O(mn)的复杂度,因为每个子串的计算的时间复杂度为O(n)
我们可以用滑动的方法把这个复杂度降低
如”abcdea”
用”abc”去匹配
子串1:temp1=’a’10^2+’b’10+’c’
子串2:temp2=(temp1-‘a’10^2)10+’d’
…..
这样子串的计算复杂度为O(1),总的复杂度为O(m)
1 |
|