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

llyjy21 2013-03-02 05:29:19
[刚才手敲的全没了!!!
从简问吧
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<k<n c n<k<2n-1 d 2n<k<n平方
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次幂
...全文
289 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
SonicLing 2013-03-05
  • 打赏
  • 举报
回复
至于为什么一上来打草稿就可以写出 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,看还能剩下什么(递归)。
SonicLing 2013-03-05
  • 打赏
  • 举报
回复
引用 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个状态。
llyjy21 2013-03-05
  • 打赏
  • 举报
回复
引用 14 楼 SonicLing 的回复:
至于为什么一上来打草稿就可以写出 k0o1 -> 0 have_a_0 | 1 have_a_1 这种格式?这就是递归的思路了。这个思路就是:k0o1代表了一个语言,这个语言由0或1随意重复而成。那么:将k0o1所代表的这个语言从头部拿掉一个0或者一个1,剩下的语言(have_a_0/have_a_1)还是正则语言,那它们的规律是什么?它们又如何……
谢谢,但是对于快速答题来说,这个方法太麻烦,我一时想不到,不过,还是很感谢你
赵4老师 2013-03-04
  • 打赏
  • 举报
回复
推荐楼主下载研究一下 LEX+YACC
llyjy21 2013-03-04
  • 打赏
  • 举报
回复
引用 10 楼 SonicLing 的回复:
似乎有点明白,但是你是怎样一个思路啊?看到这题怎么反应这么快?能把你的思路想法教给我吗?
SonicLing 2013-03-04
  • 打赏
  • 举报
回复
SonicLing 2013-03-04
  • 打赏
  • 举报
回复
引用 7 楼 llyjy21 的回复:
愚笨的狠,,,不好意思哈,,我不明白什么叫做环上有状态?,有边?
k个点、k条有向边,构成一个环,不会画吗?学过数据结构中的图吧?DFA不就是有向图嘛
FancyMouse 2013-03-03
  • 打赏
  • 举报
回复
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就可以。
llyjy21 2013-03-03
  • 打赏
  • 举报
回复
引用 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 的个数,怎么个画法?
llyjy21 2013-03-03
  • 打赏
  • 举报
回复
引用 6 楼 SonicLing 的回复:
不好意思,刚才那个第四题的DFA还没画完。那个DFA中的1和0都是聚集在一起的,不是乱序的。不要紧,继续画,只用加边就行了。两个环上顺各自旋转方向找对应点,对应点之间画上来回两条边,边上的输入都是1。 这两个环分别代表奇数个1加k个0的环(终点所在的环)和偶数个1加k个0的环(起点所在的环)。任意一个状态上输入一个1就跳到另一个环上继续转圈。所以每次到终点时,必定把……
愚笨的狠,,,不好意思哈,,我不明白什么叫做环上有状态?,有边?
SonicLing 2013-03-03
  • 打赏
  • 举报
回复
不好意思,刚才那个第四题的DFA还没画完。那个DFA中的1和0都是聚集在一起的,不是乱序的。不要紧,继续画,只用加边就行了。两个环上顺各自旋转方向找对应点,对应点之间画上来回两条边,边上的输入都是1。 这两个环分别代表奇数个1加k个0的环(终点所在的环)和偶数个1加k个0的环(起点所在的环)。任意一个状态上输入一个1就跳到另一个环上继续转圈。所以每次到终点时,必定把环转了一整圈,并且输入了奇数个1。总共2k个状态,自己画画,应该很直观吧。
SonicLing 2013-03-03
  • 打赏
  • 举报
回复
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就画成了。
FancyMouse 2013-03-03
  • 打赏
  • 举报
回复
>>b后面可以接c*,d*任意的顺序这个意思 >这样是b(c*|d*) 纠正一下,如果是任意顺序的话那就b(c*|d*)*
FancyMouse 2013-03-03
  • 打赏
  • 举报
回复
>b后面可以接c*,d*任意的顺序这个意思 这样是b(c*|d*) >应该是{b,c}{b,c}{b,c}.....可以是一个b 这样是b(bc)* 我的意思是b, bcd, bcccd, bcdccdccccd。当然前提是我理解这个+是各种正则语法里用的+。如果在你的定义里+是理解成“或”的话那就是另一个故事了。 >那个为什么是2k 自己先把DFA构造出来啊。连DFA都没构造出来这题做个毛啊。
llyjy21 2013-03-03
  • 打赏
  • 举报
回复
引用 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,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