那些经典算法:字符串匹配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实现
- 上一篇:「数据结构」 子字符串匹配 算法最全总结
- 下一篇:深度报文检测基础之AC算法
相关推荐
- 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)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Shiro学习系列教程三:集成web(web集成环境)
- 写了这么多年代码,这样的登录方式还是头一回见
- Shiro框架:认证和授权原理(shiro框架授权的四种方式)
- Spring Boot 整合 Shiro-登录认证和权限管理
- Apache Shiro权限管理解析二Apache Shiro核心组件
- 详细介绍一下Apache Shiro的实现原理?
- 什么是Apache Shiro?SpringBoot中如何整合Apache Shiro?
- Apache Shiro权限管理解析三Apache Shiro应用
- 那些通用清除软件不曾注意的秘密(清理不需要的应用)
- JWT在跨域认证中的奇妙应用(jq解决跨域)
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)