NLP实验一:形式语言和自动机
实验目的
掌握有限自动机的基本概念
掌握有限自动机与正则文法的联系,并设计程序实现有限自动机,判断字符串是否被接受
实验内容
请设计程序实现如下有限自动机, 并且输入三个不同的字符串, 对字符串进行合法性检测 (即判断字符串中的字符是否在输入符号集中), 之后由有限自动机判断字符串是否被接受。
状态集: \left{q_0,q_1,q_2,q_3\right} (可用其他字符代替)
输入符号集: {0,1}
初始状态: q_0
终止状态: q_0
状态转移函数:开始
三、 实验过程
3.1 变量定义
枚举类型State,定义了q0,q1,q2,q3四个状态,值得一提的是c++中枚举型变量默认与int型变量一一对应(即q0 == 0,q1 ==1等)。
用nowState记录当前状态
enum State{q0,q1,q2,q3};
State nowState;nextState是一个二维数组,用来确定下一个状态。第一维为当前状态,值得注意的是,我将每个状态都映射到了一个非负整数,如q0映射到了0,q1映射到了1。第二维为接受的符号,我同样将字符串符号映射到了非负整数(字符‘0’映射到整数 0,字符‘1’映射到整数1)。
int nextState[4][2]str是输入的字符串,ans用来储存状态序列
string str;
vector<int> ans;3.2 程序思路
首先调用init(),初始化状态转移函数。对nextState的初始化思路如下:
该二维数组第一维为当前状态,第二维为接受的符号(已完成映射)。例如:当前状
态是q3,接受字符‘0’后转移到状态q1,则表示为nextState[3][0]=q1。特别地,如果不存在状态a接收字符‘x’后的转移,那么下一个转态就为-1,表示不存在。
void init(){memset(nextState,-1,sizeof nextState);nextState[1][1]=nextState[2][0]=q0;nextState[0][1]=nextState[3][0]=q1;nextState[0][0]=nextState[3][1]=q2;nextState[2][1]=nextState[1][0]=q3;}之后循环三次,每次读入一个字符串。初始状态为q0,初始化flg=1。flg==1表示能被接收,flg==-1表示字符串中的字符不在输入符号集中,flg==0表示字符串不可以被有限自动机接收。清空ans并初始化第一个状态为q0。
cin>>str;
nowState=q0;
int flg= 1;
ans.clear();
ans.push_back(0);然后遍历每一个字符,如果该字符不在输入符号集中,则flg=-1,跳出循环。如果当前flg==1,则通过nextState[][]查询当前状态在接收该字符后是否能转移到下一个状态。如果不能转移,则flg=0,但不能跳出循环(因为后面的字符可能有不在输入符号集中的情况);如果可以转移则进行转移。
for(char i : str){if(i!='0'&&i!='1'){flg = -1;break;}if(flg==1){int next=nextState[nowState][i-'0'];if(next==-1){flg=0;}else{ans.push_back(next);nowState = (State)next;}}}print(flg);}最后调用print函数,通过flg的值输出信息。
void print(int nowflg){if(nowflg==-1){cout<<"字符串中的字符不在输入符号集中\n";}else if(nowflg==0||nowState!=q0){cout<<"字符串不可以被有限自动机接受\n";}else{cout<<"字符串可以被有限自动机接受,状态序列为:";for(int x=0;x<ans.size();x++){cout<<"q"<<ans[x];if(x!=ans.size()-1) cout<<"->";}cout<<endl;}}3.3 复杂度分析
程序时间复杂度为\mathbit{O}(\mathbit{n}),其中n为字符串长度。
程序的空间复杂度为\mathbit{O}(\mathbit{n}\times\mathbit{m}),其中n为状态的数量,m为可接受字符的数量。
程序使用nextState[][]数组,能够以\mathbit{O}(\mathbf{1})的时间复杂度完成状态转移,运行效率高。
程序有较好的拓展性,只需修改小部分代码,就能完成对特定有限自动机接受字符串
的判定。
四、 结果展示
如图2所示,字符串为110101时,该字符串可以被有限自动机接受,对应的状态序列
q0->q1->q0->q2->q3->q1->q0。
字符串为2313时,2和3都不在输入符号集中,所以输出“字符串中的字符不在输入符号集中”。
字符串为1111110时,最后状态是q2,并不属于终止状态,故输出“字符串不可以被有限自动机接受”。如图3所示,字符串为1101时,最后状态是q3,并不属于终止状态,故输出“字符串不可以被有限自动机接受”。
字符串为11016时,6不在输入符号集中,所以输出“字符串中的字符不在输入符号集中”。
字符串为111111时,最后状态是q2,该字符串可以被有限自动机接受,对应的状态序列
q0->q1->q0->q1->q0->q1->q0。
五、 代码
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
enum State{q0,q1,q2,q3};
int nextState[4][2];
string str;
State nowState;
vector<int> ans;
int t;
void init(){memset(nextState,-1,sizeof nextState);nextState[1][1]=nextState[2][0]=q0;nextState[0][1]=nextState[3][0]=q1;nextState[0][0]=nextState[3][1]=q2;nextState[2][1]=nextState[1][0]=q3;
}void print(int nowflg){if(nowflg==-1){cout<<"字符串中的字符不在输入符号集中\n";}else if(nowflg==0||nowState!=q0){cout<<"字符串不可以被有限自动机接受\n";}else{cout<<"字符串可以被有限自动机接受,状态序列为:";for(int x=0;x<ans.size();x++){cout<<"q"<<ans[x];if(x!=ans.size()-1) cout<<"->";}cout<<endl;}
}int main() {init();t=3;cout<<"请输入字符串"<<endl;while(t--){cin>>str;nowState=q0;int flg= 1;ans.clear();ans.push_back(0);for(char i : str){if(i!='0'&&i!='1'){flg = -1;break;}if(flg==1){int next=nextState[nowState][i-'0'];if(next==-1){flg=0;}else{ans.push_back(next);nowState = (State)next;}}}print(flg);}return 0;
}
NLP实验一:形式语言和自动机相关推荐
- 形式语言与自动机及其在NLP中的应用
摘要 形式语言与自动机是计算机科学的理论基础,对于计算机科学与技术专业人才的计算思维能力培养极其重要.本文首先从Chomsky谱系出发,对形式语言的概念和类别进行了阐述,然后按照形式文法与自动机之间的 ...
- 计算理论 形式语言与自动机_下推式自动机(PDA)| 计算理论
计算理论 形式语言与自动机 Pushdown Automaton (PDA) is a kind of Automaton which comes under the theory of Comput ...
- 【形式语言与自动机】图灵机
[形式语言与自动机]图灵机 一.图灵机 在经过有限状态机的介绍之后,再来看一种功能更强大的机器. 图灵机基本结构 〉 一条分格的无限长的纸带,每格可容纳一个字符 〉 一个读写头,可以在纸带上移动(可以 ...
- 【形式语言与自动机】有限状态机
[形式语言与自动机]有限状态机 一.有限状态机 其需求来自于对语言字符串识别的需要,给定字符串判定它是否属于语法G产生的 L(G), 判断是否属于这个集合. 句子识别 〉 给定一个字符串,判定是否属于 ...
- 形式语言与自动机 Part 3.有限自动机
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.4 正则语言,2DFA,MealyMoore机
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.5 上下文无关语言与下推自动机(PDA)
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.6 图灵机
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 形式语言与自动机 Part.1绪论, Part.2 语言与文法
课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...
- 【第二章 语言及文法】形式语言与自动机第二章个人总结复习笔记分享!(含文件、持续更新...)
目录 一.总览 二.2.1 [语言的定义与运算] 2.2 [文法] 2.3 [文法的分类] 说明 网盘链接 参考教材 有用的话请点个赞吧,后续有时间会持续更新. 提示:本文内容全是我一人学习总结而来, ...
最新文章
- Windows 系统执行Shell 脚本的方法
- 上海网络推广为大家讲解细节标签能给网站带来的作用与效果!
- 将今天写进历史,即可得出现在的世界是数字的
- 电子信息工程跨考计算机武大,往届从材料跨考武大085208电子与通信工程初试303分 - 考研 - 小木虫 - 学术 科研 互动社区...
- SQL Server-服务器迁移之后login登录问题
- Linux笔记-Centos7编译安装GmSSL
- Debugging--the practice of programming
- 华为收购港湾核心业务 6年恩怨尘埃落定
- Android九宫格闪烁,js实现九宫格点击按钮随机三个格子闪烁,发生错误
- 从 “C语言之父” 那里学到的一些好东西!分享给你~
- Androidstudio svn 使用 版本控制 详细步骤(一)
- 二阶有源低通滤波电路的设计与分析
- android禁用传感器,Android 系统强制禁用距离传感器方法
- PreferenceFragment的简单使用
- htonl(), ntohl(), htons(), ntohs() 函数具体应用
- 基于arduino 开发 esp32 点亮ili9341屏幕
- Android Fragment 实现状态栏透明(沉浸式)
- Spring Cloud OpenFeign - - - > 契约配置
- gif动态图怎么制作?gif动态图在线制作一键搞定
- iOS开发-聊天气泡的绘制和聊天消息列表
热门文章
- 九款实用的在线画图工具(那些可以替代Visio的应用)
- iis服务器网站启动不了,IIS上打不开asp网站怎么办
- ArcGis学习资料汇总整理
- 富士施乐Fuji Xerox DocuPrint P158 b 驱动
- Iphone5的机身4S的配置 山寨版“iPhone 5S”上手视频
- 推荐-最新PSP游戏下载,不用注册直接下载!(1)
- 计算机模拟比赛,关于参加2017年中小学计算机模拟城市设计比赛的通知
- Linux虚拟网络基础 — Tap
- 选择易优cms建站的十大理由
- JavaScript对话框