蛮力字符串匹配算法的运行时间

时间:2014-04-08 00:23:29

标签: python algorithm string-matching

我在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迭代,使用索引作为切片符号相等语句的输入?想法?

3 个答案:

答案 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)
  1. for i in range(0,len(n)-len(m)+1)将循环len(n)-len(m)+1

  2. if n[i:len(m)+i]==m将n from i to len(m)+i中的所有字符与m

    进行比较
  3. 示例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}}