KPM算法快速检索文本

说到检索文本java的String.indexOf,方法其实已经性能很不错了,contains方法其实也是调用了indexOf方法,所以一般情况下使用contains方法也是完全够用的,简单了解了一下indexOf的原理

String.indexOf

在 Java 1.8 中,String 类的 indexOf 方法主要使用的是经过优化的朴素字符串匹配算法(Naive String Matching Algorithm)。这个算法是一种简单但有效的字符串搜索算法,它在每一步比较字符串中的字符,并在不匹配时按步骤移动。Java 的 indexOf 方法结合了一些额外的优化,例如朴素算法的预处理和 Boyer-Moore 算法的一些思想,以提高性能。

  1. 朴素算法: 从头到尾逐个比较字符,如果发现不匹配,将字符串向前移动一位重新比较。这是一种简单但不是最高效的算法。

  2. 预处理: 预处理目标字符串,构建一个部分匹配表(Partial Match Table),这样可以根据不匹配字符的信息来跳过一些比较。这类似于 KMP 算法中的最长前缀后缀数组。

  3. Boyer-Moore 的启发式规则: 有时候会使用 Boyer-Moore 算法中的一些启发式规则,例如坏字符规则(Bad Character Rule)和好后缀规则(Good Suffix Rule),以提高性能。

所以说contains一般情况下都满足我们的需求,由于最近研究大文本的检索,了解到了KMP算法,所以记录一下KMP的原理

KMP

原理

KMP(Knuth-Morris-Pratt)算法是一种用于在字符串中高效搜索子串的算法。它的目标是避免在搜索过程中重复比较已经比较过的字符,从而提高搜索效率。KMP算法的核心思想是通过预处理模式串(要搜索的子串),构建一个最长前缀后缀数组(即LPS数组),以便在不匹配的时候能够跳过一些字符的比较。

  1. 构建最长前缀后缀数组(LPS数组): 对于模式串(要搜索的子串),从左到右遍历,对每个位置计算最长相等的真前缀和真后缀的长度。这样就得到了LPS数组,它存储了每个位置对应的最长相等真前缀和真后缀的长度。

  2. 使用LPS数组进行匹配: 在实际搜索时,维护两个指针,一个指向文本串,一个指向模式串。当字符匹配时,两个指针同时移动;当不匹配时,利用LPS数组跳过一些字符,使模式串的某一前缀和文本串的当前位置开始匹配。

这种方法能够避免在文本串中重复比较已经比较过的字符,从而提高了搜索的效率。KMP算法的时间复杂度是O(N+M),其中N是文本串的长度,M是模式串的长度。

示例

