BF算法:
BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
例:
主串:BCAABCD
模串:ABC
public class BFTest {
public static void main(String[] args) {
System.out.println(BF("BCAABCD", "ABC", 0));
System.out.println(BF("BCAABCD", "ABC"));
}
private static int BF(String main, String model) {
/**
* 定义主串的下标和模串的下标
*/
int i = 0;
int j = 0;
while (i < main.length() && j < model.length()) {
//对比相同的时候 主串和模串的下标同时增加,比对下一个
if (main.charAt(i) == model.charAt(j)) {
i++;
j++;
} else {
//例如比对到以下情况 主串下标为3 模串下标为1 需要回退到3这个位置 i-j+1
// 0123 456
// BCAA BCD
// AB C
// 01 2
//不相同的情况下主串从下一个下标开始比较
i = i - j + 1;
//不相同的情况下 字串变为0开始
j = 0;
}
}
if (j >= model.length()) {
return i - j;
}
return -1;
}
/**
* 增加了一个开始位置 i变为了pos,不是从0开始
* @param pos 开始匹配位置
*/
public static int BF(String main, String model, int pos) {
int i = pos;
int j = 0;
while (i < main.length() && j < model.length()) {
if (main.charAt(i) == model.charAt(j)) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
}
if (j >= model.length()) {
return i - j;
}
return -1;
}
}
标题BF算法的时间复杂度 :
在匹配成功的情况下,应考虑两种情况:
1.最好情况下,每趟不成功的匹配都发生在模拟串的第一个字符与主串中相应字符的比较。 设主串的长度为 n ,子串的长度为 m,假设从主串的第 i 个位置开始与模拟串匹配成功,则在前 i-1 趟匹配中字符总共比较了 i-1 次;若第 i 趟成功的字符比较次数为 m , 则总比较次数为 i-1+m 。对于匹配成功的主串,其起始位置由 1 到 n-m+1 ,假定这 n-m+1 个起始位置上的匹配成功概率相等,则最好情况下匹配成功的平均比较次数为 (n+m)/2,则最好情况下的平均时间复杂度为 O(n+m)
2.最坏情况下,每趟不成功的匹配都发生在模拟串的最后一个字符与主串中相应字符的比较。假设从主串的第 i 个位置开始与模拟串匹配成功,则在前 i-1趟匹配中字符总共比较 (i-1)*m 次;若第 i 趟成功的字符比较次数为 m ,则总比较次数 i*m 。 所以最坏情况下匹配成功的平均比较次数为 m*(n-m+2)/2,最坏情况下的平均时间复杂度为O(n*m)