热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于编译原理的几道问题,高分求救,速来,希望高人指点一下!!!

[刚才手敲的全没了!!!从简问吧1.正规式a*(c+d)+b(c+d)*类似这种的,我不明白,b(c+d)*是意味着b后面可以接c*,d*任意的顺序这个意思吗?2.DFA的状态个数和由这个DFA
[刚才手敲的全没了!!!
从简问吧
1.正规式a*(c+d)+b(c+d)*类似这种的,我不明白,b(c+d)*是意味着b后面可以接c*,d*任意的顺序这个意思吗?
2.DFA的状态个数和由这个DFA确定的语言,假如说是字符串,那么和这个字符串的长度有什么关系?
3.pumping lemma不是很理解,能不能用例子详细解释一下?
比如说DFA有n个状态(n>2),其中不可接收的串集非空,问若令其不可接收的最短串长为k,则k取值范围
A1 b 1 4.下面这题不会啊
let k>=2,let L be the set of strings in {0,1}* such that x属于L if and only if the number of 0's in x is divisible by k and the number of 1's in x is odd.The mimimum number of states in a deterministic finite automaton that recognizes L is 
A k+2 B 2k Cklogk D k平方 E2的k次幂

15 个解决方案

#1


1. (c+d)是c至少一个,后面跟一个d。(c+d)*表示刚才的那个分组可以重复任意次(包括0次)
2. 语言不是字符串,语言是字符串的集合。这个问题意义不明。
3. 如果一个正则语言L的对应的p=5,任何一个大于5的字符串,比如s=aaabbb,存在一个分割s=xyz,比如x=aa,y=ab,z=bb,使得xy^i z都在L里,就是说aabb,aaabbb,aaababbb,aaabababbb……都在L里
pumping lemma最关键是要把命题里的量词搞清楚。这个有助教的话尽量去问助教。面对面的提问解答效率更高。
4. 显然2*k个状态可以做到,然后那个DFA没有等价状态,所以2k就可以。

#2


引用 1 楼 FancyMouse 的回复:
1. (c+d)是c至少一个,后面跟一个d。(c+d)*表示刚才的那个分组可以重复任意次(包括0次)
2. 语言不是字符串,语言是字符串的集合。这个问题意义不明。
3. 如果一个正则语言L的对应的p=5,任何一个大于5的字符串,比如s=aaabbb,存在一个分割s=xyz,比如x=aa,y=ab,z=bb,使得xy^i z都在L里,就是说aabb,aaabbb,aaa……


还是不太理解
1.我觉得解释不对,应该是{b,c}{b,c}{b,c}.....可以是一个b
2.那个语言是字符串的集合,我理解,但是,我的意思是这个表示语言的正则表达式,假设是(0+1)*,或者是第4题那样,那个为什么是2k?什么奇数偶数的和状态有什么关系?3.第三题还是不理解

#3


>b后面可以接c*,d*任意的顺序这个意思
这样是b(c*|d*)
>应该是{b,c}{b,c}{b,c}.....可以是一个b
这样是b(bc)*

我的意思是b, bcd, bcccd, bcdccdccccd。当然前提是我理解这个+是各种正则语法里用的+。如果在你的定义里+是理解成“或”的话那就是另一个故事了。

>那个为什么是2k
自己先把DFA构造出来啊。连DFA都没构造出来这题做个毛啊。

#4


>>b后面可以接c*,d*任意的顺序这个意思
>这样是b(c*|d*)
纠正一下,如果是任意顺序的话那就b(c*|d*)*

#5


1,c+d中的+就是或的意思。理论就要作为理论看。理论中的正则表达式没有“通配符”的概念,所有单一字符的东西都用字母表示。(c+d)*可以看作一串格子,每个格子里面要么是c要么是d,那这一串字符串中的c和d的顺序不就是任意的吗。
2,语言是一组字符串,可以无限多,每一个字符串也可以无限长,只要有循环。一个语言可以对应无穷多DFA,只要里面有循环,每展开一层循环就可以得到一个新DFA,但是总存在一个状态数最少的DFA,这就是DFA的化简。
3,泵引理是说:正则语言总能抽一段中间重复的部分,完了之后剩下的串还是属于这个正则语言。对于a{n}b{n}(a和b分别依次都重复n次),它就不是正则的,因为不管是从中间抽k个a还是k个b,剩下的a和b的数目不一致了,不再是原来那个语言了,它就不是正则的。
4,你在纸上画两个环,每个环有k个状态,k条边,边上的输入都是0。选这两个环之间挨得最近的两个状态,画上来回两条边,边上的输入都是1。这两个状态其中一个是起点,另外一个是终点。这个DFA就画成了。

#6


不好意思,刚才那个第四题的DFA还没画完。那个DFA中的1和0都是聚集在一起的,不是乱序的。不要紧,继续画,只用加边就行了。两个环上顺各自旋转方向找对应点,对应点之间画上来回两条边,边上的输入都是1。

这两个环分别代表奇数个1加k个0的环(终点所在的环)和偶数个1加k个0的环(起点所在的环)。任意一个状态上输入一个1就跳到另一个环上继续转圈。所以每次到终点时,必定把环转了一整圈,并且输入了奇数个1。总共2k个状态,自己画画,应该很直观吧。

#7


引用 6 楼 SonicLing 的回复:
不好意思,刚才那个第四题的DFA还没画完。那个DFA中的1和0都是聚集在一起的,不是乱序的。不要紧,继续画,只用加边就行了。两个环上顺各自旋转方向找对应点,对应点之间画上来回两条边,边上的输入都是1。

这两个环分别代表奇数个1加k个0的环(终点所在的环)和偶数个1加k个0的环(起点所在的环)。任意一个状态上输入一个1就跳到另一个环上继续转圈。所以每次到终点时,必定把……


愚笨的狠,,,不好意思哈,,我不明白什么叫做环上有状态?,有边?

#8


引用 3 楼 FancyMouse 的回复:
>b后面可以接c*,d*任意的顺序这个意思
这样是b(c*|d*)
>应该是{b,c}{b,c}{b,c}.....可以是一个b
这样是b(bc)*

我的意思是b, bcd, bcccd, bcdccdccccd。当然前提是我理解这个+是各种正则语法里用的+。如果在你的定义里+是理解成“或”的话那就是另一个故事了。

>那个为什么是2k
自己先把DFA构……


这道题的DFA怎么画出来?没有正则表达式,只有0,1 的个数,怎么个画法?

#9


引用 7 楼 llyjy21 的回复:
愚笨的狠,,,不好意思哈,,我不明白什么叫做环上有状态?,有边?


k个点、k条有向边,构成一个环,不会画吗?学过数据结构中的图吧?DFA不就是有向图嘛

#10


#11


推荐楼主下载研究一下 LEX+YACC

#12


引用 10 楼 SonicLing 的回复:


似乎有点明白,但是你是怎样一个思路啊?看到这题怎么反应这么快?能把你的思路想法教给我吗?

#13


引用 12 楼 llyjy21 的回复:
引用 10 楼 SonicLing 的回复:

似乎有点明白,但是你是怎样一个思路啊?看到这题怎么反应这么快?能把你的思路想法教给我吗?


这道题最笨的思路是构思一个DFA,就像上面这样,基本无迹可寻,靠经验。其实还有一种有迹可寻,也得靠经验的方法,就是构建正则文法。就是说你要把题意所表达的这个正则表达式换成正则文法,方法是这样的:

题目要的是k个0、odd个1的串,给它起个非终结符名字为k0o1,那么k-10e1就是有k-1个0,even个1,以此类推。从k0o1开始定义。怎么定义呢?先打个草稿:
k0o1 -> 0 have_a_0
      | 1 have_a_1
其中have_a_0/have_a_1是打草稿用的占位符,表示前面已经有一个0了,还是得用上面的规律起正规名字。对于have_a_0来说,前面已经用掉一个0了,剩下肯定是k-10o1(1的数目不变),类似对于have_a_1来说,前面用掉了一个1,剩下就是k0e1(偶数个1),那么第一个定义就是这样的:
k0o1 -> 0  k-10o1
      | 1  k0e1
现在有两个新的符号要定义了,方法和上面一样:
k-10o1 -> 0  k-20o1
        | 1  k-10e1
k0e1   -> 0 k-10e1
        | 1 k0o1
这两个新的符号又引入了两个更新的符号,继续:
k-20o1 -> 0  k-30o1
        | 1  k-20e1
k-10e1 -> 0 k-20e1
        | 1 k-10o1
好了,看出规律没有:有两个规律都指向同一个结论:
1. 每展开一轮增加2个新符号,如果k是个有限的数的话,最后会展开为2k个符号。
2. 用j代表1~k中任意一个数,终结符的符号规律是j0e1或者j0o1,总共有2k个符号。

现在把这个正则文法转换成DFA,很简单,每一行是一条迁移,0和1做边,非终结符做状态,总共4k条边,2k个状态。
     

#14


至于为什么一上来打草稿就可以写出

k0o1 -> 0 have_a_0
      | 1 have_a_1

这种格式?这就是递归的思路了。这个思路就是:k0o1代表了一个语言,这个语言由0或1随意重复而成。那么:将k0o1所代表的这个语言从头部拿掉一个0或者一个1,剩下的语言(have_a_0/have_a_1)还是正则语言,那它们的规律是什么?它们又如何定义?

规律就是k个0拿掉一个剩k-1个,奇数个0拿掉一个剩偶数个。
定义的方法就是再拿掉一个0或者1,看还能剩下什么(递归)。

#15


引用 14 楼 SonicLing 的回复:
至于为什么一上来打草稿就可以写出

k0o1 -> 0 have_a_0
      | 1 have_a_1

这种格式?这就是递归的思路了。这个思路就是:k0o1代表了一个语言,这个语言由0或1随意重复而成。那么:将k0o1所代表的这个语言从头部拿掉一个0或者一个1,剩下的语言(have_a_0/have_a_1)还是正则语言,那它们的规律是什么?它们又如何……


谢谢,但是对于快速答题来说,这个方法太麻烦,我一时想不到,不过,还是很感谢你

推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
author-avatar
QJ974
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有