热门标签 | 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)还是正则语言,那它们的规律是什么?它们又如何……


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

推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • 在过去两周中,我们利用 ReportViewer 开发了与生产良率相关的报表,其中每个制程的直通率是所有测试项良率的乘积。由于 ReportViewer 没有内置的累乘函数,因此需要借助自定义代码来实现这一功能。本文将详细介绍实现步骤和相关代码。 ... [详细]
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 本文总结了Java程序设计第一周的学习内容,涵盖语言基础、编译解释过程及基本数据类型等核心知识点。 ... [详细]
  • 本文介绍如何使用Perl编写一个简单的爬虫,从丁香园网站获取意大利的新冠病毒感染情况。通过LWP::UserAgent模块模拟浏览器访问并解析网页内容,最终提取所需数据。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • Ihaveastringwithquotesaroundthepathasfollows:我在路径周围有一个带引号的字符串,如下所示:C:\ProgramFiles(x ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 深入解析JMeter中的JSON提取器及其应用
    本文详细介绍了如何在JMeter中使用JSON提取器来获取和处理API响应中的数据。特别是在需要将一个接口返回的数据作为下一个接口的输入时,JSON提取器是一个非常有用的工具。 ... [详细]
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社区 版权所有