BF算法(Java)

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值