蛮力串模式匹配平均分析

时间:2013-03-22 06:27:18

标签: string algorithm pattern-matching

我有如下的强力字符串模式搜索算法:

public static int brute(String text,String pattern) {
 int n = text.length();    // n is length of text.
 int m = pattern.length(); // m is length of pattern
 int j;
 for(int i=0; i <= (n-m); i++) {
    j = 0;
    while ((j < m) && (text.charAt(i+j) == pattern.charAt(j)) ) {
       j++;
    }
    if (j == m)
     return i;   // match at i
  }
  return -1; // no match
} // end of brute()

虽然这里的算法上面的算法提到了最坏情况和平均情况。

我承受了最糟糕的案例表现,但对于平均作者如何获得O(m + n)表现?需要帮助。

在最坏的情况下,暴力模式匹配在时间O(mn)内运行。

普通文本的大多数搜索的平均值为O(m + n),这非常快。

更平均情况的示例: T:&#34;字符串搜索示例是标准的&#34; P:&#34;存储&#34;

感谢您的时间和帮助

2 个答案:

答案 0 :(得分:1)

他在O(m+n)中提到的是在正常情况下会发生的部分匹配。

例如,在正常情况下,您将获得:

T: "a string searching example is standard" 
P: "store"

迭代:

 O(38 + 5) == 43
 a -     no match (1)
 space - no match (2)
     s     - match (3)
     t     - match (4)
     r     - no match (5)
 t     - no match (6)
 r     - no match (7)
 i     - no match (8)
 n     - no match (9)
 g     - no match (10)
 space     - no match (11)

等...

我缩进了内部循环,以便更容易理解。

最后,您检查了m的所有O(m),但部分匹配意味着您已检查n的所有O(n)(找到了完全匹配),或者至少有足够的字符来表示n中的字符数量(仅部分匹配)。

总体而言,这会导致平均O(m+n)次。

如果匹配位于O(n)的最开头,则最佳情况为m

答案 1 :(得分:0)

  

在最坏的情况下,暴力模式匹配在时间O(mn)内运行。

     

普通文本的大多数搜索的平均值取O(m + n),这是非常的   快。

请注意,对于相同的算法,您不能拥有2个Big-O。

您似乎正在应用强力窗口移位算法

时间=(m-n + 1)m

最糟糕的情况是你有m = 1, O(nm)

最好的情况是你有m = n,Ω(m)