do_while_true

一言(ヒトコト)

dfa 最小化的一个丐版实现

https://shanlunjiajian.github.io/2023/05/21/dfa-tech/

好像是叫 moore 算法,一个 vector 代表一个等价类,col 是所属等价类,这个是初始的时候 accept 状态放在一个等价类里,reject 状态放在一个等价类里,其余状态放在一个等价类里。对每种出边检查同一等价类的此类出边是否指向了不同等价类,根据指向的等价类的不同进行分裂。

	while(1){
		int lac=cct;
		for(int o=0;o<m;o++){
			for(int i=1;i<=lac;i++)if(vec[i].size()>1){
				int tmp=cct;
				for(auto j:vec[i]){
					int go=col[tr[j][o]];
					if(!vis[go])
						vis[go]=++cct;
					vec[vis[go]].pb(j);
				}
				for(auto j:vec[i])vis[col[tr[j][o]]]=0;
				vi().swap(vec[i]);
				swap(vec[i],vec[cct]);--cct;
				for(auto j:vec[i])col[j]=i;
				for(int t=tmp+1;t<=cct;t++)
					for(auto j:vec[t])
						col[j]=t;
			}
		}
		if(cct==lac)break;
	}
posted @ 2023-10-09 20:43  do_while_true  阅读(66)  评论(0编辑  收藏  举报