关键词查找【Boyer-Moore 算法】
1、【Boyer-Moore 算法】
【算法】哪种算法有分数复杂度?- BoyerMoore字符串匹配_哔哩哔哩_bilibili
BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较,而会跳过其中某些部分。通常搜索关键字越长,算法速度越快。它的效率来自于这样的事实:对于每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配的位置。即它充分利用待搜索字符串的一些特征,加快了搜索的步骤。
BM算法实际上包含两个并行的算法(也就是两个启发策略):坏字符算法(bad-character shift)和好后缀算法(good-suffix shift)。这两种算法的目的就是让模式串每次向右移动尽可能大的距离(即上面的BM( )尽可能大)。
一般情况下,比KMP算法快3-5倍






package com.vedeng;public class BoyerMoore {private static final int NO_OF_CHARS = 256;// 预处理坏字符规则private static void badCharHeuristic(char[] str, int size, int[] badChar) {for (int i = 0; i < NO_OF_CHARS; i++) {badChar[i] = -1;}for (int i = 0; i < size; i++) {badChar[(int) str[i]] = i;}}// Boyer-Moore算法实现public static void search(char[] txt, char[] pat) {int m = pat.length;int n = txt.length;int[] badChar = new int[NO_OF_CHARS];// 预处理坏字符规则badCharHeuristic(pat, m, badChar);int s = 0; // s是shift的缩写,表示模式串相对于文本串的偏移while (s <= (n - m)) {int j = m - 1;// 从右向左匹配while (j >= 0 && pat[j] == txt[s + j]) {j--;}// 如果匹配成功,打印匹配的位置if (j < 0) {System.out.println("Patterns occur at shift = " + s);// 根据好后缀规则计算下一个可能的偏移s += (s + m < n) ? m - badChar[txt[s + m]] : 1;} else {// 根据坏字符规则计算下一个可能的偏移s += Math.max(1, j - badChar[txt[s + j]]);}}}public static void main(String[] args) {char[] txt = "ABAAABCD".toCharArray();char[] pat = "ABC".toCharArray();search(txt, pat);}
}

