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

news2024/11/15 10:52:56

一、有限状态自动机

图中两个圆圈,也叫节点,用于表示状态,从图中可以看成,它有两个状态,分别叫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;
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tomcat与servlet

目录 一、Http服务器 二、tomcat 1、概念 2、tomcat解压缩文件 &#xff08;1&#xff09;bin文件夹 &#xff08;2&#xff09;conf文件夹 &#xff08;3&#xff09;logs &#xff08;4&#xff09;webapps 3、借助tomcat服务器访问网页 三、servlet 1、概念 2、s…

阿里云有哪些优势?为什么选择阿里云?

为什么选择阿里云&#xff1f;阿里云服务器有哪些优势&#xff1f;阿里云全球第三&#xff0c;国内第一云&#xff0c;阿里云服务器网aliyunfuwuqi.com分享云服务器ECS在丰富ECS实例架构、弹性灵活、稳定可靠、便捷易用、安全保障和成本优化多方面优势&#xff1a; 阿里云服务…

【Linux】磁盘结构 | 文件系统 | 软硬链接

文件的状态有被打开和没有被打开&#xff0c;之前谈到一个文件被进行读写&#xff0c;就要打开加载到内存中&#xff0c;通过对应的系统调用&#xff0c;fd文件描述符的管理&#xff0c;write和read等函数的增删查改。并且借助缓冲区对文件属性和内容的修改。 大部分文件是没有…

高级架构师是如何设计一个系统的?

架构师如何设计系统&#xff1f; 系统拆分 通过DDD领域模型&#xff0c;对服务进行拆分&#xff0c;将一个系统拆分为多个子系统&#xff0c;做成SpringCloud的微服务。微服务设计时要尽可能做到少扇出&#xff0c;多扇入&#xff0c;根据服务器的承载&#xff0c;进行客户端负…

HFSS实战(一)——仿真PCB微带线的损耗

文章目录 一、ODB文件的导出二、PCB文件导入2.1 pcb文件导入2.2层叠设置 三、模型的裁剪四、模型的简化五、端口设置六、将3D LAYOUT模型导出成HFSS模型七、HFSS仿真结束 主要学习目标&#xff1a;利用HFSS3D layout 完成微带线的电磁仿真 利用一个简单的仿真&#xff0c;完成…

项目实战————苍穹外卖(DAY11)

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#x…

2023.1.19 关于 Redis 事务详解

目录 Redis 事务对比 MySQL 事务 MySQL 事务 Redis 事务 Redis 事务原子性解释 Redis 事务详解 执行流程 典型使用场景 Redis 事务命令 WATCH 的使用 WATCH 实现原理 总结 阅读下文之前建议点击下方链接了解 MySQL 事务详解 MySQL 事务详解 Redis 事务对比 MySQL 事…

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在将一个复杂对象的创建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示形式。 主要角色&#xff1a; 产品&#xff08;Product&#xff09;&#xff1a;表示正在构建…

小程序系列--9.生命周期

1. 什么是生命周期&#xff1f; 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 6. 页面的生命周期函数

SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】

目录 1.流控规则 2. 熔断规则 3.热点规则 1.流控规则 1.资源名&#xff1a;唯一名称&#xff0c;默认请求路径 2.针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源) 3.阈值类型/单机阈值&#xff1a; QPS&#xff08;每秒钟的请求数量&…

pytorch学习(一)线性模型

文章目录 线性模型pytorch使用sklearn训练 pytorch是一个基础的python的科学计算库&#xff0c;它有以下特点&#xff1a; 类似于numpy&#xff0c;但是它可以使用GPU可以用它来定义深度学习模型&#xff0c;可以灵活的进行深度学习模型的训练和使用 线性模型 线性模型的基本形…

Studio One2024免费版下载及入门教程分享

众所周知&#xff0c;Studio One是一个专业的音频编辑软件&#xff0c;近几年随着音视频剪辑越来越火&#xff0c;Studio One也逐渐被人们所熟知。最近&#xff0c;就有许多小伙伴私信我&#xff0c;寻求Studio One的入门教程。 这不&#xff0c;今天小编就给大家带来了音频剪…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电&#xff0c;基带电源也叫pmu。 首先时序图说电池提供供电&#xff0c;电池是J6接口&#xff0c;视频习惯把接口称之为座子。查U2_RF芯片&#xff0c;发现供电信号为PP_BATT_VCC_CONN&#xff0c;但是没查到跟电池座子有关系&#xff0c;电池座子写的是…

Flask框架小程序后端分离开发学习笔记《1》网络知识

Flask框架小程序后端分离开发学习笔记《1》网络知识 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 一、网址组成介绍 协议&#xff1a;http&#xff0c;https (https是加密的http)主机&#xff1a;g.cn zhihu.com之类的网址…

Python使用pyechart分析疫情确诊人数图(2024)

import json from pyecharts.charts import Map from pyecharts import options as opts# 首先打开文件获取数据 f open("/Desktop/python/Project/数据可视化/疫情.txt", "r", encoding"UTF-8") data f.read()# 字符串转化成json数据 data_js…

rust使用protobuf

前言 c,java,go 等直接是用 &#xff0c;具体就不说了&#xff0c;这章主要讲述rust 使用protobuf 这章主要讲述2种 1 > protoc protoc-gen-rust plugin 2> protoc prost-build 1&#xff1a;环境 win10 rustrover64 25-2 下载地址 https://github.com/protocolbu…

CHS_01.2.2.1+调度的概念、层次

CHS_01.2.2.1调度的概念、层次 调度的概念、层次知识总览调度的基本概念调度的三个层次——高级调度![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6957fdec179841f69a0508914145da36.png)调度的三个层次——低级调度调度的三个层次——中级调度补充知识&#xff…

unity-声音与声效OLD

声音与声效 基本概念audio clipaudio listeneraudio source 基本操作如何创建音频源&#xff08;背景音乐&#xff09;如何在测试的时候关闭声音 常用代码一般流程如何在一个物体上播放多个音效如何在代码中延时播放多个声音如何在代码中停止音频的播放如何判断当前是否在播放音…

Web3解密:区块链技术如何颠覆传统互联网

随着区块链技术的崛起&#xff0c;Web3正逐渐成为新一代互联网的代名词。它不再依赖中心化的权威机构&#xff0c;而是通过去中心化、透明、安全的特性&#xff0c;为用户带来更为开放和公正的互联网体验。本文将深入解密Web3&#xff0c;揭示区块链技术如何颠覆传统互联网的基…

Linux搭建dns主从服务器

一、实验要求 配置Dns主从服务器&#xff0c;能够实现正常的正反向解析 二、知识点 1、DNS简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。…