代码模拟确定有限自动机(DFA)执行过程

2023-05-16

 

一个确定有限自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z)其中

① K是一个有穷集,它的每个元素称为一个状态;

② Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号字母表;

③ f是转换函数,是K×Σ→K上的映射(且可以是部分函数),即,如 f(ki,a)=kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;

④ S ∈ K是唯一的一个初态;

⑤ Z⊂K是一个终态集,终态也称可接受状态或结束状态。

 

其具体过程:从初始状态出发,对于输入字符串中的每个字符,自动机都将沿着一条确定的边到另一状态,这条边必须是标有输入符号的边。对n个字符的字符串进行了n次状态变换后,如果自动机到达了一个终态,自动机将接收该字符串。若到达的不是终态,或者找不到与输入字符相匹配的边,那么字符串将拒绝接受这个字符串。 由一个自动机识别的语言是该自动机接收的字符串集合。

 

代码模拟过程:

DFA规定:

a规则,以00结尾

b规则,含连续三个0

c规则,包含011子串

首先构建这三个DFA的状态转移图:

根据状态转移图定义状态结点,并定义相应的转移函数。

具体代码如下:

package practice2_2_4;

import java.util.Scanner;

/**
 * Description :练习模拟DFA接收转移过程
 * Created by Resumebb
 */
public class DFA {
    public static String state;

    //定义a的转换规则
    public static void tranA(int num){
        while (true) {
            if (state.equals("q0") && num == 0) {
                System.out.println("q0接收" + num + "跳转至q1");
                state = "q1";
                break;
            } else if(state.equals("q0") && num == 1){
                System.out.println("q0接收" + num + "跳转至q0");
                state = "q0";
                break;
            }

            if (state.equals("q1") && num == 0) {
                System.out.println("q1接收" + num + "跳转至q2");
                state = "q2";
                break;
            } else if (state.equals("q1") && num == 1) {
                System.out.println("q1接收" + num + "跳转至q0");
                state = "q0";
                break;
            }

            if (state.equals("q2") && num == 0) {
                System.out.println("q2接收" + num + "跳转至q2");
                break;
            } else {
                System.out.println("q2接收1跳转至q0");
                state = "q0";
                break;
            }
        }
    }

    //定义b的转换规则
    public static void tranB(int num) {
        while (true) {
            if (state.equals("q0") && num == 0) {
                System.out.println("q0接收" + num + "跳转至q1");
                state = "q1";
                break;
            } else if (state.equals("q0") && num == 1) {
                System.out.println("q0接收" + num + "跳转至q0");
                state = "q0";
                break;
            }

            if (state.equals("q1") && num == 0) {
                System.out.println("q1接收" + num + "跳转至q2");
                state = "q2";
                break;
            } else if (state.equals("q1") && num == 1) {
                System.out.println("q1接收" + num + "跳转至q0");
                state = "q0";
                break;
            }

            if (state.equals("q2") && num == 0) {
                System.out.println("q2接收" + num + "跳转至q3");
                state = "q3";
                break;
            } else if(state.equals("q2") && num == 1){
                System.out.println("q2接收1跳转至q0");
                state = "q0";
                break;
            }

            if (state.equals("q3") && num == 0) {
                System.out.println("q3接收" + num + "跳转至q3");
                break;
            } else {
                System.out.println("q3接收1跳转至q3");
                break;
            }
        }
    }


    //定义c的转换规则
    public static void tranC(int num) {
        while (true) {
            if (state.equals("q0") && num == 0) {
                System.out.println("q0接收" + num + "跳转至q1");
                state = "q1";
                break;
            } else if (state.equals("q0") && num == 1) {
                System.out.println("q0接收" + num + "跳转至q0");
                state = "q0";
                break;
            }

            if (state.equals("q1") && num == 0) {
                System.out.println("q1接收" + num + "跳转至q1");
                break;
            } else if (state.equals("q1") && num == 1) {
                System.out.println("q1接收" + num + "跳转至q2");
                state = "q2";
                break;
            }

            if (state.equals("q2") && num == 0) {
                System.out.println("q2接收" + num + "跳转至q1");
                state = "q1";
                break;
            } else if(state.equals("q2") && num == 1){
                System.out.println("q2接收1跳转至q3");
                state = "q3";
                break;
            }

            if (state.equals("q3") && num == 0) {
                System.out.println("q3接收" + num + "跳转至q3");
                break;
            } else {
                System.out.println("q3接收1跳转至q3");
                break;
            }
        }
    }

