DFA的最小化

news2024/12/23 23:17:34

一、实验目的

1.熟练掌握DFA与NFA的定义与有关概念。
2.理解并掌握确定的有穷自动机的最小化等算法。

二、实验要求

输入:DFA
输出:最小化的DFA

三、实验过程

1.化简DFA关键在于把它的状态集分成一些两两互不相交的子集,使得任何两个不相交的子集间的状态都是可区分的,而同一个子集中的任何两个状态都是等价的,这样可以以一个状态作为代表而删去其他等价的状态,然后将无关状态删去,也就获得了状态数最小的DFA。
2.DFA的化简算法:
(1)首先将DFAM的状态划分出终止状态集K1和非终止状态集K2。K=K1∪K2,
由上述定义知,K1和K2是不等价的。
(2)对各状态集每次按下面的方法进一步划分,直到不再产生新的划分。设第i次划分已将状态集划分为k组,即:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

(3)重复第〔2〕步,直到每一个集合不能再划分为止,此时每个状态集合
中的状态均是等价的。
(4)合并等价状态,即在等价状态集中取任意一个状态作为代表,删去其他—切等价状态。
(5)假如有无关状态,如此将其删去。根据以上方法就将确定有限自动机进展了简化,而且简化后的自动机是原自动机的状态最少的自动机。

四、实验结果

在这里插入图片描述

五、代码实现

#include<iostream> 
#include<string>
using namespace std; 
#define max 100 
struct edge{ 
	string first;//边的初始结点 
	string change;//边的条件 
	string last;//边的终点
 }; 
int N;//NFA 的边数 
string part[max];//分割子集 

//状态集合 I 的 a 弧转换 
string move(string jihe,char ch,edge *b)
{
	int i,j; 
  	string s=""; 
 	for(i=0;i<jihe.length();i++)
	{
		for(j=0;j<N;j++)
		{ 
			if(b[j].first[0]==jihe[i]&&b[j].change[0]==ch)
 				s=s+b[j].last;
 		} 
	}
	if(s=="")return "&"; 
	else return s;
 }

//判断子串是否存在在某一集合
bool isexist(string s,string d) { 
	if(d!=""&&0<=d.find(s)&&d.find(s)<=d.length()-1)return 1; 
    else return 0;
 }

//分割子集法进行 DFA 的最小化 
int divide(edge *b,string change) {
	int x,m,flag=2,flag0,i,j; 
	string ss,part0[max]; 
	flag0=flag; 
	for(x=0;x<change.length();x++) { 
		for(m=0;m<flag0;m++)
{
			for(i=0;i<part[m].length();i++) {
				ss=move(part[m].substr(i,1),change[x],b);
				for(j=0;j<flag;j++) { 
					if(isexist(ss,part[j]))part0[j]=part0[j]+part[m].substr(i,1); if(ss=="&") {
						part0[flag]=part0[flag]+part[m].substr(i,1); 
						break;
					 } 
				}
			 }
			for(j=0;j<=flag;j++) {
				if(part0[j]!=""&&part0[j]!=part[m]) { 
					part[flag++]=part0[j]; 
					part0[j]="";
					part[m]="";
				 }
				else part0[j]="";
			 }
		 }
		flag0=flag;
	 }
	return flag;
 }

int main()
{
	int i,j,flag,x;
	string Change;//输入符号
	string ss;
	edge *b=new edge[max];
	cout<<"-------请输入DFA各边信息:(空用&表示)--------"<<endl<<endl
	<<"-----------------以输入$结束----------------"<<endl;
	for(i=0;i<max;i++)
	{
	cin>>b[i].first;
	if(b[i].first=="$")break;
	else
		cin>>b[i].change>>b[i].last;		
	}
	N=i;
	cout<<"请输入该DFA的终态集合: "<<endl;
	cin>>part[1];
	cout<<"请输入该DFA的非终态集合: "<<endl;
	cin>>part[0];
	cout<<"请输入此DFA状态中的输入符号即边上的条件:"<<endl;
	cin>>Change;
	flag=divide(b,Change);
	cout<<"此DFA最小化划分的子集如下: "<<endl;
	for(i=0;i<flag;i++)
	{
		if(part[i]!="")cout<<part[i]<<endl;
	}
	cout<<"用状态A,B,C…等代替子集:";
	for(i=0;i<flag;i++)
	{
		if(part[i]!="")cout<<" i"<<part[i]<<"},";
	}
	cout<<endl<<"则DFA最小化后的各边信息如下: "<<endl;
	char letters[max];
	char letter='A';
	for(i=0;i<flag;i++)
	{
		if(part[i]!="")
		{
			letters[i]=letter;
			++letter;
		}	
	}
	for(i=0;i<flag;i++)
		for(j=0;j<Change.length();j++)
		{
			ss=move(part[i],Change[j],b);
			if(part[i]!=""&&ss!="&")cout<<letters[i]<<" "<<Change[j]<<" ";
			for(x=0;x<flag;x++)
				if(isexist(ss.substr(0, 1),part[x]))cout<<letters[x]<<endl;
		}
	system("pause");
}




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

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

