首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

字符串查找----Boyer-Moore算法(从右向左匹配)

Boyer-Moore算法是一种从右向左扫描模式字符串并将它与文本匹配的算法。 举例说明Boyer-Moore算法: 有文本FINDINAHAYSTACKNEEDLE和模式字符串NEEDLE....不匹配,因为模式字符串中也出现了N,则右移模式字符串使得模式中最右边的N(这里是位置0的N)与文本中的相应N对齐。...在right[]数组计算后,算法实现起来就非常容易了。用一个索引i在文本中从左向右移动,用索引j在模式字符串中从右向左移动。...否则匹配失败,失败有三种情况: 如果造成失败的字符不包含在模式字符串中,则将模式字符串向右移动j+1个位置; 如果造成失败的字符包含在模式字符串中,根据right[]数组右移模式字符串; 如果这种方法无法增大...i,就直接将i+1保证模式字符串至少向右移动一个位置。

1.1K00

字符串匹配的Boyer-Moore算法

上一篇文章,我介绍了KMP算法。 但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法。...Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。...下面,我根据Moore教授自己的例子来解释这种算法。 1. 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。 2....所以,Boyer-Moore算法的基本思想是,每次后移这两个规则之中的较大值。 更巧妙的是,这两个规则的移动位数,只与搜索词有关,与原字符串无关。...如果还要继续查找(即找出全部匹配),则根据"好后缀规则",后移 6 - 0 = 6位,即头部的"E"移到尾部的"E"的位置。 (完)

65630
您找到你想要的搜索结果了吗?
是的
没有找到

字符串查找----查找算法的选择

首先来对比一下通用的查找算法字符串查找算法: 各种字符串查找算法的性能特点 算法(数据结构) 优点 二叉查找树(BST) 适用于随机排列的键 2-3树查找(红黑树) 有性能保证 线性探测法(并行数组)...内置类型,缓存散列值 R向单词查找树 适用于较短键和较小的字母表 三向单词查找树 适用于非随机的键 如果空间足够,R向单词查找树的速度是最快的,能够在常数次次数比较内完成查找。...对于大型字母表,R向单词查找树所需空间可能无法满足时,三向单词查找树是最佳选择,因为它对字符比较次数是对数级别的,而二叉查找树中键的比较次数是对数级别的。

3K00

字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?

关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多。...至于选择哪一种字符串匹配算法,在不同的场景有不同的选择。 在我们平时文档里的字符查找里 ? 采用的就是 Boyer-Moore 匹配算法了,简称BM算法。...这个算法也是有一定的难度,不过今天,我选用一个例子,带大家读懂这个字符串匹配 BM 算法,看完这篇文章,保证你能够掌握这个算法的思想。 首先我先给出一个字符串和一个模式串 ?...接下来我们要在字符串查找有没有和模式串匹配的字串,步骤如下: 坏字符 1、 ? 和其他的匹配算法不同,BM 匹配算法,是从模式串的尾部开始匹配的,所以我们把字符串和模式串的尾部对齐。...希望这篇文章,能够让你读懂给 BM 算法,这个算法的核心就是坏字符和好后缀了,相信你一定能够搞懂!后面会连续讲解几篇与树有关的文章

1.8K30

算法字符串匹配(查找)-BF算法

欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。 字符串是数据结构中比较简单的一种,但又是我们最常用的数据结构之一。...对于字符串对象,最重要的操作之一便是字符串匹配(查找),本篇文章便向大家介绍一个典型的匹配算法—BF算法 为了方便理解,我们直接从问题入手,来理解这两种算法。...BF算法 目标串:BBC ABCDAB ABCD ABCDABDE 模式串:ABCDABD 提示:(空格也是一个字符串) 问题:查看模式串是否出现在目标串中,并找出其在目标串中的下标位置 分析:大家在碰到这个问题时...输出字符串匹配失败 注意: 很多人在自己思考这个问题时,会犯一个错误。...更多精彩文章: 算法|从阶乘计算看递归算法 算法|字符串匹配(查找)-KMP算法 JavaScript|脚本岂能随意放置 Web|设置隔行变色的单元格 开发|优秀的Java工程师的“对象”一定不错

1.7K30

字符串字符串查找 ( 蛮力算法 )

文章目录 一、字符串查找 二、蛮力算法代码示例 一、字符串查找 ---- 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串查找 另外一个字符串..., 那面试基本就凉了 ; 暴力算法的复杂度是 O(m \times n) , m 是第一个大字符串的长度 , n 是被查找字符串长度 ; KMP 算法 是专门用于解决该问题的算法 , 该算法...只能用于解决在一个字符串查找另外一个字符串的问题 ; KMP 算法主要靠背诵 , 没有涉及到算法的理论 , 只能用于解决单一字符串查找问题 , 一般面试时不考虑使用该算法 ; KMP 算法算法复杂度是...O(m + n) ; Rabin-Karp 算法 比 KMP 算法更简单 , 其基本原理就是比较字符串的 哈希码 ( HashCode ) , 快速的确定子字符串是否等于被查找字符串 ; 二、蛮力算法代码示例...对应字符是否相等 * @param source:在该字符串查找字符串 * @param target:被查找字符串 * @return: return the index

