我有如下的强力字符串模式搜索算法:
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;
感谢您的时间和帮助
答案 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)