    public static void myDFA(String str,int num){
        char[] chars = str.toCharArray();
        state = "q0";

        System.out.println("开始接收,初态为q0");
        if(num == 1) {
            for (int i = 0; i < chars.length; i++) {
                tranA(chars[i] - '0');
            }
            if(state.equals("q2")){
                System.out.println("该串满足条件a:以00结尾,被接收");
            }
        }

        if(num == 2) {
            for (int i = 0; i < chars.length; i++) {
                tranB(chars[i] - '0');
            }
            if(state.equals("q3")){
                System.out.println("该串满足条件b:含000子串,被接收");
            }
        }

        if(num == 3) {
            for (int i = 0; i < chars.length; i++) {
                tranC(chars[i] - '0');
            }
            if(state.equals("q3")){
                System.out.println("该串满足条件c:含011子串,被接收");
            }
        }
    }

    public static void main(String[] args) {
        //条件a,以00结尾
        //条件b,连续三个0
        //条件c,含011串的集合
        //4个状态q0,q1,q2,q3初态q0,终态q3
        Scanner in = new Scanner(System.in);
        while(true) {
            System.out.println("1.a");
            System.out.println("2.b");
            System.out.println("3.c");
            int choice = in.nextInt();
            System.out.println("输入0,1字符串:");
            String str = in.next();
            switch (choice) {
                case 1:
                    myDFA(str, choice);
                    break;
                case 2:
                    myDFA(str, choice);
                    break;
                case 3:
                    myDFA(str, choice);
                    break;
                default:
                    System.exit(1);
            }
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码模拟确定有限自动机(DFA)执行过程 的相关文章

  • Python学习-条件循环

    1 while循环 while循环的语句格式为 xff1a while condition statements 当判断条件为真时 xff0c 就会执行循环中的语句 xff0c 当条件为假时退出循环 xff0c 若条件为一个永真式 xff0
  • Python学习-函数模块

    1 函数定义 定义规则 xff1a 函数代码块以 def 关键词开头 xff0c 后接函数标识符名称和圆括号 任何传入参数和自变量必须放在圆括号中间 圆括号之间可以用于定义参数 函数的第一行语句可以选择性地使用文档字符串 用于存放函数说明
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • Python学习-多线程

    1 线程 首先区分线程和进程两个概念 xff1a 进程是资源 xff08 CPU 内存等 xff09 分配的基本单位 xff0c 它是程序执行时的一个实例 程序运行时系统就会创建一个进程 xff0c 并为它分配资源 xff0c 然后把该进程
  • Spring MVC controller出错后进入了不该进入的拦截器

    拦截器对一些接口进行了排除 xff0c 使这些接口不用进入拦截器的验证 xff0c 但是出现了一个现象 xff0c 例如 api v1 auth register 这个接口 xff0c 如果因为某些原因 xff0c 出现异常了 xff0c

随机推荐

  • Git学习-本地仓库与版本管理

    一 创建仓库 1 创建空仓库 在合适的位置创建一个新目录 xff0c Git Bash支持的是linux命令操作 第一种方法 xff1a mkdir mygit cd mygit pwd 用mkdir创建目录 xff0c pwd查看当前路径
  • STM32F407用wk2124芯片编写SPI转四路串口驱动

    目录 引言 一 SPI通信配置 1 GPIO初始化设置 2 SPI参数配置 3 读写函数 4 速度设置 二 WK2124逻辑代码编写 1 片选初始化 2 写寄存器函数 3 读寄存器函数 4 写FIFO函数 5 读FIFO函数 6 WK212
  • Git学习-远程仓库

    创建远程仓库 本地现在有一个仓库git xff0c 同时可以在github上创建一个同名的git仓库 xff0c 可以供自己和他人协同操作 1 在github电机new repository创建一个新仓库 xff0c 名称保持与本地一致 R
  • Python学习-SQLite

    SQLite是一种嵌入式数据库 xff0c 它的数据库就是一个文件 由于SQLite本身是C写的 xff0c 而且体积很小 xff0c 所以 xff0c 经常被集成到各种应用程序中 xff0c 甚至在iOS和Android的App中都可以集
  • Python学习-TCP网络编程

    1 客户端 Socket是网络编程的一个抽象概念 通常我们用一个Socket表示 打开了一个网络链接 xff0c 而打开一个Socket需要知道目标计算机的IP地址和端口号 xff0c 再指定协议类型即可 大多数连接都是可靠的TCP连接 创
  • Git学习-分支

    在Git里 xff0c 主分支为master分支 HEAD也不是指向提交 xff0c 而是指向master xff0c master才是指向提交的 xff0c 所以 xff0c HEAD指向的就是当前分支 一开始的时候 xff0c mast
  • Matplotlib绘制各类图像(折线图,曲线图...)-画图的神

    Matplotlib简介 Matplotlib是一个Python工具箱 xff0c 用于科学计算的数据可视化 借助它 xff0c Python可以绘制如Matlab和Octave多种多样的数据图形 最初是模仿了Matlab图形命令 但是与M
  • STM32F407多路串口通信进行数据收发

    一直被说是就不能把几个串口放在一起 xff0c 写个标准例程直接用 xff0c 非要每次用哪个串口才现场改程序 xff0c 被迫把usart1 usart2 usart3进行了资源整合 xff0c 挂在这以备不时之需 功能简述 xff1a
  • 基于Keras实现电影评论文本分类与RNN实现

    notebook使用评论文本将影评分为积极 xff08 positive xff09 或消极 xff08 nagetive xff09 两类 这是一个二元 xff08 binary xff09 或者二分类问题 xff0c 一种重要且应用广泛
  • 基于STM32F407的七要素气象站(气象传感器)CR-WS数据处理实现

    一 七要素气象站介绍 1 七要素气象站介绍 开发板还是采用STM32F407 485连线 xff1a 如果买了变送器就按照下图连线 xff1a 没有买变送器的话 xff0c 直接从气象站上拉线 xff0c 红正黑负 xff0c 黄485 A
  • MyBatis Plus 分页查询,total字段为0,分页未生效

    1 未配置 MybatisPlusInterceptor 64 Bean public MybatisPlusInterceptor mybatisPlusInterceptor MybatisPlusInterceptor interce
  • JavaSE学习记录-整数逆序+数组删除元素

    数组定义方法 int arr 61 new int 10 定义同时进行赋值 xff1a int arr 61 new int 1 2 3 4 5 数组打印方法 1 for循环打印 for int i 61 0 i lt arr length
  • FAFTS文件系统常用函数学习

    一 FATFS文件系统基础知识 1 简介 文件系统可以从官网进行下载 官网地址 xff1a http elm chan org fsw ff 00index e html FATFS是一个完全免费开源的FAT 文件系统模块 xff0c Fa
  • Leetcode-旋转数组+最后一个单词长度

    给定一个数组 xff0c 将数组中的元素向右移动 k 个位置 xff0c 其中 k 是非负数 示例 1 输入 1 2 3 4 5 6 7 和 k 61 3 输出 5 6 7 1 2 3 4 解释 向右旋转 1 步 7 1 2 3 4 5 6
  • Leetcode-最短路径和+最大子串和(动态规划)

    给定一个包含非负整数的 m x n 网格 xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 输入 1 3 1 1 5 1 4 2 1 输出 7 解释
  • LeetCode-二进制串和+宝石与石头

    给你两个二进制字符串 xff0c 返回它们的和 xff08 用二进制表示 xff09 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 61 34 11 34 b 61 34 1 34 输出 34 100 34 示例 2 输
  • JavaSE数组练习-句子翻转+字符替换+打印特殊三角

    1 句子翻转 要求 xff1a 给定字符串如 34 hello i am a student 34 xff0c 对英语句子进行翻转 xff0c 并保持英语单词的顺序不变 xff0c 对标点符号当成字母处理 代码实现 xff1a import
  • 视觉SLAM学习--基础篇(SLAM框架及相机模型)

    一 例子 如上图的小萝卜机器人 xff0c 要使其具有自主运动能力至少需要两个条件 xff1a 1 我在什么地方 xff1f 定位 2 周围环境是什么样 xff1f 建图 因此它既需要知道自身的状态 位置 xff0c 也要了解所在的环境 地
  • Linux各类软件安装配置问题记录

    1 Ubuntu侧边栏和顶部栏消失不见 解决方法 xff1a 鼠标右键或者快捷键打开终端输入命令 dconf reset f org compiz 输入命令 setsid unity 一般到这一步侧边栏就会出现了 xff0c 如果没有出现就
  • 代码模拟确定有限自动机(DFA)执行过程

    一个确定有限自动机 xff08 DFA xff09 M是一个五元组 xff1a M 61 xff08 K xff0c xff0c f xff0c S xff0c Z xff09 其中 K是一个有穷集 xff0c 它的每个元素称为一个状态 x