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

使用kmp算法匹配字符串来查找文件(java版)

.:) 正文如下 接上一篇文章,依据字符串来查找文件。当时使用Python来实现的,没使用啥算法,也就算是暴力匹配,查找速率很是慢。所以这次是使用KMP算法来实现。...首先要先了解KMP算法,记得大学的时候老师有讲过这个算法,可惜自己没好好听…于是网上找资料,主要就是看末尾引用的那篇文章,想了解KMP的倒可以看这篇,谢谢这位博主 KMP算法 KMP算法有两种实现 基于部分匹配值表的实现...基于next数组的实现 KMP算法的第一种实现方式需要基于部分匹配值表,其大部分时候匹配移动的位数就是根据这个部分匹配值表来操作的,所以部分匹配值表对于这种KMP算法来说是很重要的。...KMP算法移动位数情况 KMP算法的移动方式都是将字符串固定,移动搜索串 假设有两个数组,搜索串:searchStr[]和字符串:totalStr[],分别用下表s和t表示 无论t的值是多少,在当searchStr...,使用全匹配的基于部分匹配表的KMP算法"); Scanner scanner = new Scanner(System.in); while(true){

1.4K10

使用kmp算法匹配字符串来查找文件(java版本)-2

前言 接上篇文章, 这里完成改文章的后部分, 以python编写的版本 正文如下 同时,我也对原先写的python代码进行了修改,使用KMP算法 python实现KMP算法代码 其python实现的KMP...算法核心代码如下 def kmpSearchStrByStr(totalStr, strSearch, kmpTable): #kmp算法查找 #返回字符串中包含搜索串的个数...的部分匹配数值表 #但得先获取字符串所有可能长度的最大公告元素长度,将其存放到int数组中返回 intTablesLength = len(strSearch) kmpTable...len(listFront[n]) #print(intMaxPublicNum) return intMaxPublicNum python和java搜索对比 python实现的字符串搜索文件和...java实现的字符串搜索文件,其运行速率对比还是很明显,估计问题就在python对文件编码格式上面,如图 640 (1).png 速率相差太大,估计就是代码的问题 java代码同样也是臃肿… ---

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

    KMP和String.indexOf

    JDK源码中的String.indexOf是蛮力匹配的,可是JDK库的indexOf要比KMP快?算法不是让计算效率更高吗?...(推荐阮一峰老师的《字符串匹配的KMP算法》)的就会有疑问为什么JDK源码中不用KMP算法实现?...对于(假定)在相对较短的字符串中搜索的常见用例,KMP实际上可能比原始实现要慢。...与此同时,对于真正庞大的数据集,你可能会使用比简单字符串更专门的数据结构,这意味着增加的实现(可能还有运行时)的成本,是不值得的投资。...只使用最基本的便利来实现判断字符串a是否被包含在字符串b中, 并且返回第一次出现的位置(找不到返回-1),算法效率尽量高, 不要使用indexOf、正则、substring、contain、slice

    1.9K20

    Java使用Sunday算法来根据字符串内容查找文件

    顺便看看Sunday算法 Sunday算法的查找匹配速率比KMP算法快,其匹配规则也简单易懂....其移动位数主要时参考与字符串中参加匹配的最末位字符的下一位字符,如果该字符并未在搜索串中出现,则将字符串指针移动到该字符的下一位字符,搜索串指针则归零,反之,如果参加匹配的最末位字符的下一位字符出现在搜索串中...while循环里面的代码,这里主要需注意字符串指针移动时的溢出问题,添加的条件即代码中的num 算法在while...循环中多了一部for循环,其做的就是将那下一个字符与搜索串进行匹配,如果第一次就匹配成功,即break Sunday和KMP对比 就拿之前写的KMP算法代码来对比 KMP算法 640 (2).png...Sunday算法 640 (3).png 所以总体来说,Sunday较KMP来说匹配速率更快,代码实现也更简单 ---- 首发来自公众号: 程序员品 qrcode_for_gh_3a45e815cefd

    1.3K00

    快速字符串匹配一: 看毛片算法(KMP)

    所以为了学习快速字符串匹配,并再次温故 KMP ,所以我决定使用 KMP 算法试一试。如果以后在面试的时候,可以将KMP 完整的写出来,那岂不是很牛逼?...并且,理解一个算法,得找到适合自己的角度。 因此我理解 KMP 算法的角度,就是 字符串前缀和后缀,在我的脑子里,用前缀和后缀去理解 KMP 是很容易的。...那么原始的字符串匹配过程就是 暴力的一位一位去比。...所以这种方法下,文本字符串只遍历一次,它不会倒退的。 这就是我所理解的 KMP 算法的核心思想。...** KMP 就是利用字符串的前缀和后缀做文章** 具体过程 KMP 算法的物理核心思想理解了,接下来就是代码实现了。如果保存 匹配字符串的公共前后缀信息,以及它的子串的公共前后缀信息呢?

    2K20

    对KMP算法中next数组的深入理解(这个算法真有点难懂)

    首先了解kmp算法是干嘛的,它的作用是进行一个模式匹配,即在一个字符串中寻找是否存在某一个子串,比如在aabbccabc这个主串中是否存在abc这个模式串,并且输入他们匹配时,在主串的位置,如上例中,...这就是kmp算法的作用。...kmp算法的最大特点是,它不用将主串中的已经匹配过的字符进行回退(这里是和经典算法进行比较,经典的匹配情况,我们大家应该都能想到,就是在两个字符串进行比对的过程中,主串第1位和模式串第1位比较,主串第2...这样依次下去,时间复杂度为o(mn),即是一个积)而kmp算法,通过使用已经匹配的位置信息,来使时间复杂度减小到O(m+n)。而在kmp算法中最关键的就是next数组的计算。...KMP算法总代码 // s0722(2).cpp : 定义控制台应用程序的入口点。

    4.1K10

    一文详解 KMP 算法

    解法; 如果是一道中等题(数据范围 ~ )的话,则是在考察我们 KMP 等字符串匹配算法。...KMP 解法 KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」的下标。...我们可以先看看如果不使用 KMP,会如何进行匹配(不使用 substring 函数的情况下)。 首先在「原串」和「匹配串」分别各自有一个指针指向当前匹配的位置。 首次匹配的「发起点」是第一个字符 a。...到这里,你应该清楚 KMP 为什么相比于朴素解法更快: 因为 KMP 利用已匹配部分中相同的「前缀」和「后缀」来加速下一次的匹配。...背过这样的算法的意义在于:相当于大脑里有了一个时间复杂度为 的 api 可以使用,这个 api 传入一个原串和匹配串,返回匹配串在原串的位置。

    89652

    【数据结构】— kmp算法和strstr函数

    kmp算法和strstr函数 引言 一、概念分析 分析 原理分析 KMP算法原理 基本操作 图解 KMP原理 三、复杂度分析 四、KMP算法代码 引言 现实生活中,字符串匹配在很多的应用场景里都有着极其重要的作用...一、概念分析 首先我们需要了解到什么是kmp算法和strstr函数 概念如下:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特...—莫里斯—普拉特操作(简称KMP算法)。...两者进行一对比发现差距真的很大,而且kmp算法算然把字符串遍历了一遍,但如果不遍历一遍,怎么可能匹配的出来呢?...请再想一想我们当初为什么能配到这里呢? 这个位置之前,我们全都一样,所以多长的后缀都是相等的。

    67720

    【算法】BF、KMP算法及OJ题

    文章目录 前言 BF算法 BF算法的核心 BF代码实现 KMP算法 next数组的引入 KMP代码实现 next数组的优化 相关OJ题 实现 strStr() 前言 大家好,好久不见,这里是平凡的人...,众所周知,现在是暑假时期,趁现在时间比较充裕,博主将通过这篇博客具体介绍数据结构与算法中的BF、KMP算法, 记录自己的学习过程加上自己的理解,希望能够帮到更多的人了解学习BF、KMP算法。...---- BF算法 为什么要先来说BF算法❓ BF算法可以说是KMP算法的基础,KMP算法是建立在BF算法之上的。...所以学习BF算法之后能够让我们更快的去理解KMP算法内容,所以我们就先BF算法说起。...算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。

    55910

    数据结构KMP_rsa算法例题

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。...KMP解决的问题类型 KMP算法的作用是在一个已知字符串中查找子串的位置,也叫做串的模式匹配。比如主串s=“university”,子串t=“sit”。现在我们要找到子串t 在主串s 中的位置。...下面就开始进入我们的正题:KMP算法是怎样优化这些步骤的。其实KMP的主要思想是:“空间换时间”。 大家打起精神,认真看下面的内容。 首先,为什么朴素的模式匹配这么慢呢?...这里也是最奇妙的地方,也是为什么KMP算法的代码可以那么简洁优雅的关键。...算法的改进 为什么KMP算法这么强大了还需要改进呢?

    32010

    【算法】查找字符串的 KMP 算法

    比如上面的例子,为什么不能像下面这样运行呢? ? 这样看起来也挺好嘛。如果把匹配过的都跳过去,那整个算法的时间复杂度不就变成 O(n)了吗? 改进引出的错误 为什么不跳?...我们看这两个集合的并集为 {“abab”, “ab”},而显然 “abab” 比 “ab” 要长,那么也就是说 “ababab” 这个字符串的子字串 “abab” 同时是原字串的前缀和后缀,而且是所有满足这一条件的子字串中最长的那个...KMP 算法详解 算法原理 其实,KMP算法可以用我们前面说的直接算法来套用: 从 s 的第 1 个字符开始,与 w 的每一个字符一一匹配。...算法流程图 下图是 KMP 算法的流程图: ? 与直接算法的对比 我们横向对比一下直接查找字符串算法和 KMP 算法,会发现,其实就是紫色框内的部分不同而已。 ?...两种算法的编程实现 直接匹配算法 有了流程图,我们来实现代码就容易多了,我们可以先从直接匹配算法开始: ? KMP 算法 对应的 KMP 算法代码如下: ?

    1.2K10

    字符串: KMP是时候上场了(一文读懂系列)

    本篇文章,将以如下顺序来讲解KMP, 什么是KMP KMP可以解决什么问题 分析KMP算法里的next数组 什么是前缀表 再分析为什么要是前缀表而不是什么哈希表其他表等等,偏偏要是前缀表。...所以叫做KMP KMP有什么用 KMP主要应用在字符串匹配上。 KMP的主要思想是「当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。」...以下这句话,对于理解为什么使用前缀表可以告诉我们匹配失败之后跳到哪里重新匹配 非常重要!...「很多介绍KMP的文章或者视频并没有把为什么要用前缀表?这个问题说清楚,而是直接默认使用前缀表。」 如何计算前缀表 接下来就要说一说怎么计算前缀表。 如图: ?...总结 本篇我们介绍了什么是KMP,KMP可以解决什么问题,然后分析KMP算法里的next数组,知道了next数组就是前缀表,再分析为什么要是前缀表而不是什么其他表。

    90320

    【数据结构】您有一份KMP算法教学已到账,请注意查收!!!

    下面我们就来看一下它为什么可以不用回溯。...现在大家就能很清楚的看到,在这个演示的例子中,通过KMP算法在第一次匹配失败后,到下一次进行有意义的匹配时就比朴素模式匹配算法节省了4次匹配的过程——两次肯定不匹配和两次肯定匹配。...不难想象,通过KMP算法进行模式匹配时比朴素匹配算法缩减的时间开销是非常可观的。...模式匹配实际上就是串的定位操作,只不过此时我们采用的是KMP算法实现串定位操作,因此函数名我们选择使用Index_KMP来表示该定位操作是通过KMP算法实现; 函数的参数在朴素模式匹配算法的基础上,我们需要多传入一个...结语 在今天的内容中我们详细介绍了KMP算法的相关内容,通过今天的内容,我们认识到了4个概念: 前缀:除了字符串最后一个字符以外的所有头部子串 后缀:除了字符串首字符以外的所有尾部子串 部分匹配值(Partial

    10310

    腾讯大连电话面试题目

    2.讲讲STL里你常用的数据结构 2.1那么map的时间复杂度是多少 2.2map的底层实现是什么 3.讲解MVC每一层分别是什么 4.从一个长的字符串里查找子字符串用到的算法 这一题我知道是用那个...O(m+n)的经典算法,但是名字我想不起来了,不过面试官说名字想不起来没关系。。。...KMP!!!! 5.为什么在用迭代遍历vector的过程中不宜修改vector里面元素的值?从工程的角度考虑。 6.从工程的角度来说,有什么功能是new能做到而malloc做不到的。...它们都可用于申请动态内存和释放内存。 2)malloc是库函数只能作用于内部数据类型,对于非内部数据动态对象而言,就不能完成对象的初始化与销毁,即执行构造函数与析构函数,而new 与 delete此类运算符就能够在编译器的控制权限内完成...,malloc/free也一样。 7.你平时使用什么编译器。

    64820

    重学KMP!

    本篇将以如下顺序来讲解KMP, 什么是KMP KMP有什么用 什么是前缀表 为什么一定要用前缀表 如何计算前缀表 前缀表与next数组 使用next数组来匹配 时间复杂度分析 构造next数组 使用next...前缀表与next数组 很多KMP算法的时间都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢?...所以整个KMP算法的时间复杂度是O(n+m)的。 暴力的解法显而易见是O(n * m),所以KMP在字符串匹配中极大的提高的搜索的效率。...都知道使用KMP算法,一定要构造next数组。 构造next数组 我们定义一个函数getNext来构建next数组,函数参数为指向next数组的指针,和一个字符串。...,KMP可以解决什么问题,然后分析KMP算法里的next数组,知道了next数组就是前缀表,再分析为什么要是前缀表而不是什么其他表。

    48120

    字符串:KMP算法还能干这个!

    那么寻找重复子串怎么也涉及到KMP算法了呢? 这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( 字符串:听说你对KMP有这些疑问?...「强烈建议大家把next数组打印出来,看看next数组里的规律,有助于理解KMP算法」 如图: ?...的文章,首先是字符串:KMP是时候上场了(一文读懂系列)讲解KMP算法的基础理论,给出next数组究竟是如何来了,前缀表又是怎么回事,为什么要选择前缀表。...然后通过字符串:都来看看KMP的看家本领!讲解一道KMP的经典题目,判断文本串里是否出现过模式串,这里涉及到构造next数组的代码实现,以及使用next数组完成模式串与文本串的匹配过程。...后来很多同学反馈说:搞不懂前后缀,什么又是最长相同前后缀(最长公共前后缀我认为这个用词不准确),以及为什么前缀表要统一减一(右移)呢,不减一行不行?针对这些问题,我在字符串:听说你对KMP有这些疑问?

    58840

    特殊变量 (SQL)

    只要可以在SQL中指定文字值,就可以使用它们。SQL特殊变量名不区分大小写。大多数可以使用缩写来指定。...(SQL)字符串操作函数和运算符。...特殊编码的字符串(称为列表)包含嵌入的子字符串标识符,而不使用分隔符。各种 $LIST 函数对这些与标准字符串不兼容的编码字符串进行操作。...以下函数在字符串中按位置或分隔符搜索子字符串并返回子字符串: $EXTRACT:按字符串位置搜索,返回由开始位置或开始和结束位置指定的子字符串。从字符串的开头搜索。...%STARTSWITH 比较运算符将指定的字符与字符串的开头进行匹配。子串搜索和替换以下函数在字符串中搜索子字符串并将其替换为另一个子字符串。

    1.2K20

    KMP算法笔记II ----- 学会计算next数组

    第一次学习KMP算法走了不少弯路,下面老高按照自己的学习步骤,总结一下KMP算法的要点,如果有错误或者疑问,欢迎指正! 老高使用python语言实现算法,实现的语言不重要,重要的是他的思想!...k 代表next数组时最大前缀后缀的长度 next(next) 代表 next数组 理解KMP算法 通过第一篇,我们知道用笨办法查找字符串,现在我们通过一些特例来了解KMP算法。...现在我们考虑在某个字符串搜索字符ABABC,下面演示一下 A B A B Å B C A B A B C KMP算法的不同就在于箭头处出现失配的做法...Å B C A B A B C 快来找不同: 朴素算法的游标发生倒退,而KMP算法没有 重新对比的位置很奇特,为什么不是从头开始呢 我们先观察ABABC...比如 阮一峰的网络日志- 字符串匹配的KMP算法中,next[k]的计算包含当前k对应字符,即ABABC的next[3]的值的是ABAB的计算结果。

    35020

    实现 strStr()----KMP算法,朴素模式匹配算法----超万字长文详解

    算法—这里借鉴宫水三叶大佬的讲解 具体详情可以看原文 KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」。...为什么相比于朴素解法更快: 因为 KMP 利用已匹配部分中相同的「前缀」和「后缀」来加速下一次的匹配。...很多介绍KMP的文章或者视频并没有把为什么要用前缀表?这个问题说清楚,而是直接默认使用前缀表。 如何计算前缀表 接下来就要说一说怎么计算前缀表。...前缀表与next数组 很多KMP算法的时间都是使用next数组来做回退操作,那么next数组与前缀表有什么关系呢?...我之前说过,这仅仅是KMP算法实现上的问题,如果就直接使用前缀表可以换一种回退方式,找j=next[j-1] 来进行回退。要就是j=next[x]这一步最为关键!

    64240
    领券