算法——字符串匹配算法自己有限的驾驶机器

简介:

前言

    上篇文章介绍《Rabin-Karp字符串匹配算法》。这里介绍有限自己主动机(Finite Automata)字符串匹配算法,有限自己主动机(Finite Automata)字符串匹配算法最基本的是计算出转移函数。

即给定一个当前状态k和一个字符x。计算下一个状态;计算方法为:找出模式pat的最长前缀prefix。同一时候也是pat[0...k-1]x(注意:字符串下标是从0開始)的后缀,则prefix的长度即为下一个状态。匹配的过程是比較输入文本子串和模式串的状态值,若相等则存在。若不想等则不存在。

有关理论知识參考《算法导论》,这里不正确理论知识进行解说。

有限自己主动机字符串匹配算法

    若模式串pat的长度为m。则状态值为0-m,即有m+1个状态,初始状态为0当中numbers=NO_OF_CHARS为输入字符表的个数,从下面的源代码能够知道,计算转移函数(即预处理)的时间复杂度为,匹配时间复杂度为

该算法能够依据后面介绍的KMP算法进行改进,对求解转移函数的过程进行改进能够得到比較好的时间复杂度

    下面是模式串为P=abababaca的自己主动机运行过程


源代码实现

#include<iostream>
#include<string>

using namespace std;

const int NO_OF_CHARS = 256;//the numbers of input alphabet

int getNextState(const string &pat, int M, int state, int x)
{
    // If the character c is same as next character in pattern,
    // then simply increment state
    if (state < M && x == pat[state])
        return state+1;
 
    int ns, i;  // ns stores the result which is next state
 
    // ns finally contains the longest prefix which is also suffix
    // in "pat[0..state-1]c"
 
    // Start from the largest possible value and stop when you find
    // a prefix which is also suffix
    for (ns = state; ns > 0; ns--)
    {
        if(pat[ns-1] == x)
        {
            for(i = 0; i < ns-1; i++)
            {
                if (pat[i] != pat[state-ns+1+i])
                    break;
            }
            if (i == ns-1)
                return ns;
        }
    }
 
    return 0;
}
 
/* This function builds the TF table which represents Finite Automata for a
   given pattern  */
void compute_Transition_Function(const string &pat, int M, int TF[][NO_OF_CHARS])
{
    int state, x;
    for (state = 0; state <= M; ++state)
        for (x = 0; x < NO_OF_CHARS; ++x)//for each charater c in the inout alphabet table
           TF[state][x] = getNextState(pat, M,  state, x);
}
 
/* Prints all occurrences of pat in txt */
void Finite_Automata_search(const string &pat, const string &txt)
{
    int M = pat.length();
    int N = txt.length();
	
    int TF_len = M+1;
    //this is supported by C++11
	int TF[TF_len][NO_OF_CHARS];//the state of transform table, stores the states.
 
    compute_Transition_Function(pat, M, TF);//compute the state of Transition Function 
 
    // Process txt over FA.
    int state=0;//inite the state
    for (int i = 0; i < N; i++)
    {
       state = TF[state][txt[i]];
       if (state == M)
			cout<<"patterb found at index is:"<<i-M+1<<endl;
       
    }
}
 
int main()
{
   string txt = "Finite Automata Algorithm: Finite Automata";
   string pat = "Auto";
   Finite_Automata_search(pat, txt);
   system("pause");
   return 0;
}

參考资料:

《算法导论》

http://www.geeksforgeeks.org/searching-for-patterns-set-5-finite-automata/

http://my.oschina.net/amince/blog/182210






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4914074.html,如需转载请自行联系原作者


相关文章
|
7月前
|
存储 算法 调度
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
202 24
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
199 0
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
295 1
两个字符串匹配出最长公共子序列算法
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
865 1
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
361 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
存储 算法 调度
基于和声搜索算法(Harmony Search,HS)的机器设备工作最优调度方案求解matlab仿真
通过和声搜索算法(HS)实现多机器并行工作调度,以最小化任务完成时间。在MATLAB2022a环境下,不仅输出了工作调度甘特图,还展示了算法适应度值的收敛曲线。HS算法模拟音乐家即兴创作过程,随机生成初始解(和声库),并通过选择、微调生成新解,不断迭代直至获得最优调度方案。参数包括和声库大小、记忆考虑率、音调微调率及带宽。编码策略将任务与设备分配映射为和声,目标是最小化完成时间,同时确保满足各种约束条件。
|
机器学习/深度学习 算法 BI
机器学习笔记(一) 感知机算法 之 原理篇
机器学习笔记(一) 感知机算法 之 原理篇
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
546 0

热门文章

最新文章