我在Python中为字符串匹配编写了一个小的,快速的(写入,不要运行!)算法:
def bruteMatch(n,m):
for i in range(0,len(n)-len(m)+1):
if n[i:len(m)+i]==m:
return(i)
此算法的运行时间是否为O(nm)?我将它与Horspool字符串匹配算法的最坏情况运行时进行比较,该算法也是(nm)。我想我的困惑源于这样一个事实:我的算法最初看起来是O(n)运行时因为它只是通过输入n迭代,使用索引作为切片符号相等语句的输入?想法?
答案 0 :(得分:1)
最坏的情况是O(nm),是的。因为,您可以看到==
测试测试每个字符串中的每个字符,这可能与等于测试中最短字符串的长度一样长。
答案 1 :(得分:0)
确实需要O(n * m)时间。您运行循环(n-m)次,字符串比较本身需要(min(n,m))时间。这很好,而n或m非常小,但考虑最坏的情况,其中m = n / 2:
循环执行(n-n / 2)次,比较需要(n / 2)次,总共(O(n ^ 2))时间 - 不太好!
如果性能很重要且搜索字符串很大,请考虑使用基于散列的算法,例如Rabin–Karp。
希望这有帮助!
答案 2 :(得分:0)
def bruteMatch(n,m):
for i in range(0,len(n)-len(m)+1):
if n[i:len(m)+i]==m:
return(i)
for i in range(0,len(n)-len(m)+1)
将循环len(n)-len(m)+1
次
if n[i:len(m)+i]==m
将n from i to len(m)+i
中的所有字符与m
示例1
n = "Hello"
m = "Jello"
len(n)-len(m)+1 = 4-4+1 = 1
range(0,1)
i=0
if n[0:4+0] == m ~ n[0:4] == m[:] ~ "Hello" == "Jello"
FALSE
示例2
n = "Hi"
m = "Jello"
len(n)-len(m)+1 = 2-4+1 = -1
range(0,-1) ~ *LOGICAL ERROR*
示例3
n = "Hello"
m = "Hi"
len(n)-len(m)+1 = 4-2+1 = 3
range(0,3)
i=0
if n[0:2+0] == m ~ n[0:2] == m[:] ~ "He" == "Hi"
FALSE
i=1
if n[1:2+1] == m ~ n[0:3] == m[:] ~ "Hel" == "Hi"
FALSE
i=2
if n[2:2+2] == m ~ n[0:4] == m[:] ~ "Hell" == "Hi"
FALSE
<强>结论强>
您的代码将n[0:z]
z
的{{1}} (0, len(n)+1)
len(n)-len(m)+1
If len(n) == len(m) then check n == m
Else if len(n) > len(n) then return check m is in [ n[0:len(m)], .., n[0:len(n)] ]
Else if len(n) < len(m) then Error: Invalid range
的{{1}}进行比较{/ 1}}
{{1}}