DFA to MFA

本文详细介绍了DFA的化简步骤,包括如何将DFA状态分为结束状态集和非结束状态集,并通过一系列操作逐步化简。此外,还提供了MFA(等价的多状态有限自动机)的实现代码,并进行了相关测试以验证其正确性。
摘要由CSDN通过智能技术生成

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 allStates
                           where !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 item
                              group state by states.FindIndex(array => array.Contains(dfa.DFA[state, i])) into g
                              select g).ToArray();
                        
                if (groups.Length < 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值