状态机和相关算法应用分析

简介

状态机(State Machine)在软件编程中是一个数学模型,可以用状态转移图表示,指的是:现态在满足某个条件时,进行动作(状态转移),从而转为另一个状态(次态

状态机的4个要素:现态、条件、动作、次态。“现态”和“条件”是因 ,“动作”和“次态”是果。

1)现态:指当前所处状态;

2)条件:又称“事件”。当条件被满足时,将会触发一个动作,或者执行一次状态的迁移。

3)动作:条件满足后执行的动作。条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,迁移到新状态。

4)次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就变成新的“现态”了。

KMP算法

在长度为N的字符串txt中,搜索长度为M的子串pat
KMP是字符串匹配算法,时间复杂度O(M+N),空间复杂度O(M)

暴力搜索,时间复杂度,O(MN),空间复杂度O(1)

状态分析

现态:当前匹配情况
条件:当前字符
动作:根据条件确定怎么转移
两种可能,
1:当前匹配字符成功,状态+1;
2:当前匹配字符失败,状态回退(核心点,通过回退到最长子前缀,避免从头匹配,提高效率)
次态:转移后的新状态,判断是否到达需要的状态,到达则算法终止

dp[j][c] = next【状态转移方程dp[现态][字符] =新状态】
0 <= j < M,代表当前的状态
0 <= c < 256,代表遇到的字符(ASCII 码)
0 <= next <= M,代表新状态

代码实现

