`

有限自动机匹配

 
阅读更多
using namespace std;

/**
*   变量声明和定义
*   text表示文本,pattern表示要匹配的模式,a是自动机(用二维数组表示)
*/
string text = "aeongzngngnng";
string pattern = "nng";

const string::size_type m = pattern.size();

int **a;

 

//动态分配内存,并将元素初始化为0
void init(){    
    a = new int* [m+1];
    for(size_t i=0;i!=m+1;i++)
    {
        a[i] = new int[text.size()]();
    }
}

 

 

//判断是否为后缀,根据定理σ(xa) = σ(Pqa).只需判断Pk是否是Pqa的后缀
bool is_suffix(int k,int q,char a)
{
    if(pattern[k-1]!=a)
    {
        return false;
    }
    for(int i=k-2,j=q-1;i>=0&&j>=0;--i,--j)
    {
        if(pattern[i]!=pattern[j])
            return false;
    }
    return true;
}
 

 

 

//填充自动机数组
void compute_transition_function()
{


    for(string::size_type p=0;p<=m;++p)
    {
        for(string::size_type t=0;t!=text.size();++t)
        {
	   //k取值根据σ(xa)  σ(x) + 1.
            int k = min(m+1,p+2);
            do
            {
                --k;

            }while(k>0&&!is_suffix(k,p,text[t]));

            a[p][t] = k;
        }
    }
  for(string::size_type p=0;p<=m;++p)
    {
        for(string::size_type t=0;t!=text.size();++t)
        {

            cout<<a[p][t]<<flush;
        }
        cout<<endl;
    }
}
 

 

 

//匹配模式
void finit_automic_matcher()
{
    string::size_type q = 0;


    for(string::size_type t=0;t!=text.size();t++)
    {
        q = a[q][t];
        if(q==m)
        {
            cout<<t-m+2<<endl;
        }
    }
}

 

 

 

//删除数组释放内存
void deleteArr()
{

    for(size_t i=0;i<=m;i++)
    {
        delete []a[i];
    }
    delete []a;
}

 

 

 

//主函数
int main()

{
    init();
    compute_transition_function();
    finit_automic_matcher();
    deleteArr();

    return 0;
}
 

 

分享到:
评论

相关推荐

    使用有限自动机做字符串匹配

    使用有限自动机做字符串匹配 automata string match

    有限自动机 VC++ MFC

    在计算机科学中,有限自动机主要用于处理形式语言,特别是文本解析、编译器设计和模式匹配等领域。在这个场景中,我们讨论的是如何使用VC++编程环境,结合MFC(Microsoft Foundation Classes)库来实现一个有限...

    电子科技大学有限自动机历年考题

    8. **应用**:了解有限自动机在编译原理、文本处理、模式匹配、网络协议解析等领域中的应用。 历年考题的复习应重点放在对这些概念的深入理解和应用上。通过解决过去的试题,学生可以检查自己对有限自动机的理解...

    有限自动机试题

    9. **自动机的扩展应用**:除了理论研究,有限自动机在编译器设计、文本模式匹配、网络协议分析等领域有广泛的应用。 通过这份“有限自动机试题”,学习者可以深入理解和掌握这些概念,并通过实践提升技能。对于12...

    正则表达式生成有限自动机

    有限自动机通常分为确定性有限自动机(Deterministic Finite Automaton, DFA)和非确定性有限自动机(Non-deterministic Finite Automaton, NFA)。DFA在每个状态下只有一个转移,而NFA则可能有多个。尽管NFA看似更...

    有限自动机的多模式匹配算法

    在预处理阶段,AC自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。 在搜索查找阶段,则通过这三个函数的交叉使用扫描文本,定位出关键字在文本中的所有...

    论文研究-基于树型有限自动机的DES规则匹配算法研究 .pdf

    在匹配算法方面,除了传统的顺序匹配法和索引匹配法之外,基于树型有限自动机的方法为提高规则匹配效率提供了新思路。 总之,该研究提出了一种创新的规则匹配算法,适用于复杂的离散事件系统,该算法通过构建树型...

    有限自动机课件

    有限自动机(Finite Automaton,简称FA)是计算理论中的基础概念,主要研究在有限状态下的计算模型。这个课件适合计算机科学与技术专业的研究生学习,涵盖了这一领域的核心知识点。 有限自动机通常分为几种类型,最...

    基于有限自动机方法的简单词法分析程序的设计与实现

    有限自动机(Finite State Automaton, FSA)是一种状态机模型,广泛用于处理规律性或模式匹配问题,包括词法分析。在词法分析中,有限自动机可以高效地识别源代码中的关键字、标识符、数字以及其他语言元素。有限...

    有限自动机的描述及应用

    有限自动机通常由一组有限数量的内部状态、一个输入字母表、一个状态转换规则以及一个初始状态和一组终止状态构成。 基本概念: 1. **状态**:自动机在不同时刻的运行状况,可以用一个标识来区分。例如,在电话呼叫...

    不确定有限状态自动机的确定化

    ### 不确定有限状态自动机的确定化及其原理 #### 实验背景及目的 在理论计算机科学领域中,有限状态自动机是一种重要的模型,用于描述计算系统的行为和特性。按照是否允许多重选择路径,有限状态自动机可分为确定...

    根据五元组构造有限自动机.pdf

    有限自动机的五元组构造 作为一名IT行业大师,我将从给定的文件中生成相关知识点,详细解释有限自动机的五元组构造。 确定有限自动机(DFA)是一种特殊类型的有限自动机,它可以识别正则语言。确定有限自动机的...

    有限状态自动机,JAVA实现

    有限状态自动机(Finite State Automaton,简称FSA)是一种计算模型,用于处理具有有限数量状态的系统。在计算机科学中,它常被用来解决模式匹配、正则表达式识别等问题。本篇将深入探讨如何使用Java语言实现有限...

    根据表达式构造有限自动机-1.pdf

    有限自动机是一种数学模型,用于描述字符串的匹配和识别过程。 在有限自动机中,我们可以根据正则表达式来构造自动机。正则表达式是一种用于描述字符串模式的表达式,它由基本元素和操作符组成。基本元素包括字母、...

    修改1 有限自动机1

    通过理解这些基本概念,我们可以设计和分析有限自动机,以解决诸如字符串匹配、编译器前端词法分析等问题。在计算机科学中,有限自动机是一种基础且强大的工具,广泛应用于文本处理、编译原理、网络协议解析等领域。

    Python-使用确定性有限自动机的低级正则表达式库

    然而,"regex-automata-master"这个压缩包可能包含了一个更底层、更高效的正则表达式库,该库利用了确定性有限自动机(Deterministic Finite Automaton, DFA)的概念来处理正则表达式匹配。DFA相对于非确定性有限...

    编译原理实验报告(词法语法分析 算符优先分析 有限自动机 LL(1)文法分析法等)

    在编译原理中,实验报告通常涉及多个关键概念和技术,包括词法分析、语法分析、算符优先分析、确定的有限自动机以及LL(1)文法分析法。以下是对这些概念的详细解释: 1. **词法分析**:这是编译器的第一步,它将源...

    编译原理之有限自动机解析学习教案.pptx

    《编译原理之有限自动机解析学习教案》的讲解涵盖了编译原理中的核心概念——有限自动机及其在词法分析中的应用。有限自动机是一种重要的计算模型,它在编译器设计中扮演着识别和处理输入序列的角色。下面将详细阐述...

Global site tag (gtag.js) - Google Analytics