`
javatgo
  • 浏览: 1126347 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

字符串匹配算法(四)可以滑动多远

阅读更多
记得在穷举法中,每一趟比较后,无论成与不成,都将模式向右滑动一个位置,然后继续比较。有没有办法能利用之前的比较结果,使得模式滑动的更远一点呢?

在介绍经典的KMP算法前,我先介绍几个简单的滑动类算法。

Not So Naive
同名字一样,这个算法的确有点幼稚,它根据模式的前两个字符是否相同来滑动比穷举法稍长一点的距离:如果前两个字符相同,那么文本中与第二个字符不同则必然也与第一个不同;如果前两个字符不同,则与第二个相同的文本字符必然与第一个不同。

那么这两种情况下不用比较都可以断定,文本字符与模式的第一个字符肯定不相同,于是能比穷举法多滑动1个位置。

代码见下:
  1. voidNSN(char*x,intm,char*y,intn){
  2. intj,k,ell;
  3. /*Preprocessing*/
  4. if(x[0]==x[1]){
  5. k=2;
  6. ell=1;
  7. }
  8. else{
  9. k=1;
  10. ell=2;
  11. }
  12. /*Searching*/
  13. j=0;
  14. while(j<=n-m)
  15. if(x[1]!=y[j+1])
  16. j+=k;
  17. else{
  18. if(memcmp(x+2,y+j+2,m-2)==0&
  19. x[0]==y[j])
  20. OUTPUT(j);
  21. j+=ell;
  22. }
  23. }
这个算法仅需要常数时间和空间的预处理,比较过程中,先比较模式第二个字符,然后比较其余位置,为的就在某些情况下省掉第一个字符的比较,达到滑动的目的。不过复杂度依然是O(mn)的,比起穷举法或者有轻微改善吧。

想法的确够幼稚,仅仅只考虑了两个模式字符,滑动的步子也太小,能否考虑的更多一点呢?下面请看Quick Search算法。

Quick Search
见到这个名字,不禁让人想起快速排序了,快速排序在最坏情况下是n平方的复杂度,而通常情况下速度超级快,Quick Search莫非也是这样的?没错,就是这样,这个算法在模式长度短而字母表大时,有着优异的表现,尽管它的搜索时间复杂度是O(mn)。

算法的思想是这样,如果文本中某个字符根本就没在模式中出现过,那么就不需要再去和模式中的任何一个比较;如果该字符出现过,那么为了不漏掉可能的匹配,只好与最晚出现过的位置对齐进行比较了。

代码如下:
  1. voidpreQsBc(char*x,intm,intqsBc[]){
  2. inti;
  3. for(i=0;i<ASIZE;++i)
  4. qsBc[i]=m+1;
  5. for(i=0;i<m;++i)
  6. qsBc[x[i]]=m-i;
  7. }
  8. voidQS(char*x,intm,char*y,intn){
  9. intj,qsBc[ASIZE];
  10. /*Preprocessing*/
  11. preQsBc(x,m,qsBc);
  12. /*Searching*/
  13. j=0;
  14. while(j<=n-m){
  15. border-top-style: none; border-right-style: none; border-bottom-style: none; border-color: initial; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0
    分享到:
    评论

相关推荐

    KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法

    KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法。它的主要思想是在发生不匹配时,能知道部分已经匹配的字符序列的后缀和模式串的前缀存在重复,因此可以利用这些信息避免...

    c语言数据结构字符串模式匹配算法.zip

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...

    滑动窗口算法.zip

    字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个子串(模式)的出现位置。常见的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法等。 这些是计算机科学中常见的算法类型,每种算法都有...

    34丨字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?1

    我们假设主串是 a,模式串是在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后多滑动几位,跳过那些肯定不会匹配的情况

    c/c++程序之_KMP字符串模式匹配详解

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。先来看一个简单匹配算法的函数:此算法的思想是...

    计算机大赛-团体程序设计天梯赛算法范围.docx

    5. 字符串匹配算法:常见的字符串匹配算法包括暴力匹配、 KMP 算 法、 BM 算法、 Sunday 算法等。 6.贪心算法:贪心算法是求解最优问题的有效方法之一,需要掌握贪 心的基本思想和具体的实现思路。 7.数学算法:...

    kmp(Knuth–Morris–Pratt Algorithm)算法讲解

    KMP(Knuth-Morris-Pratt)算法是一种改进的字符串匹配算法,用于在一个文本字符串(T)中查找一个词(W)的出现位置。KMP算法的核心在于当字符串匹配发生不一致时,能知道已经部分匹配这个有效信息,利用这个信息...

    多媒体技术_LZ77算法

    LZ77编码的简单C实现,包含字符串匹配算法。

    数据结构课程设计-kmp算法

    对于一般的模式匹配算法:分别利用两个指针i和j指示主串S和T中的当前正待比较的字符位置。算法的基本思想是:从主串的S的第POS个字符开始起和模式的第一个字符比较之,如相等,则继续逐个比较后续字符;否则从主串的...

    数据结构课程设计实验报告-KMP算法的实现

    对于一般的模式匹配算法:分别利用两个指针i和j指示主串S和T中的当前正待比较的字符位置。算法的基本思想是:从主串的S的第POS个字符开始起和模式的第一个字符比较之,如相等,则继续逐个比较后续字符;否则从主串的...

    滑动窗口的概要介绍与分析

    滑动窗口(Sliding Window)是一种在计算机科学中广泛应用的算法技术,尤其在处理数据流、字符串匹配、数组运算等场景中发挥着重要作用。滑动窗口技术的基本思想是通过维护一个固定大小的窗口,在数据流或数据集合上...

    程序员实用算法——源码

     4.6 近似字符串匹配技术  4.7 语音比较:Soundex算法  4.8 Metaphone:现代的Soundex  4.9 选择技术  4.10 资源和参考资料  4.10.1 通用参考资料  4.10.2 Boyer Moore  4.10.3 多字符串查找  ...

    kmp.zip_MáS_滑动模式

    问题:串的模式匹配算法---KMP 方法:从主串S中寻找模式串T出现的位置。 基本思想:从主串S的第1个字符起和模式串T的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串的下一个字符再重新和模式的字符...

    模式匹配的一种改进方法kmp

    这种改进算法是D.E.Knuth 与V.R.Pratt 和J.H.Morris 同时发现的,因此人们称它为 克努特-莫里斯-普拉特算法...指针,而是利用已经得到的‘部分匹配’的结果将模式向右‘滑动’尽可能远的一段距离后, 继续进行比较。

    数据结构拓展-KMP算法

    在朴素的模式匹配算法中,当目标串和模式串的字符比较不相等时,进行下一次比较的 是目标串本趟开始处的下一个字符,而模式串则回到起始字符,这种回溯显然是费时的。如 果仔细观察,可以发现这样的回溯常常不是必须...

    leetcode2-DataStructureAndAlgorithm:数据结构与算法

    经典的字符串匹配算法 极小极大算法 使用极小极大算法和 alpha-beta 修剪的井字游戏 3. 编程 名称 来源 评论 大批 数组算法 回溯 回溯算法 男朋友 广度优先搜索 二分查找 二分查找算法 数据结构 栈,队列算法 文件...

    一种改进的KMP高效模式匹配算法 (2006年)

    针对KMP算法存在着主串与模式串中多个相同字符重复比较的缺陷,在KMP算法的基础上,给出了一种新的模式匹配算法,该算法不像KMP算法那样向左滑动模式串的指针,而是每次比较字符不匹配时,根据模式串当前字符的特征...

    vscode安装leetcode-beat-algorithm:学习算法,打败算法!

    字符串匹配算法 项目环境 以下是具体的环境: 使用Python编写算法 使用VsCode作为编辑器,尽可能不要安装自动填充代码插件,做到白板编程。 用到的插件: Leetcode Python Code Runner 刷题不能盲目,要找经典题型,...

    HLZ:一种采用混合字典的自适应无损编码算法 (2002年)

    在用HLZ算法进行正文编码时,当发现已经到达字典中提供的词汇终点时,并不立刻进行编码,而是与滑动窗口相比较,若当前字符串在滑动窗口中的匹配长度尚不及它在字典中的匹配串的长度,则采用LZ78输出,否则用LZ77编码输出...

    Java零钱兑换问题leetcode-algorithms:数据结构与算法

    字符串算法 O(n * m) O(n),极端情况下会退化为O(n * m) 时间复杂度不超过O(3n) O(n + m) 构建Trie树时间复杂度为O(n),查找时间复杂度为O(k),k是查找串长度 匹配过程时间复杂度O(n) 图算法 算法问题 BFS算法。 BFS...

Global site tag (gtag.js) - Google Analytics