C#,字符串匹配(模式搜索)有限自动机(Finite Automata)算法的源代码

一、有限状态自动机

图中两个圆圈,也叫节点,用于表示状态,从图中可以看成,它有两个状态,分别叫0和1。从每个节点出发,都会有若干条边。当处于某个状态时,如果输入的字符跟该节点出发的某条边的内容一样,那么就会引起状态的转换。例如,如果当前状态处于0,输入是字符a,那么状态机就会从状态0进入状态1。如果当前状态是1,输入字符是b或a,那么,状态机就会从状态1进入状态0。如果当前所处的状态,没有出去的边可以应对输入的字符,那么状态机便会进入到错误状态。例如,如果当前处于状态0,输入字符是c,那么状态机就会出错,因为从状态0开始,没有哪条边对应的字符是c。

本代码的运行效果:

二、有限状态机用于字符串匹配(模式搜索)

假定要查找的字符串为P=”ABABCABAB”,被查找的文本为T=”ABABDABACDABABCABAB”。 一次读入T的一个字符,用S表示当前读入的T的字符,一开始读入一个字符,于是S=a。然后看看,从P开始,连续几个字符所构成的字符串可以成为S的后缀,由于当前S只有一个字符A,于是从P开始,连续1个字符所形成的字符串”A”,可以作为S的后缀。把这个字符串的长度记为k,于是此时k 等于1。继续从T中读入字符,于是S=”AB”, 此时,从P开始,连续两个字符所构成的字符串”AB”可以作为S的后缀,于是k = 2。如此反复。

利用有限状态机便可以构造这样的后缀序列。

源代码:

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class PatternSearch
    {
        /// <summary>
        /// 下一个状态
        /// </summary>
        /// <param name="patternArray"></param>
        /// <param name="M"></param>
        /// <param name="state"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        public static int NextState(char[] patternArray, int M, int state, int x)
        {
            if (state < M && (char)x == patternArray[state])
            {
                return state + 1;
            }

            for (int ns = state; ns > 0; ns--)
            {
                if (patternArray[ns - 1] == (char)x)
                {
                    int i;
                    for (i = 0; i < ns - 1; i++)
                    {
                        if (patternArray[i] != patternArray[state - ns + 1 + i])
                        {
                            break;
                        }
                    }
                    if (i == ns - 1)
                    {
                        return ns;
                    }
                }
            }

            return 0;
        }

        /// <summary>
        /// 计算TF表
        /// </summary>
        /// <param name="patternArray"></param>
        /// <param name="M"></param>
        /// <returns></returns>
        public static int[,] Compute_TF(char[] patternArray, int M)
        {
            int[,] TF = new int[M + 1, ALPHA_CODE_MAX];
            for (int state = 0; state <= M; ++state)
            {
                for (int x = 0; x < ALPHA_CODE_MAX; ++x)
                {
                    TF[state, x] = NextState(patternArray, M, state, x);
                }
            }
            return TF;
        }

        /// <summary>
        /// 字符串匹配算法(模式搜索)Finite Automata算法
        /// </summary>
        /// <param name="text"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static List<int> Finite_Automata_Search(string text, string pattern)
        {
            List<int> matchs = new List<int>();

            int M = pattern.Length;
            int N = text.Length;
            int[,] TF = Compute_TF(pattern.ToCharArray(), M);//, TF);
            int state = 0;
            for (int i = 0; i < N; i++)
            {
                state = TF[state, text[i]];
                if (state == M)
                {
                    matchs.Add((i - M + 1));
                }
            }

            return matchs;
        }
    }
}
 

-----------------------------------------------------------------------------

