DFA最小化

題目

(1)準備3個以上測試DFA文件。(提示:其中一定要有沒有最小化的DFA)
(2)用C或C++語言編寫用等價劃分法最小化DFA的程序。
(3)經測試無誤。測試不易。可求出兩個DFA的語言集合的某個子集(如長度小於某個N),再證實兩個語言集合完全相同!

關鍵代碼

void spolit(int x,int &flag0,int &flag,vector<Table> D,string F){
	char ss;
	for(int m=0;m<flag0;m++) 
    { 
      for(int i=0;i<part[m].length();i++) 
	  { 
        ss=change(part[m][i],F[x],D);
        for(int j=0;j<flag;j++) 
        { 
          if(belong(ss,part[j])){
          	part0[j]=part0[j]+part[m][i];	
          }
          if(ss=='&')  
          { 
            part0[flag]=part0[flag]+part[m][i];
            break;  
          }  
        }  
      }
	    
      for(int j=0;j<=flag;j++) 
      { 
        if(part0[j]!=""&&part0[j]!=part[m]) 
        { 
          part[flag++]=part0[j]; 
          part0[j]=""; 
          part[m]="";  
        }
	    else part0[j]="";  
      }  
    }  
   flag0=flag;  
}
//分割子集法進行DFA的最小化
int hopcraft(vector<Table> D,string F) 
{  
   int flag=2,flag0; 
   int x=F.length(); 
   flag0=flag;  
   while(x--) 
   { 
     spolit(x,flag0,flag,D,F);
   }  
   return flag;  
}  

輸入輸出結果

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章