实验目的

掌握有限自动机的基本概念
掌握有限自动机与正则文法的联系,并设计程序实现有限自动机,判断字符串是否被接受

实验内容

请设计程序实现如下有限自动机, 并且输入三个不同的字符串, 对字符串进行合法性检测 (即判断字符串中的字符是否在输入符号集中), 之后由有限自动机判断字符串是否被接受。
状态集: \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实验一:形式语言和自动机相关推荐

  1. 形式语言与自动机及其在NLP中的应用

    摘要 形式语言与自动机是计算机科学的理论基础,对于计算机科学与技术专业人才的计算思维能力培养极其重要.本文首先从Chomsky谱系出发,对形式语言的概念和类别进行了阐述,然后按照形式文法与自动机之间的 ...

  2. 计算理论 形式语言与自动机_下推式自动机(PDA)| 计算理论

    计算理论 形式语言与自动机 Pushdown Automaton (PDA) is a kind of Automaton which comes under the theory of Comput ...

  3. 【形式语言与自动机】图灵机

    [形式语言与自动机]图灵机 一.图灵机 在经过有限状态机的介绍之后,再来看一种功能更强大的机器. 图灵机基本结构 〉 一条分格的无限长的纸带,每格可容纳一个字符 〉 一个读写头,可以在纸带上移动(可以 ...

  4. 【形式语言与自动机】有限状态机

    [形式语言与自动机]有限状态机 一.有限状态机 其需求来自于对语言字符串识别的需要,给定字符串判定它是否属于语法G产生的 L(G), 判断是否属于这个集合. 句子识别 〉 给定一个字符串,判定是否属于 ...

  5. 形式语言与自动机 Part 3.有限自动机

    课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...

  6. 形式语言与自动机 Part.4 正则语言,2DFA,MealyMoore机

    课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...

  7. 形式语言与自动机 Part.5 上下文无关语言与下推自动机(PDA)

    课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...

  8. 形式语言与自动机 Part.6 图灵机

    课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...

  9. 形式语言与自动机 Part.1绪论, Part.2 语言与文法

    课程名:形式语言与自动机 作者:Lupinus_Linn 许可证:CC-BY-NC-SA 3.0 创作共用-署名-非商业性-相同方式共享 署名(英语:Attribution,BY):您(用户)可以复制 ...

  10. 【第二章 语言及文法】形式语言与自动机第二章个人总结复习笔记分享!(含文件、持续更新...)

    目录 一.总览 二.2.1 [语言的定义与运算] 2.2 [文法] 2.3 [文法的分类] 说明 网盘链接 参考教材 有用的话请点个赞吧,后续有时间会持续更新. 提示:本文内容全是我一人学习总结而来, ...

最新文章

  1. Windows 系统执行Shell 脚本的方法
  2. 上海网络推广为大家讲解细节标签能给网站带来的作用与效果!
  3. 将今天写进历史,即可得出现在的世界是数字的
  4. 电子信息工程跨考计算机武大,往届从材料跨考武大085208电子与通信工程初试303分 - 考研 - 小木虫 - 学术 科研 互动社区...
  5. SQL Server-服务器迁移之后login登录问题
  6. Linux笔记-Centos7编译安装GmSSL
  7. Debugging--the practice of programming
  8. 华为收购港湾核心业务 6年恩怨尘埃落定
  9. Android九宫格闪烁,js实现九宫格点击按钮随机三个格子闪烁,发生错误
  10. 从 “C语言之父” 那里学到的一些好东西!分享给你~
  11. Androidstudio svn 使用 版本控制 详细步骤(一)
  12. 二阶有源低通滤波电路的设计与分析
  13. android禁用传感器,Android 系统强制禁用距离传感器方法
  14. PreferenceFragment的简单使用
  15. htonl(), ntohl(), htons(), ntohs() 函数具体应用
  16. 基于arduino 开发 esp32 点亮ili9341屏幕
  17. Android Fragment 实现状态栏透明(沉浸式)
  18. Spring Cloud OpenFeign - - - > 契约配置
  19. gif动态图怎么制作?gif动态图在线制作一键搞定
  20. iOS开发-聊天气泡的绘制和聊天消息列表

热门文章

  1. 九款实用的在线画图工具(那些可以替代Visio的应用)
  2. iis服务器网站启动不了,IIS上打不开asp网站怎么办
  3. ArcGis学习资料汇总整理
  4. 富士施乐Fuji Xerox DocuPrint P158 b 驱动
  5. Iphone5的机身4S的配置 山寨版“iPhone 5S”上手视频
  6. 推荐-最新PSP游戏下载,不用注册直接下载!(1)
  7. 计算机模拟比赛,关于参加2017年中小学计算机模拟城市设计比赛的通知
  8. Linux虚拟网络基础 — Tap
  9. 选择易优cms建站的十大理由
  10. JavaScript对话框