相关文章

一、ArrayList源码解读

ArrayList源码 一、前言 ArrayList在日常的开发中使用频率非常高&#xff0c;但是JDK是如何去设计ArrayList的&#xff0c;这就需要我们好好去了解底层实现原理&#xff0c;这样使用起来才能做到心中有数&#xff1b;当然&#xff0c;还能应付面试。本篇文章会围绕ArrayList的…

王道操作系统网课笔记合集

介绍 操作系统是什么&#xff1f; 计算机结构大概分为四层&#xff1a; 用户应用程序操作系统硬件 操作系统是一类系统软件&#xff0c;调度硬件资源&#xff0c;合理分配管理软件&#xff08;因此操作系统又被称作资源管理器&#xff08;resource manager&#xff09;&…

简洁而优美的结构 - 并查集 | 一文吃透 “带权并查集” 不同应用场景 | “手撕” 蓝桥杯A组J题 - 推导部分和

&#x1f49b;前情提要&#x1f49b; 本章节是每日一算法的并查集&带权并查集的相关知识~ 接下来我们即将进入一个全新的空间&#xff0c;对代码有一个全新的视角~ 以下的内容一定会让你对数据结构与算法有一个颠覆性的认识哦&#xff01;&#xff01;&#xff01; ❗以…

【Unity 3D 从入门到实践】Unity 3D 预制体

目录 一&#xff0c;预制体介绍 二&#xff0c;创建预制体 三&#xff0c;实例化预制体 一&#xff0c;预制体介绍 预制体是 Unity 3D 提供的保存游戏对象组件和属性的方法&#xff0c;通过预制体可以快速的实例化挂载不同组件的游戏对象&#xff0c;从而减少开发难度&…

使用光隔离的调制器在电机控制中进行安全、准确的隔离电流传感

介绍 在工业电机或伺服控制应用中&#xff0c;准确的电流测量是控制回路的一部分。目前的测量不仅需要尽可能准确&#xff0c;还需要安全可靠。 工业电机或伺服控制系统通常包含高压&#xff0c;在过流或短路等故障事件中&#xff0c;这些情况需要快速检测和整流&#xff0c…

Android开发基础

文章目录前言工程项目结构hello world界面布局代码操作新页面页面间跳转简单计算器的实现思路前端控件传递数据后端实现逻辑两个Activity之间传值发送数据返回数据SQLite简单使用利用语句写在后面写在后面前言 安卓(Android)是一种基于Linux内核的开源操作系统 使用java、kot…

不就是性能测试吗?竟让我一个月拿了8个offer,其中两家都是一线大厂

随着互联网的发展&#xff0c;单机软件的逐渐减少&#xff0c;系统从单机步入“云”时代&#xff0c;软件系统功能和规模也越来越庞大&#xff0c;盗版也越来越难&#xff0c;用户规模也越来越大&#xff0c;企业盈利随之爆发式地增长。 随着用户数量的增多&#xff0c;系统稳…

Chrome浏览器修改用户资料(User Data)的存放位置

2022.12.13一、 原先采用的在快捷方式中修改目标的方法&#xff0c;没有效果。二、创建链接1. 复制2. 删除3. 创建链接mklink参考用于缓解C盘压力&#xff0c;将浏览器用户数据存放于其他的指定位置。简单记录一下操作步骤。 其中用户数据可以如此查找&#xff0c;在浏览器地址…

数字虚拟人发展简史

