软考 DFA的状态转换图+正规式

1.


[解析] 至少要有一个.或E,所以在BCD中。
然后不含+,所以在CD中。

然后观察5出去的两条边(对应于.后的字符),如果是数字的话,就不能出现E了,所以选C。

具体来说

0是入口,6是出口,初始进入0状态,必需最终到达6状态
A 3857,状态过程:0->1->1->1->1
B 1.2E+5,E+5状态过程:0->1->5->2->? 
C -123.67,状态过程:0->4->1->1->1->5->6->6

D 0.576E10,状态过程:0->1->5->6->6->6->?


2. 集合L=ambm|m≥0______。

A.可用正规式“a*b*”表示
B.不能用正规式表示,但可用非确定的有限自动机识别
C.可用正规式“ambm”表示
D.不能用正规式表示,但可用上下文无关文法表示

[解析] 正规式只能表示给定结构的固定次数的重复或者没有指定次数的重复。本题中指定了m的重复次数,但是m是不固定的,所以,不能用正规式表示(A、C错误)。
对于每个非确定的有限自动机,都有一个与其等价的正规式,因此B不正确。
上下文无关文法的捕述功能比正规式更强大,可以表示次数不固定的重复,所以D是正确的


3.若一个程序语言可以提供链表的定义和运算,则其运行时的()。

A.数据空间适合采用静态存储分配策略
B.数据空间必须采用堆存储分配策略
C.指令空间需要采用栈结构
D.指令代码必须放入堆区

[解析] 链表一般使用动态分配策略。数组空间往往使用静态存储分配策略。
内存中供用户使用的存储空间可以分为三部分:程序区、静态存储区和动态存储区。动态存储区又分为栈区和堆区。
程序区:用来存放程序代码的内存区。
静态存储区:用来存储程序中的全局变量和局部变量。
栈区:程序运行过程中存放临时数据,可用来保存函数调用时的现场和返回地址,也可以用来存放形式参数变量和自动局部变量等。
堆区:一个自由存储区域,程序通过动态存储分配函数来使用它,用于诸如链表等的存储。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是DFA最小化状态转换的代码实现,采用Hopcroft算法: ```python from typing import List, Tuple, Dict, Any, Union def hopcroft(dfa: Dict[str, Dict[str, str]]) -> List[List[str]]: # 初始化划分 partition = [list(dfa.keys()), []] # 初始化等价类 equiv_class = {} for state in dfa: accept = dfa[state].get("accept", False) equiv_class[state] = int(accept) # 初始化worklist worklist = [partition[0]] # 迭代worklist while worklist: A = worklist.pop() for symbol in dfa[A[0]]: # 计算每个状态的后继状态所在的等价类 equiv_class_map = {} for state in A: next_state = dfa[state][symbol] equiv_class_map[next_state] = equiv_class[next_state] # 划分等价类 B = [] C = [] for state in A: if equiv_class_map[dfa[state][symbol]] == equiv_class_map[A[0]]: B.append(state) else: C.append(state) # 更新划分和等价类 if len(B) <= len(C): if B not in partition: partition.append(B) worklist.append(B) for state in B: equiv_class[state] = len(partition) - 1 else: if C not in partition: partition.append(C) worklist.append(C) for state in C: equiv_class[state] = len(partition) - 1 # 生成最小化DFA状态转换 min_dfa = [] for i in range(len(partition)): min_dfa.append({}) for state in partition[i]: for symbol in dfa[state]: next_state = dfa[state][symbol] j = equiv_class[next_state] min_dfa[i][symbol] = j return min_dfa ``` 函数`hopcroft()`接受一个DFA状态转换,返回其最小化的状态转换。其中,函数参数`dfa`是一个字典,键为DFA状态,值为字典,表示该状态的转移函数。例如,以下是一个DFA状态转换: ```python dfa = { "S": {"a": "A", "b": "B"}, "A": {"a": "A", "b": "C"}, "B": {"a": "C", "b": "B"}, "C": {"a": "A", "b": "B", "accept": True} } ``` 调用函数`hopcroft(dfa)`后,将返回以下最小化的状态转换: ```python [{'a': 1, 'b': 2}, {'a': 1, 'b': 3}, {'a': 4, 'b': 2}, {'a': 4, 'b': 3, 'accept': True}] ``` 其中,状态0、1、2属于同一个等价类,状态3属于另一个等价类。状态0、1、2在最小化后被合并成一个状态状态3保留。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值