相关:
https://blog.csdn.net/qq_43197840/article/details/140680860?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_43197840/article/details/140680621?spm=1001.2014.3001.5501
相关文章:
关键词查找【Boyer-Moore 算法】
1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度?- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较,而…...
【前端手写代码】手写Object.create
思路:将传入的对象作为原型 // 思路:将传入的对象作为原型 function create(obj) {function F() { }F.prototype objreturn new F() }...
速通JS模块化规范
目录 1模块化概述 1.1什么是模块化? 1.2为什么需要模块化? 2有哪些模块化规范? 3导入与导出的概念 4CommonJS 规范 4.1初步体验 4.2导出数据 4.3导入数据 4.4扩展理解 4.5浏览器端运行 5ES6 模块化规范 5.1初步体验 5.2Node 中运…...
HamonyOS性能优化工具和方法
性能优化,如何做到更快的启动、更流畅的使用,概括图如下 ArkTS高性能编程: 1. ArkTS规则:有利于方舟编译运行时进行编译优化 2. 使用AOT(Ahead Of Time)模式对应用进行编译优化:方舟编译运行时通过采用PGO(Profile-Gui…...
前端实现边下载文件边上传
问题记录原因: 因为需要实现网络文件的上传,结果是由前端实现,方式是一边下载,一遍上传文件,小文件直接上传,大文件进行切片,切片大小和下载大小有关,特此记录。 1.实现方案 fetc…...
滑线变阻器的优缺点是什么?
滑线变阻器是常见的电子元件,主要用于调节电路中的电阻值,从而达到改变电流、电压的目的。它的主要优点是结构简单、操作方便、成本低,因此在各种电子设备中都有广泛的应用。然而,滑线变阻器也存在一些缺点,主要表现在…...
K8s大模型算力调度策略的深度解析
随着大数据和人工智能技术的飞速发展,Kubernetes(简称K8s)作为容器编排的领军者,在支撑大规模模型训练和推理方面扮演着越来越重要的角色。在大模型算力的调度过程中,如何高效、合理地分配和管理资源成为了一个亟待解决…...
Unity Transform组件实现动画:基础与进阶技巧
在Unity中,Transform组件是控制游戏对象(GameObject)位置、旋转和缩放的核心组件。通过编程控制Transform组件,开发者可以创建各种动画效果。本文将介绍如何使用Transform组件实现动画,从基础的运动到更高级的动画技巧…...
基于深度学习的图像与文本结合
基于深度学习的图像与文本结合的研究领域,是近年来多模态学习(Multimodal Learning)中非常活跃的方向。该领域涉及到如何将图像和文本两种不同类型的数据进行融合和处理,从而实现更智能的任务和应用。以下是对这一领域的详细介绍&…...
windows安全加固
一、补丁管理 及时安装补丁:定期检查和安装Windows系统及其应用程序的更新和补丁,以修复已知的安全漏洞。可以使用Windows Update功能或第三方补丁管理工具来实现。补丁管理策略:对于无法直接访问互联网的服务器,可以建立内部补丁…...
网络安全是什么?怎么入门网络安全?
一、网络安全的定义 网络安全,简单来说,就是保护网络系统中的硬件、软件以及其中的数据不因偶然或恶意的原因而遭到破坏、更改、泄露,保障系统连续可靠正常地运行,网络服务不中断。 随着信息技术的飞速发展,网络安全的…...
语义分割介绍
1. 定义 语义指具有人们可用语言探讨的意义,分割指图像分割。 语义分割(semantic segmentation)能够将整张图的每个部分分割开,使每个部分都有一定类别意义(语义),让计算机可以理解图像。 语义分割是以描边的形式&…...
Unity Editor免登录启动 无需UnityHub
Unity Editor免登录启动项目无需UnityHub,命令行启动项目。需要开发Unity项目,就必须使用 Unity Hub来管理你的项目,还必须要申请一个免费许可,确实有点麻烦,官方已经提供了相关命令行,来直接使用Unity Edi…...
Redis实战篇(黑马点评)笔记总结
一、配置前后端项目的初始环境 前端: 对前端项目在cmd中进行start nginx.exe,端口号为8080 后端: 配置mysql数据库的url 和 redis 的url 和 导入数据库数据 二、登录校验 基于Session的实现登录(不推荐) …...
vulntarget-b
实际部署之后centos7 的ip有所变动分别是 :192.168.127.130以及10.0.20.30 Centos7 老规矩还是先用fscan扫一下服务和端口,找漏洞打 直接爆出来一个SSH弱口令…,上来就不用打了,什么意思??? 直接xshell…...
Axure Web端元件库:构建高效互动网页的基石
在快速迭代的互联网时代,Web设计与开发不仅追求视觉上的美感,更注重用户体验的流畅与功能的强大。Axure RP,作为一款专业的原型设计工具,凭借其强大的交互设计能力和丰富的元件库,成为了众多UI/UX设计师、产品经理及前…...
mac OS matplotlib missing from font(s) DejaVu Sans
如果能搜索到这篇文章,我猜你遇到了和我一样的问题:matplotlib绘图中文乱码。如下: 出现这个问题的原因是:matplotlib使用的字体列表中默认没有中文字体。 这里说一种解决方案:我们可以在文件中手动指定matplotlib使用…...
在 .NET 中使用 Elasticsearch:从安装到实现搜索功能的完整指南
在 .NET 中使用 Elasticsearch Elasticsearch 是一个强大的搜索和分析引擎,广泛应用于处理大规模数据和实时搜索需求。本文将介绍如何在 .NET 环境下使用 Elasticsearch,帮助开发者快速上手并实现基本的搜索功能。 1. 环境准备 首先,我们需…...
Ecovadis认证的步骤需要怎么做?
Ecovadis是一家提供企业可持续发展评估和认证服务的机构。如果您想获得Ecovadis的认证辅导,可以按照以下步骤进行: 了解Ecovadis认证要求:在开始准备之前,先仔细研究Ecovadis的认证要求和标准。您可以访问Ecovadis的官方网站&…...
git sendemail使用
教程参考: git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…...
你的EEPROM数据丢了吗?基于STM32和AT24CXX的I2C通信稳定性实战调优指南
EEPROM数据可靠性实战:STM32与AT24CXX的I2C通信深度优化 在工业控制、医疗设备和消费电子等领域,EEPROM作为非易失性存储器承担着关键参数存储的重任。但当系统突然断电或遭遇电磁干扰时,工程师们常会遇到数据丢失、校验失败等棘手问题。本文…...
传统锯床与特斯克天弓系列PC-36带锯床:八大维度对比,差距在哪?
传统锯床与特斯克天弓系列PC-36带锯床:八大维度对比,差距在哪?不是所有数控带锯机,都叫天弓特斯克天弓系列PC-36带锯床在带锯床选型中,购置价格之外,综合使用成本(锯条消耗、废品损失、维保成本…...
VideoDownloadHelper:打破网页视频下载壁垒的智能解决方案
VideoDownloadHelper:打破网页视频下载壁垒的智能解决方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾遇到过这样的困…...
脑机接口的 “信号生命线”:自研模拟前端如何破解非侵入式采集的性能困局
近些年来,脑机接口技术飞速发展,打破了人脑与外部设备之间的沟通壁垒,摆脱肢体、语言的限制,实现大脑信号与机器设备的直接交互。这项技术广泛应用于医疗康复、智能交互、疲劳监测、认知分析等领域,也是当下人工智能、…...
新唐NuEzAI-M55M1开发板:基于Cortex-M55与Ethos-U55的终端AI部署实战
1. 项目概述:当AI遇见微控制器,一场边缘计算的“瘦身革命” 最近,新唐科技(Nuvoton)发布了一款名为NuEzAI-M55M1的开发板,在嵌入式圈子和AI应用开发者中激起了不小的水花。这玩意儿乍一看,又是一…...
用Vector2.Lerp、MoveTowards和SmoothDamp搞定Unity 2D物体平滑移动(附性能对比)
Unity 2D平滑移动实战:Vector2.Lerp vs MoveTowards vs SmoothDamp 在2D游戏开发中,角色的移动效果直接影响玩家的操作体验。一个生硬的位移会破坏游戏沉浸感,而恰到好处的缓动则能让操作手感提升一个档次。Unity提供了三种核心方法来实现2D平…...
Poppins几何字体:如何让拉丁文与天城体在同一个视觉世界里和谐共舞?
Poppins几何字体:如何让拉丁文与天城体在同一个视觉世界里和谐共舞? 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 当你的产品需要同时面向印度用户和全…...
AGENTS半自主智能体架构:状态驱动的可追溯可恢复Agent系统
1. 项目概述:这不是又一个“Agent框架”,而是一次LLM应用范式的重新校准“Inside AGENTS”这个标题里藏着三个关键信号:Inside——它不是教你怎么用,而是带你钻进引擎舱看活塞怎么运动;AGENTS——大写的复数࿰…...
告别静态分析!用R包SetMethods搞定面板数据QCA的三大一致性(附代码实战)
动态QCA实战指南:用R包SetMethods破解面板数据三大一致性难题 社会科学研究者常面临一个核心挑战:如何从随时间变化的面板数据中提取稳定可靠的因果模式?传统横截面QCA分析往往无法捕捉时间或个体效应,导致结论缺乏稳健性。本文将…...
嵌入式Linux UVC驱动开发:DWC2控制器与处理单元数据流详解
1. 项目概述:从DWC2控制器到UVC处理单元在嵌入式Linux系统里搞USB摄像头驱动开发,尤其是用DWC2这种集成在SoC里的USB控制器,UVC(USB Video Class)驱动的“处理单元”绝对是个绕不开的核心。很多朋友在移植或调试摄像头…...