public class KMPAlgorithm {public static void main(String[] args) {String text = "ABABDABACDABABCABAB";String pattern = "ABABCABAB";int index = kmpSearch(text, pattern);if (index != -1) {System.out.println("在索引 " + index + " 处找到模式");} else {System.out.println("在文本中未找到模式");}}// 构建最长前缀后缀数组private static int[] computeLPSArray(String pattern) {int m = pattern.length();int[] lps = new int[m]; // 初始化最长前缀后缀数组int len = 0; // 保存最长相等前缀后缀的长度int i = 1;   // 从模式串的第二个字符开始遍历while (i < m) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;i++;} else {if (len != 0) {len = lps[len - 1]; // 不匹配时,回溯到前一个字符的最长前缀后缀长度} else {lps[i] = 0; // 如果len已经为0,则表示当前字符无法与前面的字符构成相等的前缀后缀i++;}}}return lps;}// KMP搜索算法private static int kmpSearch(String text, String pattern) {int n = text.length();int m = pattern.length();int[] lps = computeLPSArray(pattern); // 构建最长前缀后缀数组int i = 0; // 文本索引int j = 0; // 模式索引while (i < n) {if (pattern.charAt(j) == text.charAt(i)) {i++;j++;}if (j == m) {return i - j; // 匹配成功,返回匹配的起始位置} else if (i < n && pattern.charAt(j) != text.charAt(i)) {if (j != 0) {j = lps[j - 1]; // 利用最长前缀后缀数组跳过一部分字符} else {i++;}}}return -1; // 未找到模式}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows+ubuntu离线安装翻译软件有道词典

背景&#xff1a; 某些情况下&#xff0c;需要在无法连接互联网的电脑上翻译单词&#xff0c;句子以及段落&#xff0c;就需要能离线安装和翻译的翻译软件&#xff0c;具备一定的词库量&#xff0c;目前找到了《有道词典》。 windows 亲测&#xff0c;无法联网的win10中安装…

【vim编辑器的使用】

文章目录 一. Linux软件包管理器yum二. Linux开发工具vim编辑器的使用。三. vim命令模式命令集和底行模式命令集。四底行模式命令集 五. 结束语 一. Linux软件包管理器yum 什么是软件包&#xff1f; 1. 在Linux下安装软件&#xff0c;一个通常的办法是直接下载程序的源代码&am…

OpenAI GPT 模型 API 接口新增参数 top_logprobs 和 logprobs

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 在最新的 OpenAI 官方 APIs 文档中&#xff0c;Create chat completion 中新增了 top_logprobs 和 logprobs 这两个关键参数。 官方文档地址&#xff…

黑马程序员SSM框架-Spring

视频链接&#xff1a;Spring-00-Spring课程介绍_哔哩哔哩_bilibili Spring Framework系统架构以及学习顺序 核心概念&#xff08;IoC、DI、Bean&#xff09; IoC入门案例 导入坐标 提供需要被管理的类&#xff08;Dao&#xff09;和需要被注入的类&#xff08;Service&#x…

接口测试之dubbo篇

Dubbo 是一款高性能、轻量级、基于 Java 的开源 RPC 框架&#xff08;最早由阿里开源&#xff0c; 2018 年贡献给了 Apache 组织&#xff09; Dubbo 接口的作用&#xff1a;远程调用 java 写的方法。 需要传参、获取返回值。 telnet 远程连接服务 连接语法&#xff1a; tel…

限制el-upload组件的上传文件大小

限制el-upload组件的上传文件大小 <el-upload :before-upload"handleBeforeUpload"><!-- 其他组件内容 --> </el-upload>Vue实例中定义handleBeforeUpload方法来进行文件大小的验证。你可以使用file.size属性来获取文件的大小&#xff0c;并与你期…

netcore 上传文件到阿里云OSS问题

AliYunOSSHelper类&#xff1a; namespace VOL.WebApi {public class AliYunOSSHelper: IScopedDependency{private ILogger _logger;/// <summary>/// 阿里云帮助类/// </summary>/// <param name"logger"></param>/// <param name&quo…

windows安全配置实验手册

访问控制策略&#xff08;L1940520022J&#xff09; 预备知识 Windows 7中&#xff0c;不仅有面向软件的限制方法&#xff0c;还增加了一种名为AppLocker的访问控制策略&#xff08;仅适用于企业版和旗舰版&#xff09;。 实验环境 操作系统类型&#xff1a;windows 7。 实…

Elasticsearch之常用DSL语句

目录 1. Elasticsearch之常用DSL语句 1.1 操作索引 1.2 文档操作 1.3 DSL查询 1.4 搜索结果处理 1.5 数据聚合 1. Elasticsearch之常用DSL语句 1.1 操作索引 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; - type&#xff1a;字段数据类…

【华为OD机试真题2023CD卷 JAVAJS】5G网络建设

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 5G网络建设 时间限制:4s 空间限制:256MB 限定语言:不限 题目描述: 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同…

前端性能优化三十:花裤衩模板多线程执行优化

(1). 痛点: ①. webpack构建过程中的有两个部分是直接影响构建效率:a. 文件的编译(更为耗时).b. 文件的分类打包.②. js是单线程模型:a. Node环境下文件只能一个一个去处理,webpack执行预处理文件时单线程的.③. 在webpack构建过程中:a. 需要使用Loader对js、css、图片、字体等…

二叉树OJ题——4.相同的树

100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 首先比较根节点是否相同&#xff0c;然后分别比较左右子树是否相同。 */bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(pNULL&&qNULL){return true;}if(pNULL||qNULL)…

利用html2Canvas将表格下载为html

给到我的需求是点击按钮时请求后端接口&#xff0c;根据后端返回的数据&#xff0c;生成表格,并将表格的内容直接下载为html,如下图。 平常做的下载都是后端返回二进制流&#xff0c;这次前端做下载那就必须把页面先画出来&#xff0c;因为下载下来的表格在页面上是不显示的&a…

直接插入排序和希尔排序

文章目录 前言概述直接插入排序本质分析代码总结 希尔排序一组一组排序多组同时进行完整的代码 总结 前言 排序&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; …

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法

目录 1. 概念2. getFields()方法2. getDeclaredFields()方法4. 总结 1. 概念 反射是Java中一种强大的机制&#xff0c;允许在运行时获取、检查和操作类、方法、字段等信息&#xff0c;而不需要在编译时知道这些信息。 其中字段&#xff08;Field&#xff09;在Java中是类中用…

C++ 中使用 std::map 的一个示例

std::map 是一个容器&#xff0c;可以用来存储键值对&#xff0c;其中键是唯一的&#xff0c;每个键都映射到一个值 #include <iostream> #include <map>int main() {// 声明了一个 std::map<std::string, int> 类型的变量 myMap&#xff0c;它可以将字符串…

Unity向Web服务器上传和下载图片

Unity向Web服务器上传和下载图片 如果本片有看不懂的请查看我上篇文章&#xff1a;[Unity与Web服务器Post&#xff0c;Get](https://blog.csdn.net/qq_42194657/article/details/103031573)一、上传和下载图片1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Textu…

❀My排序算法学习之插入排序❀

目录 插入排序(Insertion Sort):) 一、定义 二、基本思想 三、示例 时间复杂度 空间复杂度 bash C++

java:4-12第4章作业

计算下列表达式的结果 10/3310/5210%20-10.5%33&#xff1a; 【a%b当a是小数时&#xff0c; 公式a- (int)a /bb -10.5%3 -10.5 - (-10)/33 -10.59-1.5 注意&#xff1a;小数参与运算时&#xff0c;结果都是近似值】 试说出下面代码的结果 int i66; System.out.println(i i)…

模式识别与机器学习-特征选择和提取

模式识别与机器学习-特征选择和提取 特征选择一些距离测度公式独立特征的选择准则一般特征的散布矩阵准则 离散K-L变换 谨以此博客作为复习期间的记录。 常见分类问题的流程&#xff0c;数据预处理和特征选择提取时机器学习环节中最重要的两个流程。这两个环节直接决定了最终性…