POWER BY TRUFFER.CN

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class PatternSearch
    {
        /// <summary>
        /// 下一个状态
        /// </summary>
        /// <param name="patternArray"></param>
        /// <param name="M"></param>
        /// <param name="state"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        public static int NextState(char[] patternArray, int M, int state, int x)
        {
            if (state < M && (char)x == patternArray[state])
            {
                return state + 1;
            }

            for (int ns = state; ns > 0; ns--)
            {
                if (patternArray[ns - 1] == (char)x)
                {
                    int i;
                    for (i = 0; i < ns - 1; i++)
                    {
                        if (patternArray[i] != patternArray[state - ns + 1 + i])
                        {
                            break;
                        }
                    }
                    if (i == ns - 1)
                    {
                        return ns;
                    }
                }
            }

            return 0;
        }

        /// <summary>
        /// 计算TF表
        /// </summary>
        /// <param name="patternArray"></param>
        /// <param name="M"></param>
        /// <returns></returns>
        public static int[,] Compute_TF(char[] patternArray, int M)
        {
            int[,] TF = new int[M + 1, ALPHA_CODE_MAX];
            for (int state = 0; state <= M; ++state)
            {
                for (int x = 0; x < ALPHA_CODE_MAX; ++x)
                {
                    TF[state, x] = NextState(patternArray, M, state, x);
                }
            }
            return TF;
        }

        /// <summary>
        /// 字符串匹配算法(模式搜索)Finite Automata算法
        /// </summary>
        /// <param name="text"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static List<int> Finite_Automata_Search(string text, string pattern)
        {
            List<int> matchs = new List<int>();

            int M = pattern.Length;
            int N = text.Length;
            int[,] TF = Compute_TF(pattern.ToCharArray(), M);//, TF);
            int state = 0;
            for (int i = 0; i < N; i++)
            {
                state = TF[state, text[i]];
                if (state == M)
                {
                    matchs.Add((i - M + 1));
                }
            }

            return matchs;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/335303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java中加载两个类全限定名相同的类?

我们知道在Java中类全限定名由两部分组成&#xff0c;包名和类名&#xff0c;当然网上也有说法是由三部分组成&#xff0c;包名、子包名以及类名&#xff0c;这里我把包相关的统称为包名。 比如说在某个Java项目中com.knight包下有一个类A&#xff0c;那么这个类A的类全限定名…

解决一个mysql的更新属性长度问题

需求背景&#xff1a; 线上有一个 platform属性&#xff0c;原有长度为 varchar(10)&#xff0c;但是突然需要填入一个11位长度的值&#xff1b;而偏偏这个属性在线上100张表中有50张都存在&#xff0c;并且名字各式各样&#xff0c;庆幸都包含 platform&#xff1b;例如 platf…

创建非模态的静态文本并更改它的位置

我是写在钩子里&#xff0c;动态显示静态文本的哦&#xff0c;效果我放在下面了&#xff0c;不知道怎么做动态图片&#xff0c;你们可以教我一下&#xff0c;哈哈。 //这个就是放在钩子里跟随鼠标动态显示坐标信息&#xff0c;或者提示信息 HWND statichandleNULL; HWND NXha…

php isset和array_key_exists区别

在PHP中&#xff0c;可以使用array_key_exists函数或者isset函数来判断一个字典&#xff08;关联数组&#xff09;中是否存在某个下标。 使用 array_key_exists 函数: $myArray array("key1" > "value1", "key2" > "value2",…

网络爬虫采集工具

在当今数字化的时代&#xff0c;获取海量数据对于企业、学术界和个人都至关重要。网络爬虫成为一种强大的工具&#xff0c;能够从互联网上抓取并提取所需的信息。本文将专心分享关于网络爬虫采集数据的全面指南&#xff0c;深入探讨其原理、应用场景以及使用过程中可能遇到的挑…

校园水电抄表系统

校园水电抄表系统是一种现代化的水电管理方式&#xff0c;它通过高科技手段实现对校园内水电使用情况的实时监测和数据化管理&#xff0c;从而提高水电资源的利用效率&#xff0c;降低管理成本&#xff0c;为构建绿色、环保、节约型校园奠定基础。 一、系统概述 校园水电抄表…

【富文本编辑器实战】03 Vuex 的配置编写

Vuex 的配置编写 目录 Vuex 的配置编写Vuex 是什么&#xff1f;什么是“状态管理模式”&#xff1f;什么情况下我应该使用 Vuex&#xff1f;安装 Vuex开始使用 VuexAction 文件Mutations-types 文件Mutation 文件Index Vuex 是什么&#xff1f; 这里我们来看看官方网站是如何介…

HugggingFace 推理 API、推理端点和推理空间相关模型部署和使用以及介绍

HugggingFace 推理 API、推理端点和推理空间相关模型部署和使用以及介绍。 Hugging Face是一家开源模型库公司。 2023年5月10日&#xff0c;Hugging Face宣布C轮1亿美元融资&#xff0c;由Lux Capital领投&#xff0c;红杉资本、Coatue、Betaworks、NBA球星Kevin Durant等跟投…

Java程序设计:选实验5 GUI初级应用

使用JLabel、JTextArea、JButton等控件实现句子的中译英demo&#xff0c;该demo包含四个文本框&#xff0c;在第一个文本框输入一句英文&#xff0c;在第二个和第三个文本框显示该句的英文翻译&#xff08;要求使用百度翻译API、有道翻译API或其他API中的两种&#xff1b;自行上…

深度学习记录--mini-batch gradient descent

batch vs mini-batch gradient descent batch&#xff1a;段&#xff0c;块 与传统的batch梯度下降不同&#xff0c;mini-batch gradient descent将数据分成多个子集&#xff0c;分别进行处理&#xff0c;在数据量非常巨大的情况下&#xff0c;这样处理可以及时进行梯度下降&…

Text:字体相关设置

效果如下&#xff1a; import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Text")Text {id: t1text: "你好&#xff0c;世界&#xff01;"color: "#29acc0" /*字体颜色*/font.pixelSize: 40 /*字体大小*/font.family: &quo…

在 Python 中检查一个数字是否是同构数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 同构数&#xff0c;又称为自守数或自同构数&#xff0c;是一类特殊的数字&#xff0c;它们具有一种有趣的性质&#xff1a;将其平方后的数字&#xff0c;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

以后要做GIS开发的话是学GIS专业还是学计算机专业好一些?

GIS开发其实严格来说分为前后端以及底层开发。不同的方向&#xff0c;代表了不同的开发语言。 所以大家首先要了解自己具体要做的岗位类型是什么&#xff0c;其次才是选择专业侧重点。 但是严格来说&#xff0c;选择某个专业&#xff0c;到就业方向这个过程&#xff0c;并不是…

(C++) list底层模拟实现

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 首先&#xff0c;list底层是一个带头双向循环链表&#xff0c;再一个&#xff0c;我们还要解决一个问题&#xff0c;list的迭代器&#xff0c;vector和string的迭代器可以直接&#xff0c;是因为他们的地址空间是连续的&…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的&#xff1f;二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中&#xff0c;异步JavaScript和XML&#xff08;AJAX&#xff09;已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

hadoop-common: CMake failed with error code 1

问题 在编译hadoop源码时遇到如下错误 hadoop-common: CMake failed with error code 1 看了这个错误表示一脸懵逼 排查 在mvn 的命令中增加 -X 和 -e mvn clean package -e -X -Pdist,native -DskipTests -Dmaven.javadoc.skip -Dopenssl.prefix/usr/local/bin/openssl 在…

3.C语言——函数

函数 1.什么是函数2.函数的分类1.库函数2.自定义函数 3.函数的参数1.实际参数&#xff08;实参&#xff09;2.形式参数&#xff08;形参&#xff09; 4.函数的声明1.同一个文件的函数声明2.多文件的函数声明 5.函数的调用6.函数的嵌套调用和链式访问1.嵌套调用2.链式访问 7.函数…

P1059 [NOIP2006 普及组] 明明的随机数————C++、Python

目录 [NOIP2006 普及组] 明明的随机数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 解题思路Code——CCode——Python运行结果 [NOIP2006 普及组] 明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0…

力扣 | 438. 找到字符串中所有字母异位词

滑动窗口解题 示例 在s里面控制一个p字符串长度的滑动窗口&#xff0c;统计该滑动窗口中的每种字符出现的次数 import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Problem_438_FindAnagrams {public List<Integer> findAnagram…

开放签开源工具版更新至1.1版本,进一步提升电子签名服务能力

本周开放签开源工具版增加了SDK与API能力&#xff0c;更新至1.1版本&#xff0c;使开放签电子签章工具能力进一步提升。 SDK将便于java用户直接使用CA证书颁发和签名能力。API接口采用HTTP&#xff08;S&#xff09;通讯&#xff0c;JSON报文格式&#xff0c;具有跨平台、跨语…