DFA to MFA

news/2024/10/20 13:46:02/

DFA化简步骤

  1.   将DFA状态集分为结束状态集F和非结束状态集S。F为DFA结束状态,S为结束状态以外的所有其它DFA状态。F和S构成状态集G;
  2.   对G的每个子集T,对子集T的每个状态S执行move(S, a)得到状态S_{1},找到状态S_{1}所属G的子集T_{1},根据T_{1}将子集T划分为n个子集;
  3.   重复2直到不能再划分子集;
  4.   对G中状态个数大于一的子集T,只保留一个状态,去掉T多余的状态。
private NFAToDFA dfa;public IEnumerable<int[]> DFA2MFA()
{var states = new List<int[]>();//dfa结束状态集和非结束状态集var allStates = Enumerable.Range(0, dfa.DFA.GetLength(0)).ToArray();var acceptStates = dfa.FinalStates;var nonAcceptStates = (from state in allStateswhere !acceptStates.Contains(state)select state).ToArray();states.Add(nonAcceptStates);states.Add(acceptStates);var compared = new List<int[]>(states);while (true){foreach(var item in states){if (item.Length < 2) continue;for (var i = 0; i < Transitions.Length; ++i){var groups = (from state in itemgroup state by states.FindIndex(array => array.Contains(dfa.DFA[state, i])) into gselect g).ToArray();if (groups.Length < 2) continue;var removeds = (from array in groupsfrom removed in arrayselect removed).ToArray();compared.RemoveAll(array => array.Any(state => removed.Contains(state)));foreach(var group in groups)compared.Add(group.ToArray());}}if (Equal(states, compared)) break;states.Clear();states.AddRange(compared);}return states;
}

MFA 代码

