BF 算法,亦即 Brute Force 暴力算法,是普通的模式匹配算法。
BF 算法的思想就是将文本串 s
的第一个字符与模式串 p
的第一个字符进行匹配:
s
的第二个字符和 p
的第二个字符s
的第二个字符和 p
的第一个字符依次比较下去,直到得出最后的匹配的结果。
BF 算法是一种蛮力算法,没有任何优化,就是用两层循环的比较,当字符串比较大的时候,执行效率就非常低下,不适合比较非常大的字符串。
该算法最坏情况下进行
因此,如果我们使用暴力搜索 m
字符中的 n
个字符串,那么我们需要尝试 m * n
次。
const BF = function(s, p) {for (let i = 0; i < s.length; i++) {for (let j = 0; j < p.length; j++) {if (s[i] === j[i]) {// 字符匹配,两层循环索引下标自增i++;j++;} else {// 字符不匹配,跳出第二层循环// 第一层循环递增i = i - (j - 1);break;}// 当第二层循环亦即模式字符串已经匹配完毕// 表示主串中存在与模式串匹配的子字符串if (j === p.length) {return i - j;}}}return -1;};
const BF = function(s, p) {let i = 0,j = 0;while (i < s.length) {if (s[i] === p[j]) {i++;j++;} else {i = i - (j - 1);j = 0;}if (j === p.length) {return i - j;}}return -1;};
算法复杂度分析:
BF 算法在主串和字串匹配失败时,主串进行的回溯操作会影响效率,回溯之后,主串与字串有些部分比较是没有必要的。这种简单的丢弃前面的匹配信息是 BF 算法之所以效率低的重要因素。
参考资料: