正规式->最小化DFA说明

部署运行你感兴趣的模型镜像

 今天早上去图书馆,去看编译原理,想把这部分搞清楚,看着龙书+国产的某一本不知什么的习题与解析,猜过程。。猜原理。。终于是看懂了。。
整体的步骤是三步:
一,先把正规式转换为NFA(非确定有穷自动机),
二,在把NFA通过“子集构造法”转化为DFA,
三,在把DFA通过“分割法”进行最小化。

   一步很简单,就是反复运用下图的规则,图1

  这样就能转换到NFA了。
给出一个例题,来自Google book。本文主要根据这个例题来讲,图2

   二.子集构造法。
同样的例题,把转换好的NFA确定化,图3

  这个表是从NFA到DFA的时候必须要用到的。第一列第一行I的意思是从NFA的起始节点经过任意个ε所能到达的结点集合。Ia表示从该集合开始经过一个a所能到达的集合,经过一个a的意思是可以略过前后的ε。同样Ib也就是经过一个b,可以略过前后任意个ε。
至于第二行以及后面的I是怎么确定的。我参考了一些题目才明白,原来就是看上面的Ia和Ib哪个还没出现在I列,就拿下来进行运算,该列对应的Ia和Ib就是前面我说的那样推导。

  如果还不太明白,看图就是了。你会发现I中的几个项目都在Ia和Ib中出现了。而且是完全出现

  这步做完以后,为了画出最后的DFA,那么肯定得标出一些号来,比如1.2.3.。或者A。 B。c,我一般标的方法是先把I列全部标上1.2.3.递增。然后看1表示的集合和Ia和Ib中的哪个集合一样,就把那个集合也表示为1.继续向下做。最后会得到这样一个表格。图4

  至此,就可以表示出DFA了。就对照上面那个表,从0节点开始经过a到1.经过b到2,就这样画就行了。。

  最后的DFA如下图,图5

  双圈的表示终态,这个是怎么来的呢。去看看图4,会发现有些项之前有双圈标志,这个是因为在NFA图2中,9为终态,所以所有包含9的集合都被认为是终态集,改成1.2.3.。。方便画节点后就需要把这些点作为终态了。。

   三.最小化,分割法。

FA的最小化就是寻求最小状态DFA

  最小状态DFA的含义:
1.没有多余状态(死状态)2. 没有两个状态是互相等价(不可区别)
两个状态s和t等价的条件:
兼容性(一致性)条件——同是终态或同是非终态
传播性(蔓延性)条件——从s出发读入某个a和从t出发经过某个a并且经过某个b到达的状态等价。就是相同。

  DFA的最小化—例子,第一步都是固定的。分成终态和非终态

1.将M的状态分为两个子集一个由终态k1={C,D,E,F}组成,一个由非终态k2={S,A,B}组成,

2.考察{S,A,B}是否可分.

因为A经过a到达C属于k1.而S经过a到达A属于k2.B经过a到达A属于k2,所以K2继续划分为{S,B},{A},

3.考察{S,B}是否可再分:

B经过b到达D属于k1.S经过b到达B属于k2,所以S,B可以划分。划分为{S},{B}

4.考察{C,D,E,F}是否可再分:
因为C,D,E,F经过a和b到达的状态都属于{C,D,E,F}=k1所以相同,所以不可再分:

5.{C,D,E,F}以{D}来代替则,因为CDEF相同,你也可以用C来代替。无所谓的最小化的DFA如图,:

真麻烦啊。。心里清楚,还得找些图来说明。。额。。基本上感觉自己讲清楚了。。。不清楚的地方。。请留言互相讨论。。谢谢。。

参考:

http://www.worldcat.org/title/bian-yi-yuan-li-xue-xi-fu-dao/oclc/302301738