package practice.dp;
/*** https://mp.weixin.qq.com/s/r9pbkMyFyMAvmkf4QnL-1g** KMP 算法最关键的步骤就是构造这个状态转移图。要确定状态转移的行为,* 得明确两个变量,一个是当前的匹配状态,另一个是遇到的字符;* 确定了这两个变量后,就可以知道这个情况下应该转移到哪个状态。*/
public class KMP {/*** dp[j][c] = next* 0 <= j < M,代表当前的状态* 0 <= c < 256,代表遇到的字符(ASCII 码)* 0 <= next <= M,代表下一个状态** dp[4]['A'] = 3 表示:* 当前是状态 4,如果遇到字符 A,* pat 应该转移到状态 3** dp[1]['B'] = 2 表示:* 当前是状态 1,如果遇到字符 B,* pat 应该转移到状态 2*/private int[][] dp;/*** 搜索字符串*/private String pat;public KMP(String pat) {this.pat = pat;int M = pat.length();//最长回退子串的状态,如果有公共前缀,不为0,如果没有则为0int X = 0;//dp[状态][字符] = 下个状态dp = new int[M][256];dp[0][pat.charAt(0)] = 1;//构建状态转移图【现态 在 遇到 字符 后,进行状态转移】for(int j = 1; j < M; j++) {//状态j遇到字符[^pat.charAt(j)]后,状态迁移【回退】for (int c = 0; c < 256; c++) {dp[j][c] = dp[X][c];}//状态j遇到字符[pat.charAt(j)]后,状态迁移【+1】dp[j][pat.charAt(j)] = j+1;//最长回退子串的状态X遇到pat.charAt(j),进行状态迁移【可能+1,可能继续回退】X = dp[X][pat.charAt(j)];}}public int search(String txt) {int M = pat.length();int N = txt.length();//当前匹配状态int j = 0;for (int i = 0; i < N; i++) {j = dp[j][txt.charAt(i)];//状态迁移到M,表示匹配成功if(j == M) return i - M + 1;}// 没到达终止态,匹配失败return -1;}public static void main(String[] args) {String pat = "ababc";String txt = "abababsababc";KMP kmp = new KMP(pat);//7System.out.println(kmp.search(txt));}}

股票买卖

一个方法团灭 LeetCode 股票买卖问题
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for …
dp[状态1][状态2][…] = 择优(选择1,选择2…)

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

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

相关文章

【c++】类和对象1

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成 …

编程江湖:Python探秘之旅-----Python 实用工具和库(七)

在一个普通的工作日&#xff0c;团队聚集在一起讨论如何提升开发效率。这时&#xff0c;林克斯加入了讨论&#xff0c;他是团队的技术专家&#xff0c;对 Python 的生态系统了如指掌。 林克斯&#xff1a;&#xff08;满怀热情地&#xff09;你们知道吗&#xff0c;Python 有一…

JavaScript高级程序设计读书记录(十二):函数

函数是ECMAScript中最有意思的部分之一&#xff0c;这主要是因为函数实际上是对象。每个函数都是Function 类型的实例&#xff0c;而 Function 也有属性和方法&#xff0c;跟其他引用类型一样。因为函数是对象&#xff0c;所以函数名就是 指向函数对象的指针&#xff0c;而且不…

[linux]编译一个ko文件并运行

一、需求 有一段代码需要在运行时加载注入内核中&#xff0c;当用户层需要访问时可以提供内核态环境去运行。 二、c代码构建 // #include <errno.h> // #include <string.h> // #include <stdio.h> // #include <fcntl.h> // #include <stdlib.h…

Windows安装Rust环境(详细教程)

一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio&#xff0c;但该工具占用空间大安装也较为麻烦&#xff0c;可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub&#xff1a;Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…

Formnext2024法兰克福3D打印增材制造展览会现正接受报名

Formnext2024法兰克福3D打印增材制造展览会现正接受报名 Formnext法兰克福国际精密成型及 3D 打印制造展览会将于2024年11月19日至22日在法兰克福举办。 Formnext法兰克福国际精密成型及 3D 打印制造展览会在2023年迎来了32,851名专业人士和管理人员(50%来自国际)&#xff0c…

Excel地址

解题思路&#xff1a; 根据题中歪歪和笨笨的话可以有两种解法。 1.输入的数为多大&#xff0c;则循环1多少次&#xff0c;当值为27时就要进行进位操作。这时要分情况讨论。 当集合中元素为一个时&#xff0c;如26&#xff0c;则需要变为1 1&#xff0c;集合元素个数加一。 当…

2023年全球软件质量效能大会(QECon上海站):核心内容与学习收获(附大会核心PPT下载)

会议聚焦于软件质量和效能的提升。在智能时代&#xff0c;随着数字化的深入人心&#xff0c;软件正在随着云计算、移动互联网、物联网等的发展而不断进化&#xff0c;软件对企业的发展愈加重要&#xff0c;大家对软件的质量要求也在从传统功能、性能、安全这些基础层面向着用户…

easyui datagrid无数据时显示无数据

这里写自定义目录标题 需求解决办法 需求 使用datagrid显示记录时&#xff0c;结果查询记录数为0&#xff0c;此时需要显示无数据。 示例代码 <table id"dg"></table>$(#dg).datagrid({url:datagrid_data.json,columns:[[{field:code,title:Code,widt…

【OCR】实战使用 - 如何提高识别文字的精准度?

实战使用 - 如何提高文字识别的精准度 我们在平常使用OCR的时候&#xff0c;经常会出现文字识别不精准的情况&#xff0c;我们改如何提高文字识别的精度呢&#xff1f; 以下是一些提高OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识…

(超详细)5-YOLOV5改进-添加A2Attention注意力机制

1、在yolov5/models下面新建一个A2Attention.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn import functional as Fclass DoubleAttention(nn.Module):def …

coco数据集格式转yolo数据格式

一、coco数据集是什么&#xff1f; COCO&#xff08;Common Objects in Context&#xff09;是一个广泛使用的目标检测和分割数据集&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一种流行的实时目标检测算法。 首先&#xff0c;导入了必要的库&#xff0c…

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图&#xff1a; 当前是写前两个记号&#xff0c;其余记号后面写&#xff1a;这些反复记号最主要的目的很简单&#xff0c;还是为了节约纸张&#xff0c…

蓝桥杯单片机组备赛——LED指示灯的基本控制

&#x1f388;教程介绍&#xff1a;博客依据b站小蜜蜂老师的教程进行编写&#xff0c;文中会对老师传授的知识进行总结并加入自己的一些理解。教程链接 文章目录 一、点灯介绍二、相关数字芯片介绍2.1 74HC138介绍2.2 74HC573介绍2.3 74HC02介绍 三、代码设计思路四、代码编写…

Spring MVC 异常处理器

异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处…

解决跨域问题的8种方案(最新最全)

什么是跨域: 浏览器对于javascript的同源策略的限制,例如http://a.cn下面的js不能调用http://b.cn中的js,对象或数据(因为http://a.cn和http://b.cn是不同域),所以跨域就出现了.同域&#xff1a;简单的解释就是域名相同,端口相同,协议相同 为什么需要跨域&#xff1f; 在最一…

关于java方法定义的回顾

关于java方法定义的回顾 我们在上一篇文章中&#xff0c;对java的面向对象有了一个初步的理解&#xff0c;因为类里面方法是必不可少的&#xff0c;我们本篇文章对方法进行一个回顾&#xff0c;以便加深一下对方法的了解程度和使用&#x1f600;。 我们把前面讲解到方法的文章…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

Redis优化和解决缓存问题

目录 redis的2种持久化方式 RDB持久化 AOF持久化 redis优化 redis的三大缓存问题 缓存雪崩的解决方案&#xff1a; 缓存穿透的解决方案&#xff1a; 缓存击穿的解决方案&#xff1a; 如何保证 MySQL 和 redis 的数据一致性&#xff1f; redis的2种持久化方式 RDB持久化…

C桑(Cython)从入门到入土(2): np数组操作对比

C桑(Cython)从入门到入土 2. np数组操作对比 Node sc518 Copy has image data of type unsigned long long实际上, &#x1f446;&#x1f3fb;这个错误是我探索Cython的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针&#xff1a; cdef np.uint32_t[:,:,::1] …