编译原理,确定有穷自动机DFA最小化
来源:互联网 发布:纵队 知乎 编辑:程序博客网 时间:2024/05/16 17:04
输入DFA五元组,将其最小化。
实验算法:
1, 对于DFA的字母表M,把M划分成终态集和非终态集,令P=M。
2, 对于P中的一个集合I,寻找I每一个元素K,找到K从边a对应的节点,加入集合I1,若I1是P中某个集合的子集,跳至步骤3,若不是,步骤4.
3, 寻找P中下一个集合,执行步骤2,若所有集合均是子集,则步骤5.
4, 将I1划分成P中某几个集合子集的形式,将I1划分后的集合加入P,并删除I。执行步骤3
5, 用P中的每一集合的第一个元素代替集合,形成新的DFA。
代码实现:
1、 依次按照定义,输入五元组G={M,E,S,f,B},其中M是字母表,E是终态集,S是初态,f是函数,B是边集。
2、 对于字母表M,用最小化算法进行递归,直至结束。
3、 输出五元组。
编程环境:windows 86-64bite,python 3.5
源代码:
m=list(input('请输入字母表'))z=list(input('请输入终态集合'))b=list(input('请输入边集'))s=input('请输入初态')print('请输入f,以0结束')dfa=[]while True: i=list(input()) if i==['0']: break; dfa.append(i)m1=[]for i in m: m1=m1+[i]z1=[]for i in z: z1=z1+[i]n=2m=set(m)z=set(z)m=m.difference(z)m=list(m)z=list(z)p=[]m=sorted(m)z=sorted(z)p.append(m)p.append(z)work=[]while True: over=0 for ppp in range(5): for kk in range(0,n): c=b[kk] for i in p: for zb in i: for j in range(14): if zb==dfa[j][0]: if c==dfa[j][1]: work=work+[dfa[j][2]]; l=len(p) gg=set() g=[]; for j in range(len(work)): for pii in range(l): if {work[j]}.issubset(set(p[pii])): work[j]=pii su=0 for l in range(len(work)-1): if work[l]==work[l+1]: su=su+1 if su==len(work)-1: work=[] continue if len(work)==1: work=[] continue else: x1=[] l1=len(i) x1=x1+[i[0]] mengyan=0 i.pop(0) conter=1 for ii in range(1,l1): if work[0]==work[ii]: x1=x1+[i[ii-conter]] i.pop(ii-conter) conter=conter+1 mengyan=mengyan+1 p.append(x1); work=[] over=1 if over==0: break;for i in p: if len(i)>1: for j in dfa: for k in i: if k==j[0]: j[0]=i[0]print(dfa)dfa1=[]for i in dfa: if i not in dfa1: dfa1.append(i)print('最终集合划分为: ',p)for i in p: if len(i)>1: while len(i)!=1: i.pop(); print('字母表为: ',m1)z2=[]for i in p: if i[0] in z1: z2=z2+[i[0]]print('终态集合为: ',z2)print('初态为: ',s)print('边集: ',b)print('f: ',dfa1)
样例测试:
输出最小化后的字母表和划分的集合:
0 0
- 编译原理,确定有穷自动机DFA最小化
- 自动机理论、语言和计算导论---有穷自动机:确定型有穷自动机(DFA)
- 编译原理-DFA有穷自动机 词法分析应用于O(n)的单词匹配
- 确定有穷自动机
- 确定有穷自动机测试代码
- 编译原理之DFA自动机的
- 确定的有穷自动机正则表达式求值
- SCUT 2014 B题 Numbers (DFA有穷自动机)
- 编译原理中正则表达式直接构造DFA,DFA的最小化算法
- 编译原理中正则表达式直接构造DFA,DFA的最小化算法
- 编译原理学习周入门教程--(8)编译程序第一个工作阶段-词法分析(有穷自动机)
- 有穷自动机
- 有穷自动机
- 正规式转确定有穷自动机(NFA)
- 正规式转确定有穷自动机(NFA)
- 编译原理词法分析之NFA与自动机的最小化
- 编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
- 编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
- cat /proc/sys/vm/swappiness
- [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货
- C#52课的主要内容
- java服务端–微信APP支付接口
- 4、滑屏轮播——加transition版
- 编译原理,确定有穷自动机DFA最小化
- FPGA定点运算
- java导出word之freemarker导出(详细教程)
- Kinect深度图与摄像头RGB的标定与配准(转载文章)
- Linux常用命令压缩和解压缩命令2
- Cocoapods 需更换源,taobao Gems 源已停止维护
- JAVA中protected的作用
- 不谈黑科技的段子才是有用的文章
- 用Python解析XML的几种常见方法的介绍