对于给定的DFA    M,寻找一个状态数比M小的DFA    M'使得L(M)=L(M') 1.状态的等价性: 假设s和t为M的两个状态 ①若分别从状态s和状态t出发都能读出某个字α而停止于终态,则称s和t等价 ②存在一个字α,使得s和t一个读出α停止于终态,另一个读出α停止于非终态,则称s和t可区别 2.基本思想: ①把M的状态集分为一些不相交的子集,使任何两个不同子集状态是可区别的,而同一子集的任何两个状态是等价的 ②让每个子集选出一个代表,同时消去其他状态 3.划分 ①把S划分为终态和非…
有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能. PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔... 思路: 1:制作一个由一个小图标组成的,可点击,可拖动,背景透明的Widget 2:重载主窗口(在此例子中是QLabel)的changeEvent(详情见代码) 截图:(浅绿色的部分是桌面背景) 主窗体: 小浮标: 代码: #include <QtGui> #include <Windows.…
一 最大化 二 最小化 三 关闭 四 点击任务栏隐藏显示 五 点击鼠标左键移动窗体 六 阴影效果鼠标左键移动窗口 #region UI设置 最大化.最小化.关闭.鼠标移动窗口.点击任务栏切换窗口 this.pnlMin.MouseHover += new EventHandler(pnlMin_MouseMove);//最小化按钮的鼠标经过样式改变事件 this.pnlMin.MouseLeave += new EventHandler(pnlMin_MouseLeave);//最小化按钮的鼠标…
  整体的步骤是三步: 一,先把正规式转换为NFA(非确定有穷自动机), 二,在把NFA通过"子集构造法"转化为DFA, 三,在把DFA通过"分割法"进行最小化. 一步很简单,就是反复运用下图的规则,图1 这样就能转换到NFA了. 给出一个例题,来自Google book.本文主要根据这个例题来讲,图2 二.子集构造法. 同样的例题,把转换好的NFA确定化,图3 这个表是从NFA到DFA的时候必须要用到的.第一列第一行I的意思是从NFA的起始节点经过任意个ε所能到达…
正规式-->最小化DFA 1.先把正则式-->NFA(非确定有穷自动机) 涉及一系列分解规则 2.再把NFA通过"子集构造法"-->DFA 通过子集构造法将NFA转化为DFA 将表里的变量名用比较简单的符号代替(最好是在进行构造的时候顺手在草稿纸上标记好,方便后面的工作) 对照上面的表,画出DFA的状态转换图 图中0,1,2,3,4,5都是终态,因为他们的集合里都包含了最初的终态"数字9". 3.再把DFA通过"分割法"进行最小…
NDFA.εNDFA 确定化的细节这里就不总结了,这里说一说DFA最小化的算法. 关于DFA最小化,…
上个版本测试的时候,只用了两个非常简单的测试用例,所以好多情况有问题却没有测试出来 bug1:在生成diff_matrix的时候,循环变量少循环了一次,导致最后一个节点在如果无法与其他点合并的情况下,程序不会给他生成一个群标号. 修改:把循环变量那里加上等于号 bug2:在遍历群的时候,程序是以碰到空指针为结束的,但是在malloc内存的时候,系统并不为这个内存初始化为0,而是0xcd,所以以是不是空指针来判断边界是不可行的,会造成错误,导致读取了而外的信息. 修改:在遍历群的时候,直接以群的数…
采取的方法是hopcroft的填表法,详情见如下代码 #include "nfa_to_dfa.h" int* dfa_diff_matrix; int mini_dfa_number;//这个是最小化的 dfa表的索引 typedef struct _min_dfa_node { pdfa_edge begin; int is_end;//记录是否是接受节点 }min_dfa_node,*pmin_dfa_node; min_dfa_node mini_dfa_table[];//设…
关于编译原理最小化的操作,专业术语请移步至:http://www.360doc.com/content/18/0601/21/11962419_758841916.shtml 这里只是记录一下个人的理解,以备复习使用 DFA最小化的操作步骤: 1.将DFA未最小化前的状态划分为:终态和非终态 终态就是包含了NFA终点结点的状态集合,如下图的NFA,状态10为NFA的终点,所以在DFA的状态集合中,包含了10这个状态的集合就是DFA的终态,那么,不包含的就是非终态了 值得一提的是,在DFA划分非终…
首先是未化简DFA的转换表 NFA状态 DFA状态 a b {0,1,2,4,7} A B C {1,2,3,4,6,7,8} B B D {1,2,4,5,6,7} C B C {1,2,4,5,6,7,9} D B E {1,2,4,5,6,7,10} E B C 首先根据分为非接受状态组和接受状态组{A,B,C,D}和{E}. 通过输入a来分组,发现第一组无法区分,看输入b的情况,A,B,C都是转到第一组,只有D是转到第二组E,所以这里就可以分出来一组D,现在有3组,{A,B,C},{D}…