百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

那些经典算法:字符串匹配BF和AK算法

wxin55 2024-11-17 16:48 15 浏览 0 评论

字符串匹配算法非常常见,也非常实用。比如我们常在IDE中查找字符串,比如我们做关键词匹配,都需要进行字符串查找,底层是怎么实现的那,先介绍两种最简单的字符串匹配算法:BF算法和RK算法。

一BF匹配算法

BF匹配算法,即Brute-Force算法的简称,其实就是我们自己可以想到的最简单的算法。在介绍这个算法之前,先来了解什么是模式串,什么是主串。在字符串匹配算法中,如果需要在字符串A中查找字符串C,那么字符串A就是主串,C字符串称为模式串。 假设主串的长度为n,模式串的长度为m,m小于等于n。 BF算法的逻辑就是依次从主串中0,1,2....n-m的位置,一一比较模式串和主串的字符是否相同,如果模式串都匹配完了均相同,则匹配,负责继续向后匹配。 借老师的一张图来表示很明确:

用java代码实现下:

public class BFSearch {


    public static int search(String mainStr,String modeStr)
    {
        int n = mainStr.length();
        int m = modeStr.length();
        if (n < m) {
            return -1;
        }
        char [] a = mainStr.toCharArray();
        char [] b = modeStr.toCharArray();
        int j = 0;
        int i = 0;
        int k = 0;
        for ( i = 0; i <= n-m; i++ ) {
            k = i;
            for (j = 0; j < m;j++) {
                if (a[k] == b[j]) {
                    k++;
                } else {
                   break;
                }
            }
            if (j == m ) {
                return i;
            }
        }
        return -1;
    }


    public static void main(String [] args) {
        String main_str = "abcdef";
        String mode_str = "abc";
        System.out.println(BFSearch.search(main_str,mode_str));
    }
}

本来以为是最简单的字符串匹配算法,竟然写的时候发现几个bug,真是绝知此事要躬行啊! 通过代码分析来看,算法复杂度为O( (n-m)m) 约等于O(nm)。 虽然复杂度很高,但是用的还挺多,原因:

  • 理论上看起来算法复杂度比较高,但是,每次匹配不一定是m,如果不匹配则直接进入下一轮循环了。
  • 实现起来比其他算法要简单。

二 RK算法

RK算法全称Rabin-Karp算法,可以看作是BF算法的升级,BF算法的时候我们对n-m+1个长度为m的子串进行依次匹配,RK算法是对n-m+1个字串求hash值,对模式串求hash值,然后进行比较,如果hash不一样,那么肯定两个字符串不一样,如果hash值一样,则进行进一步匹配,当然如果是不冲突的hash算法也可以只通过hash值比较。

整体来说hash计算需要时间,比较上来说减少了字符串的比较,但是到底性能是不是一定比BF算法要好,我觉得不一定,这就要求算法设计上有一定的技巧,王争老师提供了一个很好的hash算法,假如我们所有的字符串只有小写字母组成,那么我们可以把一个字符串看作是26进制的数字,然后计算出每个子串的hash值,且hash值是有规律的,可以简化计算,举例下:

hash("abc") = 'a' *26*26 + 'b'*26+'c' = 0*26*26 + 1*26 +2 = 28

如上的话,假如模式串长度为三,则计算hash的情况如下:

如果按照上面26进制的方法: hash(dbc) = 3*26*26+ 1*26+2 hash(bce) = 1*26*26 +2*26+4

看看图片:

不过以上计算方法虽然不存在算法冲突的问题,但是,如果字符串太长,则容易出现溢出。 可以用其他hash算法替代。

还可以优化的地方是像26的n次方可以直接保存在一个数组中,不需要计算直接查询即可。 另外在实际的代码中,可以先计算模式串,计算出一个主串的子串就进行比较,如果匹配就直接返回, 如果不匹配,再计算下一个字串。RK算法优化的好的话,性能和KMP算法的是相同数量级的,很接近。