http://metc.gdut.edu.cn/compile/cmpl3/3-3.htm

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 将正则表达转换为最小化 DFA #### 正则表达的预处理 为了便于后续的转换工作,通常会先将给定的正则表达转化为后缀表示法。例如,对于正则表达`a.a.b.b`,其对应的后缀形应为`aab.*b.`[^1]。 #### 转换至 NFA (非确定有限自动机) 基于 Thompson 算法或其他适用的方法,可以构建一个与输入正则表达相匹配的 NFA。此阶段涉及创建多个状态以及定义这些状态下字符或ε(空串)迁移路径来模拟原始模的行为。 #### 从 NFA 到 DFA 的转变 一旦获得了代表该正则表达的 NFA,则可通过子集构造法将其转变为等价DFA。这一步骤的关键在于计算每一个可能的状态组合,并据此建立新的单一状态,在这个过程中可能会引入大量冗余状态。 ```python def nfa_to_dfa(nfa_states, alphabet): dfa_states = [] start_state = epsilon_closure({nfa.start}) unprocessed_states = [start_state] processed_states = set() while unprocessed_states: current_set = unprocessed_states.pop() if current_set not in processed_states: new_state = {} for symbol in alphabet: next_set = move(current_set, symbol) eclosure_next_set = epsilon_closure(next_set) if eclosure_next_set and eclosure_next_set not in dfa_states: unprocessed_states.append(eclosure_next_set) new_state[symbol] = eclosure_next_set dfa_states.append((current_set, new_state)) processed_states.add(frozenset(current_set)) return dfa_states ``` 上述代码展示了如何通过遍历所有未处理过的NFA状态集合并应用epsilon闭包操作(`epsilon_closure`)和移动函数(`move`)来进行DFA转化的过程[^2]。 #### 最小化 DFA 最后一步是对得到的 DFA 进行简化以去除不必要的复杂度。这一过程依赖于划分细化技术,它能够识别那些行为完全相同的不可区分状态并将它们合并成单个状态,从而减少整个机器的状态数量而不改变接受的语言特性。 ```python def minimize_dfa(dfa): marked_pairs = set() # Mark all pairs of states where one is accepting and the other isn't. for i in range(len(dfa)): for j in range(i + 1, len(dfa)): state_i_accepting = bool(dfa[i][0].intersection(dfa.accepting_states)) state_j_accepting = bool(dfa[j][0].intersection(dfa.accepting_states)) if state_i_accepting != state_j_accepting: marked_pairs.add(tuple(sorted([i,j]))) changed = True while changed: changed = False for pair in list(marked_pairs): a,b = sorted(pair) for char in dfa.alphabet: target_a = dfa.transitions[a].get(char,-1) target_b = dfa.transitions[b].get(char,-1) if target_a >= 0 and target_b >= 0 and tuple(sorted([target_a,target_b])) not in marked_pairs: marked_pairs.add(tuple(sorted([target_a,target_b]))) changed = True result = {} for idx,state_info in enumerate(dfa.states()): key = frozenset(state_info[0]) transitions = {k:v for k,v in state_info[1].items()} if any(key & s for _,s in result.values()): continue group = [(idx,key)] for o_idx,o_key in ((o,frozenset(o_k)) for o,(o_k,_) in enumerate(dfa.states()) if o!=idx): if o_key == key or all( v==transitions.get(c,None)==result[g][1].get(c,None) for c,g in zip(transitions.keys(),group) ): group.append((o_key,)) merged_index = min(g[0] for g in group) result[merged_index]=(key,{c:result[min(g)][1][c]for c,_ in group}) minimized_transitions = { str(k):{str(c):str(v)for c,v in t.items()} for k,t in result.items() } initial_state = '0' final_states = {''.join(str(s) for s in f) for f in dfa.final_states} return MinimizedDFA(minimized_transitions,initial_state,final_states) ``` 这段 Python 函数实现了 Hopcroft's algorithm 来最小化 DFA,确保最终获得的是最简形的自动化设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值