虚拟人的发展史就是技术的发展史 作为元宇宙时代的基石&#xff0c;虚拟人的发展历史与制作技术的进步高度相关。在元宇宙概念中&#xff0c;未来每个用户都将依托虚拟人作为自己的化身进入虚拟世界中探索&#xff0c;要达成这个目的&#xff0c;就要求数字虚拟人不仅拥有人的…

java计算机毕业设计ssm智慧消防维保系统后端设计与实现3cmg0(附源码、数据库)

java计算机毕业设计ssm智慧消防维保系统后端设计与实现3cmg0&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

【毕业设计】微信小程序校园跑腿系统 校园跑腿小程序 校园跑腿微信小程序

一、前言 大学是一个小社会&#xff0c;我们在学校学习到专业知识的时候&#xff0c;有会遇到很多形形色色的任务&#xff0c;但最重要的依旧是社会经历。很多大学生都会想着在大学闯出一片新天地&#xff0c;所以他们往往会选择自己或者带上志同道合的朋友来一起创业。一次好…

泛微京桥通集成SAP,让采购流程闭环、业务管理一体化

SAP作为强大的业务处理平台&#xff0c;推动着组织采购管理走向数字化。其中的SAP MM&#xff08;MaterialManagement&#xff09;&#xff08;物料管理&#xff09;涉及到物料管理全过程&#xff0c;主要包括&#xff1a;物料需求计划、物料主数据、采购、供应商评价、库存管理…

简单聊聊 WebSocket

简单聊聊 WebSocket 1、简介 ​  WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议。 扩展&#xff1a; ​  WebSocket 与 Socket 的区别 WebSocket 是应用层的一个通信协议&#xff1b;Socket 是对 TCP&#xff08;或UDP&#xff09;抽象封装的一组接口&#xf…

浅谈责任链设计模式在框架源码中的运用

写在前面&#xff0c;该篇博文为我在部门的技术分享&#xff0c;所以文字记录不是特别详细。本文更像是一个大纲&#xff0c;由浅入深讲解责任链设计模式。 浅谈责任链设计模式在框架源码中的运用一、分享目的二、简单介绍三、逐个拆解四、源码环节1、Tomcat2、Spring MVC3、Sp…

【MySQL基础】什么是MySQL约束?什么是主键约束?

目录 一、什么是MySQL约束&#xff1f; 二、MySQL约束有什么作用&#xff1f; 三、MySQL约束常见七大类&#xff1f; 主键约束(primary key) PK 1.概念 2.主键约束的相关操作 添加单列主键 添加多列主键(联合主键) 通过修改表结构添加主键 删除主键 &#x1f49f; 创…

【Notebook系列第十三期】基于多模型推理任务的车辆特征识别

在之前的课程中&#xff0c;我们分享的推理任务大部分都只由一个模型构成&#xff0c;但在真实的业务场景下&#xff0c;往往需要我们将多个模型放在一起去运行&#xff0c;才能获取到这个任务的最终预期结果。 因此&#xff0c;本次分享将通过一个简单的示例演示如何使用 Ope…

12月13日(第11天)

腾讯云上通过面板开放端口&#xff0c;不起作用&#xff0c;解决办法&#xff1a;手动在服务器上开放&#xff0c;参考文章地址&#xff1a;在腾讯云控制台下配置防火墙端口无效 直接关闭防火墙是最简单的&#xff0c;systemctl stop firewalld&#xff0c;然后再再腾讯云上打开…

解决端口被占用的方法(查看端口和关闭端口)

目录 前言必读 一.简介 二、解决办法 1.查看该端口是否被占用 2.关闭占用该端口的进程 前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 一.简介 在使用各种端口时候经常会出现端口被占用导致代码程序无法执行或者执行错误。一般都是由于该端…

DataGear 4.3.0 发布,数据可视化分析平台

DataGear 4.3.0 发布&#xff0c;增强图表和看板功能&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;看板模板新增dg-dashboard-auto-render属性&#xff0c;用于控制看板是否自动渲染&#xff1b;新增&#xff1a;看板模版新增dg-dashboard-code属性&#xff0c;…

Spring Batch 批处理-作业参数设置与获取

引言 书接上篇Spring Batch批处理-作业Job简介&#xff0c;上篇带小伙伴们了解色作业Job对象&#xff0c;那这篇就看一下作业参数是啥一回事&#xff0c;同时要怎么设置参数并获取参数的。 JobParameters 前面提到&#xff0c;作业的启动条件是作业名称 识别参数&#xff0…