具体实现可以参考 RK算法的python实现

相关推荐

Shiro学习系列教程三:集成web(web集成环境)

相关推荐:《Shiro学习系列教程一:Shiro之helloworld》《Shiro学习系列教程三:集成web》《Shiro学习系列教程四:集成web(二)》《Shiro学习系列教程五:自定义Real...

写了这么多年代码,这样的登录方式还是头一回见

SpringSecurity系列还没搞完,最近还在研究。有的时候我不禁想,如果从SpringSecurity诞生的第一天开始,我们就一直在追踪它,那么今天再去看它的源码一定很简单,因为我们了...

Shiro框架:认证和授权原理(shiro框架授权的四种方式)

优质文章,及时送达前言Shiro作为解决权限问题的常用框架,常用于解决认证、授权、加密、会话管理等场景。本文将对Shiro的认证和授权原理进行介绍:Shiro可以做什么?、Shiro是由什么组成的?举...

Spring Boot 整合 Shiro-登录认证和权限管理

这篇文章我们来学习如何使用SpringBoot集成ApacheShiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有SpringS...

Apache Shiro权限管理解析二Apache Shiro核心组件

ApacheShiro核心组件Subject(用户主体)Subject是Shiro中的核心概念之一,表示当前用户(可以是登录的用户或匿名用户)。它是与用户交互的主要接口,提供了对用户身份验证...

详细介绍一下Apache Shiro的实现原理?

ApacheShiro是一个强大、灵活的Java安全框架,设计目标是简化复杂的安全需求,提供灵活的API,使开发者能方便地将安全功能集成到任何应用中。主要作用是用于管理身份验证、授权、会话管理和加...

什么是Apache Shiro?SpringBoot中如何整合Apache Shiro?

ApacheShiro是一个功能强大且易于使用的Java安全框架,主要用于构建安全的企业应用程序,例如在应用中处理身份验证(Authentication)、授权(Authorization)、加密(...

Apache Shiro权限管理解析三Apache Shiro应用

Shiro的优势与适用场景优势简单易用:API设计直观,适合中小型项目快速实现权限管理。灵活性高:支持多种数据源(数据库、LDAP等),并允许开发者自定义Realm。跨平台支持:不仅限于We...

那些通用清除软件不曾注意的秘密(清理不需要的应用)

系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...

JWT在跨域认证中的奇妙应用(jq解决跨域)

JWT在跨域认证中的奇妙应用什么是JWT?让我们先来聊聊JWT(JSONWebToken)。它是一种轻量级的认证机制,就像一张电子车票,能让用户在不同的站点间通行无阻。JWT由三部分组成:头部(H...

开启无痕浏览模式真能保护个人隐私吗?

在访问网站页面时,你是否有过这样的疑虑,自己访问的会不会是山寨网站?用公用电脑上网,个人信息会被别人看到吗?这时,有人会说,使用浏览器的“无痕浏览”模式不就行了,可以在操作中不留下“蛛丝马迹”,但,真...

辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒

近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...

cookie、session和token(cookie,session和token的区别)

Cookie的概念最早是在1994年由NetscapeCommunications的程序员LouMontulli发明的,目的是为了解决当时早期互联网的一个关键问题:HTTP无状态协...

小白都能看懂的session与cookie的区别理解

cookie/session都是跟踪识别浏览器用户身份的一个东西。cookie的理解:我们要知道,服务器和客户端之间进行数据传输,需要使用到一个超文本传输协议(http协议),而http协议本身是个...

面试:网易一面:支撑10万QPS的电商购物车系统如何架构设计呢?

1.需求分析:10万QPS的购物车系统需要满足哪些需求?回答:10万QPS的购物车系统需要满足以下核心需求和挑战:核心功能:添加、删除、修改购物车商品实时查看购物车列表支持高并发读写(10万QPS)...

取消回复欢迎 发表评论: