首页 > 编程语言 >考研数据结构-串(串的模式匹配算法)

考研数据结构-串(串的模式匹配算法)

时间:2024-10-19 18:21:58浏览次数:3  
标签:主串 匹配 模式 next 算法 数据结构 模式匹配 考研

         串的基本操作可以参照考研数据结构-串(串的基本操作),除去这些基本操作外,还有一个重要的操作就是串的模式匹配算法。模式匹配算法就是,对于一个串中某个子串的定位操作,这里会讲两种模式匹配算法:简单模式匹配算法和KMP算法。

一、简单模式匹配算法

     简单模式匹配算法的思路  

        简单模式匹配算法的思路就是:从主串的第一个位置起和模式串的第一个字符开始比较,如果相等则继续往后逐一比较。如果不相等,则从主串的第二个字符开始,重复上述的操作,直到在主串中找到与模式串相等的子串。如果成功则返回模式串在主串中的位置,否则可以返回NULL、FALSE或区别于主串所有位置的标记。

int Simple_index(Str2 str,Str2 substr)
{
    int i=1,j=1,k=i; //串的下标从1位置开始存储,so 值为1

    while (i <= str.length && j<substr.length)
    {
        /* code */
        if (str.ch[i] == substr.ch[j])
        {
            /* code */
            ++i;
            ++j;
        }else{
            j=1;
            i=++k; //匹配失败,i从主串的下一个位置开始,k中记录了上一次的起始位置
        }
        
    }
    
    if (i > substr.length)
    {
        /* code */
        return k;
    }else{
        return 0;
    }
    
}

二、KMP算法

        由简单模式算法可以看出,在主串中每当碰到一个与模式串中字符不匹配的位置,简单模式匹配都会从主串中的第i-j+2个位置开始重新匹配,这样的过程十分繁琐,所以需要引入一个更加高效的算法来寻找主串中与模式串相匹配的子串位置。

KMP算法的思路

        KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串(也称文本串)的匹配次数,以达到快速匹配的目的。具体实现是通过一个next()函数(或称为失配函数、部分匹配表),该函数包含了模式串的局部匹配信息。

        首先需要对模式串进行预处理,计算模式串的next数组。next数组记录了模式串中每个位置之前的子串的最长相等的前缀和后缀的长度(特殊地,next[1]一般设为0,表示模式串的起始位置没有前缀和后缀)。这个预处理过程的时间复杂度为O(m),其中m是模式串的长度。

        其次进行匹配,使用next数组进行模式匹配。设主串的长度为n,模式串的长度为m。在匹配过程中,当发现不匹配时,不是像暴力匹配那样将主串的指针回溯,而是利用next数组将模式串的指针移动到下一个可能匹配的位置,继续匹配。这个过程的时间复杂度为O(n)。

void getnext(Str2 substr,int next[])
{
    int i=1,j=0; // 串从数组下标1位置开始存储 
    next[1] = 0;
    
    while (i<substr.length)
    {
        /* code */
        if (j==0 || substr.ch[i]==substr.ch[j])
        {
            /* code */
            ++i;
            ++j;
            next[i] = j;
        }else{
            j = next[j];
        }
    }
    
}

得到next数组后,将简单匹配算法稍微修改就可以得到KMP算法

void KMP(Str2 str,Str2 substr,int next[])
{
    int i=1,j=1; //串从下标1开始存储,初始值为1
    
    while (i<=str.length && j<=substr.length)
    {
        /* code */
        if (j==0 || str.ch[i] == substr.ch[j])
        {
            /* code */
            ++i;
            ++j;
        }else{
            j = next[j];
        }
        
        if (j>substr.length)
        {
            /* code */
            return i-substr.length;
        }else{
            return 0;
        }
        
    }
    
}

标签:主串,匹配,模式,next,算法,数据结构,模式匹配,考研
From: https://blog.csdn.net/weixin_61852944/article/details/143030092

相关文章

  • 【数据结构与算法】之二分查找
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来工作,从而将搜索范围缩小到一半,也称折半查找,是一种非常高效的工作于有序数组的查找算法。本文主要介绍二分查找及其几个变种,包括基础版、改变版、平衡版和Java版,以及Leftmost......
  • 「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)
    目录概述成员变量创建销毁根节点访问路径压缩启发式合并复杂度Code概述并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。这是一个什么数据结构呢?一般来讲,并查集是由一系列集合组成的集合群。其中,每个集合都有一个根节点,它的......
  • 数据结构与算法之线性表的基本操作
    数据结构之线性表的基本操作初始化,插入,获取#include<stdio.h>#include<stdlib.h>#include<malloc.h>#defineOK1#defineOVERFLOW-1#defineLIST_INIT_SIZE100#defineLISTINCREMENT10typedefintElemType;typedefstruct{ ElemType*elem; intlength; i......
  • 【高阶数据结构】揭开红黑树‘恶魔’的面具:深度解析底层逻辑
    高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!二叉搜索树AVL树大家好,我是店小二,欢迎来到本篇内容!今天我们将一起探索红黑树的工作原理及部分功能实现。红黑树的概念相对抽象,但只要我们一步步深入,定能慢慢揭开它的神秘面纱......
  • 高清图解28个高并发之数据结构/数据结构场景匹配技巧分析(高并发精通篇三)
    Java中的Map家族包括基于哈希表的HashMap,维护插入顺序的LinkedHashMap,基于红黑树的TreeMap,线程安全的Hashtable和ConcurrentHashMap,以及基于身份比较的IdentityHashMap和基于弱引用的WeakHashMap。Queue家族则涵盖了Vector、Stack、Properties以及多种List和Deque实现,适用......
  • 02.数据结构介绍&顺序表、链表简述+对比
    目录一、什么是数据结构二、线性表三、顺序表四、链表五、顺序表和链表的区别一、什么是数据结构          数据结构是由“数据”和“结构”两个词组合而来。    数据:常见的数值1、2、3......,网页里的文字图片信息等都是数据。    ......
  • 【数据结构】分治算法经典: 快速排序详解
    快速排序(Quicksort)是一种高效的排序算法,最早由TonyHoare在1960年提出。它采用了分治(DivideandConquer)策略,平均时间复杂度为O(nlog......
  • JDK 21更新:switch语句的类型模式匹配与守卫模式
    Java语言自诞生以来,一直在不断演进,以满足开发者日益复杂的需求。switch语句作为一种控制流结构,在Java中有着广泛的应用。随着JDK21的发布,switch语句和表达式得到了显著增强,使其在处理复杂条件和类型检查方面更加灵活和强大。本文将详细探讨JDK21中switch语句和表达式的更......
  • 数据结构与算法 课程随记
    因为有时候需要在不同设备编辑同一份文档,本地不太方便了,先在放着博客园比较省事吧。但是博客园是不是快要四了啊,没事再整一个个人博客吧。内容非常杂,因为不想去上课所以还是有点东西不会,就记录一下查不会东西的时候学会的东西。没什么参考价值。Classhttps://www.runoob.com/c......
  • 数据结构(JAVA)包装类&泛型
    文章目录包装类基本数据类型和对应的包装类装箱和拆箱面试题泛型什么是泛型泛型的语法泛型类的使用泛型的使用裸类型(RawType)(仅需了解)擦除机制泛型的上界泛型方法包装类基本数据类型和对应的包装类注意,除了int基本数据类型的包装类是Integer和char基本数据类......