public class DFAToMFA
{public int[,] MFA { get; private set; }public int InitialState { get; private set; }public int[] FinalStates { get; private set; }public char[] InputChars { get; private set; }private NFAToDFA dfa;public DFAToMFA(NFAToDFA dfa){this.dfa = dfa;this.InputChars = dfa.InputChars;}public IEnumerable<int[]> DFA2MFA(){var states = new List<int[]>();//dfa结束状态集和非结束状态集var allStates = Enumerable.Range(0, dfa.DFA.GetLength(0)).ToArray();var acceptStates = dfa.FinalStates;var nonAcceptStates = (from state in allStateswhere !acceptStates.Contains(state)select state).ToArray();states.Add(nonAcceptStates);states.Add(acceptStates);var compared = new List<int[]>(states);while (true){foreach(var item in states){if (item.Length < 2) continue;for (var i = 0; i < InputChars.Length; ++i){var groups = (from state in itemgroup state by states.FindIndex(array => array.Contains(dfa.DFA[state, i])) into gselect g).ToArray();if (groups.Length < 2) continue;var removeds = (from array in groupsfrom removed in arrayselect removed).ToArray();compared.RemoveAll(array => array.Any(state => removeds.Contains(state)));foreach(var group in groups)compared.Add(group.ToArray());}}if (Equal(states, compared)) break;states.Clear();states.AddRange(compared);}states = (from state in statesorderby state.Min()select state).ToList();//initialize initial & final statesInitialState = states.FindIndex(state => state.Contains(dfa.InitialState));FinalStates = (from final in dfa.FinalStatesselect states.FindIndex(state => state.Contains(final))).Distinct().ToArray();Debug.WriteLine($"MFA Initial State:\t{InitialState}");Debug.WriteLine($"MFA Fnitial State:\t{string.Join(" ", FinalStates)}");CreateMFATable(states);PrintMFATable();return states;}private bool Equal([DisallowNull]IEnumerable<IEnumerable<int>> left, [DisallowNull]IEnumerable<IEnumerable<int>> right){if (left.Count() == 0 && right.Count() == 0) return true;if (left.Count() != right.Count()) return false;foreach (var element in left){var exist = right.Any(item => Enumerable.SequenceEqual(item, element));if (!exist) return false;}foreach (var element in right){var exist = left.Any(item => Enumerable.SequenceEqual(item, element));if (!exist) return false;}return true;}private void CreateMFATable(List<int[]> states){MFA = new int[states.Count(), InputChars.Length];for (var i = 0; i < MFA.GetLength(0); ++i){var state = states[i].Min();for (var j = 0; j < MFA.GetLength(1); ++j){var dfastate = dfa.DFA[state, j];MFA[i, j] = dfastate < 0? dfastate: states.FindIndex(array => array.Contains(dfastate));}}}private void PrintMFATable(){Debug.WriteLine("\nMFA Table");for (var i = 0; i < InputChars.Length; ++i)Debug.Write($"\t{InputChars[i]}");Debug.WriteLine("");for (var i = 0; i < MFA.GetLength(0); ++i){Debug.Write(i);for (var j = 0; j < MFA.GetLength(1); ++j){Debug.Write("\t");if (MFA[i, j] >= 0)Debug.Write($"{MFA[i, j]}");}Debug.WriteLine("");}}}

测试

[TestMethod]
public void DFA2MFATest()
{var regex = "(a|b)*abb";var regexDoted = UseDotForConcatenation(regex);var regexPostfix = InfixToPostfix(regexDoted);var enfa = new RegexToENFA();enfa.Regex2ENFA(regexPostfix);Debug.WriteLine("");var dfa = new NFAToDFA(enfa);var query = from array in dfa.ENFA2DFA()select $"{string.Join(" ", array)}";Debug.WriteLine("\nDFA States");Debug.WriteLine(string.Join(Environment.NewLine, query));Debug.WriteLine("");var mfa = new DFAToMFA(dfa);query = from array in mfa.DFA2MFA()select $"{string.Join(" ", array)}";Debug.WriteLine("\nMFA States");Debug.WriteLine(string.Join(Environment.NewLine, query));
}输出如下:ENFA Initial State:	6
ENFA Final State:	13ENFA Tablea	b	ε
0	1		
1			5
2		3	
3			5
4			0 2
5			4 7
6			4 7
7			8
8	9		
9			10
10		11	
11			12
12		13	
13			DFA Initial State:	0
DFA Final States:	4DFA Tablea	b
0	1	2
1	1	3
2	1	2
3	1	4
4	1	2DFA States
6 4 7 8 0 2
9 1 5 4 7 8 0 2 10
3 5 4 7 8 0 2
3 11 12 5 4 7 8 0 2
13 3 5 4 7 8 0 2MFA Initial State:	0
MFA Final State:	3MFA Tablea	b
0	1	0
1	1	2
2	1	3
3	1	0MFA States
0 2
1
3
4
(a|b)*abb NFA
(a|b)*abb DFA
(a|b)*abb mini DFA​​​​​

 


http://www.ppmy.cn/news/306904.html

相关文章

NFA/DFA

1、问题概述 随着计算机语言的结构越来越复杂&#xff0c;为了开发优秀的编译器&#xff0c;人们已经渐渐感到将词 法分析独立出来做研究的重要性。不过词法分析器的作用却不限于此。回想一下我们的老师刚刚开始向我们讲述程序设计的时候&#xff0c;总是会出一道题目&#xf…

什么是AMF?AMF0和AMF3

最近由于工作需求&#xff0c;对amf做了一些了解&#xff0c;此前对flash相关的技术用的太少&#xff0c;以至于n年前提出来的amf协议都不曾过耳。。 – -# 以下是关于amf的一篇文章。 Flash Remoting的核心技术——AMFAMF是什么&#xff1f;它的优点中是什么&#xff1f;Fla…

NFA 和 DFA

作为前端大佬的你&#xff0c;想必对于 JavaScript 的正则表达式非常熟悉了&#xff0c;甚至随手就能利用正则表达式写出一些惊世骇俗的代码。只是不知道你是否有和我一样的疑惑&#xff1a;正则表达式是怎么执行的呢&#xff1f; 我们写下这样的正则表达式 (a|b)c&#xff0c;…

AMF简介

简介&#xff1a; AMF是Adobe独家开发出来的通信协议&#xff0c;它采用二进制压缩&#xff0c;序列化、反序列化、传输数据&#xff0c;从而为Flash播放器与Flash Remoting网关通信提供了一种轻量级的、高效能的通信方式。 AMF最大的特色在于可直接将Flash内置对象&#xff…

DFMEA \FTA

系统FMEA的范围&#xff1a;我们设计的模块系统可以看作是由内部的各个子系统组成的。对于我们的模块来说&#xff0c;系统FMEA要确保组成系统的各子系统间的所有接口和交互作用以及我们的模块系统和其他系统之间的交互。 子系统FMEA的范围&#xff1a;子系统FMEA是系统模块的组…

AFL入门介绍

1、AFL简介 AFL&#xff08;American Fuzzy Lop&#xff09;是由安全研究员Michał Zalewski&#xff08;lcamtuf&#xff09;开发的一款基于覆盖引导&#xff08;Coverage-guided&#xff09;的模糊测试工具&#xff0c;它通过记录输入样本的代码覆盖率&#xff0c;从而调整输…

MFU(Mask Field Utilization)

先验知识&#xff1a;通常12寸晶圆为300mm直径圆形&#xff0c;Mask最大为26mm x 33mm矩形。 MFU就是光刻掩膜版有效利用比例。实际mask size die_area x N scribe_line_area, N是一张mask内die数量&#xff0c;受限于scanner(推测是曝光的机器)&#xff0c;mask尺寸最大可以…

FM、FFM和AFM比较

FM的产生背景&#xff1a; 为了改进SVM在解决稀疏矩阵问题方面的缺点&#xff1a;当数据非常稀疏时&#xff0c;SVM不能从复杂的核空间学到可靠的参数。可用于线性回归、分类等。 解决问题实例&#xff1a; 从下图所示数据从特征向量x学习一个模型用于预测y值 FM模型方程&…