2.7K20

算法查找字符串的 KMP 算法

“在一个字符串S中查找一个词W出现的位”是一道常见的面试题。 相对于那些要对树、图进行操作的算法,这个算法要处理的是一维线性的字符序列。看起来似乎简单不少,那么算法难度会更低吗?让我们来看看。...简单直接的字符串查找算法 算法原理 首先,如果只是笼统地从一个字符串查找另一个字符串,有一种很直接的方法,那就是: 从 S 的第 1 个字符开始,与 W的每一个字符一一匹配。...如果一致,就继续匹配下一个,如果w的所有字符都匹配上了,则说明已经查找到了W。...算法流程图 本算法流程图如下: ? 算法运行示例 按照它进行字符串查找的案例如下: ? 算法性能 这个算法又简单又好操作,唯一的缺点是有点慢。...算法流程图 下图是 KMP 算法的流程图: ? 与直接算法的对比 我们横向对比一下直接查找字符串算法和 KMP 算法,会发现,其实就是紫色框内的部分不同而已。 ?

1.1K10

KMP子字符串查找算法

KMP子字符串查找算法 概述 算法的基本思想是:当出现不匹配时,就能知晓一部分文本的内容,可以利用这些信息避免将指针回退到所有这些已知的字符串之前。...DFA(确定有限状态机)模拟 提前判断如何重新查找,而这种判断只取决于模式本身,所以可以对模式的字符序列做一个确定有限状态机。...,M状态为终止状态,找到了完整匹配的字符串。...编码实现 用暴力算法实现子字符串查找算法 public int search(String txt, String pat) { int i, N = txt.length(...缺点:最坏的情况(在重复性很高的文本中查找重复性很高的模式)在实际应用中很少出现,还不如使用暴力算法来的容易,性能也差不了多少。

1.4K60

从入门到精通之Boyer-Moore字符串搜索算法详解

本文讲述的是Boyer-Moore算法Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解这个算法,发现这个算法一开始还挺难理解的,也许是我理解能力不是很好吧,花了小半天才看懂,看懂了过后就想分享下...,因为觉得这个算法真的挺不错的,以前一直以为字符串搜索算法中KMP算很不错的了,没想到还有更好的,Boyer-Moore算法平均要比KMP快3-5倍。...①由来介绍 在用于查找字符串算法当中,BM(Boyer-Moore算法是目前被认为最高效的字符串搜索算法,它由Bob Boyer和J Strother Moore设计于1977年。...GNU grep使用了非常著名的Boyer-Moore算法 GNU grep还展开了Boyer-Moore算法的内部循环,并建立了一个Boyer-Moore的delta表,这样它就不需要在每一个展开的步骤进行循环退出判断了...所以GNU grep没有使用基于行的输入,而是将原数据读入到一个大的缓冲区buffer,用Boyer-Moore算法对这个缓冲区进行搜索,只有在发现一个匹配之后才会去查找最近的换行符(某些命令参数,比如

1.5K80

字符串字符串查找 ( Rabin-Karp 算法 )

文章目录 一、字符串查找 二、Rabin-Karp 算法 一、字符串查找 ---- 算法题目链接 : https://www.lintcode.com/problem/13/ 在 一个字符串查找 另外一个字符串...第一次出现的位置 ; 如 : 在 “abcdefghijk” 中查找 “def” 第一次出现的位置 , 是 4 ; 该方法使用 暴力算法 , 两层 for 循环 , 肯定可以解决 ; 如果用暴力算法..., 那面试基本就凉了 ; 暴力算法的复杂度是 O(m \times n) , m 是第一个大字符串的长度 , n 是被查找字符串长度 ; KMP 算法 是专门用于解决该问题的算法 , 该算法...只能用于解决在一个字符串查找另外一个字符串的问题 ; KMP 算法主要靠背诵 , 没有涉及到算法的理论 , 只能用于解决单一字符串查找问题 , 一般面试时不考虑使用该算法 ; KMP 算法算法复杂度是...O(m + n) ; Rabin-Karp 算法 比 KMP 算法更简单 , 其基本原理就是比较字符串的 哈希码 ( HashCode ) , 快速的确定子字符串是否等于被查找字符串 ; 二、Rabin-Karp

1.1K20

字符串查找----各种算法总结

优点: 暴力查找算法:实现简单且在一般情况下工作良好(Java的String类型的indexOf()方法就是采用暴力子字符串查找算法); Knuth-Morris-Pratt算法能够保证线性级别的性能且不需要在正文中回退...; Boyer-Moore算法的性能一般情况下都是亚线性级别; Rabin-Karp算法是线性级别; 缺点: 暴力查找算法所需时间可能和NM成正比; Knuth-Morris-Pratt算法Boyer-Moore...算法需要额外的内存空间; Rabin-Karp算法内循环很长(若干次算术运算,其他算法都只需要比较字符); 各种字符串查找算法实现的成本总结 算法 版本 最坏情况 一般情况 是否回退 正确性 额外空间需求...暴力算法 -- MN 1.1N 是 是 1 KMP算法 完整的DFA(博客中实现的方法) 2N 1.1N 否 是 MR 仅构造不匹配的状态转换 3N 1.1N 否 是 M 完整版本 3N N/M...是 是 R Boyer-Moore算法 启发式查找不匹配字符 MN N/M 是 是 R Rabin-Karp算法 蒙特卡洛算法 7N 7N 否 是* 1 拉斯维加斯算法 7N* 7N 是 是 1 *

97100

算法——查找算法

1、顺序查找: 定义: 顺序查找(Sequential Search) 又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等...(二分查找) 定义: 折半查找(Binary Search) 技术,又称为:二分查找。...折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找...不断重复上述过程,直到查找成功,或所查找区域无记录,查找失败为止 代码: import org.junit.jupiter.api.Test; /** * 二分查找 * 1.循环实现 * 2.递归实现...Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式。

68510

算法查找算法

查找算法 查找的定义 查找:又称检索或查询,是指在查找表中找出满足一定条件的结点或记录对应的操作。...查找效率:查找算法中的基本运算是通过记录的关键字与给定值进行比较,所以查找的效率通常取决于比较所花的时间,而时间取决于比较的次数。通常以关键字与给定值进行比较的记录个数的平均值来计算。...数组是特殊的块索引(一个块一个元素): [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDbRyWBM-1635489015712)(查找算法.assets/image-...[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LawbrgF-1635489015715)(查找算法.assets/image-20211028180620292.png...)] 分块查找算法分两步进行,首先确定所查找的节点属于哪一块,即在索引表中查找其所在的块,然后在块内查找待查询的数据。

42420

查找算法

查找,作为应用最为广泛和最基础的算法思想之一,几乎在所有应用程序之中都有它的思想身影。...二分查找 下面来看看看二分查找,二分查找适用于排序之后的数组,算法的思想也很简单:首先对数组进行排序,每次用数组中的中间那个数字和要查找的数字相比较,如果数组中间的那个数字大于要查找的那个数字,那么在数组的左半边继续执行二分查找...散列查找 最后来看一下散列查找,上面提到过,散列查找是基于标记数组的思想,而且通过散列查找我们不仅能够对整形数字进行查找,还能够对一些非整形数字的数据类型(字符串、浮点数)进行查找。...其实散列查找的思想就是采用标记数组的思想,只不过当我们碰到一些非整数的数据类型的数据时,我们要将它们转换成整形,那么就拿字符串来说,我们要将字符串转换成为能够作为数组下标的整数,那么可能有些小伙伴要问了...Ok, 这就是一些关于查找算法思想,希望能帮到你。 如果博客中有什么不正确的地方,还请多多指点。 谢谢观看。。。

66620

查找算法

查找算法 线性查找 二分查找 差值查找 斐波那契查找 鉴于在排序算法时, 搞得比较乱的情况, 导致查找不太方便....因此, 在写查找算法时, 我会将所有的东西都写在一起, 便于查找和阅读 在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 线性查找 思路: 如果在数组中发现满足条件的值...我们根据代码来实现这个算法 /** * 二分查找法 * * @author TimePause * @create 2020-02-07 15:42 */ public class BinarySearch...插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。...(使用非递归方式编写算法) * * @param a 数组 * @param key 需要查找的关键码 * @return 返回对应下标,如果没有-1

74810

查找算法之折半查找+分块查找

基本概念 查找表:由同一种类型的数据元素(记录)组成 静态查找表:只需要查找算法 动态查找表:除了查找,还需要增删改查数据元素 关键字:唯一标识数据元素的数据项 常见的查找算法 折半查找 概念 折半查找又称二分查找...算法 //查找算法 int binary_search(seqlist L,Elemtype key) { int low,high=L.TableLen-1,mid; while(low<=high)...(LOW=HIGH)/2}向下取整,则对于任何一个节点,必有右子树结点数-左子树结点数=0或1 折半查找判定树必定是平衡二叉树 折半查找判定树中,只有最下面一层是不满的,因此元素个数为n时,树高h={log2...(n+1)}向下取整 失败结点:n+1(等于成功节点的空链域数量) 分块查找 分块查找,又称索引顺序查找算法过程: 在索引表中确定待查记录所属的分块(可顺序,可折半) 在块中查找 若索引表中不包含目标关键字...,则折半查找索引表最终停在LOW>HIGH,要在LOW所指分块中查找

1.6K30
领券