【计算理论】下推自动机 PDA 及 计算示例
文章目录
一、 下推自动机
1 . 下推自动机 由来 : 下推自动机 ( PDA ) 是在 确定性有限自动机 ( DFA ) 基础上 扩展而来的 ;
2 . 下面是 下推自动机 ( PDA ) 的示意图 :
① 输入字符串 : 将输入的字符写在右侧的带子上 ;
② 开始状态 : 读取指针 ( 读头 ) 开始指向最左端字符 , 此时处于开始状态 ;
③ 启动自动机 , 自动机根据读取的指令进行计算 ;
④ 读取指令 : 每读取一个字符 , 自动机跳转到一个新的状态 , 指针向后移动一个格子 ;
⑤ 自动机停止 : 当读取指针指向输入的最右端 , 此时自动机就停止了 , 此时查看当前状态 , 如果当前是接受状态 , 称自动机接受该字符串 ( 带子上写的字符组成的字符串 ) , 反之 , 自动机不接受该字符串 ;
二、下推自动机 计算过程
1 . 下推自动机 ( PDA ) 提升了自动机计算能力 : 在上述自动机的基础上 , 提升该自动机的计算能力 , 引入一个新的栈结构 ;
栈特点 : ① 后进先出 , ② 存储能力无限 ;
2 . 下推自动机计算有两个部分 , 一个是字符的读取 , 一个是栈内字符的存取 , 栈内只有最上面的字符会被替换 ;
3 . 下推自动机 ( PDA ) 的指令格式 : 该指令包含了 上述讲的两个操作 ;
① 自动机字符读取 : 左侧的
是从带子上读取的字符 ;
② 栈内字符存取操作 :
是需要在栈上进行的操作 , 将栈顶的
取出 , 然后将
放入到栈中 , 相当于在栈中 , 使用
将栈顶的
替换掉 ;
三、下推自动机 计算结果
1 . 下推自动机 ( PDA ) 是否接受字符串 : 将带子上的字符全部读取完毕后 , 此时的状态如果是 接受状态 , 那么带子上的字符组成的字符串就可以被 下推自动机接受 ;
2 . 计算能力 : 下推自动机 ( PDA ) 比 确定性有限自动机 ( DFA ) 多了栈上的操作 , 下推自动机 ( PDA ) 的计算能力比有限自动机 ( DFA ) 计算能力高 ;
3 . 语言识别能力 : 确定性有限自动机 ( DFA ) 是不能识别
语言的 , 但是 下推自动机 ( PDA ) 是可以认识该语言的 ;
四、下推自动机 计算示例
上图的下推自动机有
个状态
;
读取
字符串 , 并给出 下推自动机 计算过程 ;
指令含义 : 当读取
字符后 ,
指的是在栈上的操作 , 从栈内取出
字符 , 向栈内放入一个
字符 , 本质是在栈中使用
替换
字符 ;
1 . 开始状态 是
, 此时读头指向
位置 , 栈内是空的 ;
2 . 开始状态
: 读取
指令 , 读取
字符后 ,
指的是在栈上的操作 , 从栈内拿走
,
是空字符 , 相当于不用拿 , 并将
字符放入栈 , 相当于使用
替换 栈内 空字符
,
字符的作用 : 下推自动机是无法识别栈底的 ,
作用是辅助下推自动机识别栈底元素 , 当下推自动机读取到
时 , 就知道已经读取到栈底了 ;
开始状态 读取字符 操作
, 最终向栈中放入了字符
;
状态跳转 : 此时 自动机状态 跳转到了
状态 ;
3 .
状态 : 读取
指令 , 读取到一个
, 从栈内拿走
, 使用
替换
, 并将该替换后的
放入栈中 ; 相当于在栈中 , 使用
替换
; 之后依然保持
状态不变 ;
状态跳转 : 下推自动机状态 仍保持
状态 ;
4 .
状态 : 再次读取
指令 , 读取到一个
, 从栈内拿走
字符 , 使用
替换
, 并将该替换后的
放入栈中 ; 之后依然保持
状态不变 ;
状态跳转 : 下推自动机状态 仍保持
状态 ;
5 .
状态 , 读取
指令 , 读取到一个
, 从栈中拿走一个
, 并将
放入栈中 ,
是空字符串 , 从栈内拿取放入
栈不变 , 相当于将一个
从栈内拿出 ;
状态跳转 : 下推自动机状态 从
状态跳转到
状态 ;
6 .
状态 : 读取
指令 , 从栈中 , 拿走一个
, 将
放入栈内 , 相当于在栈内使用
空字符 替换
, 操作完成后 , 栈内少一个
;
状态跳转 : 下推自动机状态 仍保持
状态 ;
7 .
状态 , 读头读取到了最右端 , 所有字符都读取完毕 , 此时不需要读取任何字符 , 读取
指令 , 从栈内拿走
, 将
放入栈中 , 跳转到
状态 ;
此时 , 栈清空 , 下推自动机停止计算 ;
是个双圈 , 接受状态 , 说明该下推自动机接受该
字符串 ;
相关文章
- 逆波兰表达式计算
- 全球计算生物学市场规模:2021年为53.5亿美元,复合年增长率21.0%
- 欧盟专家呼吁关注《芯片法案》中的量子计算
- 大数据计算引擎 EasyMR:拥抱开源,引领技术创新
- 【计算理论】自动机 示例 ( 自动机示例 | 自动机表示方式 | 自动机计算流程简介 )
- 【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
- 【计算机网络】数据链路层 : 选择重传协议 SR ( 帧分类 | “发送方“ 确认帧、超时事件 | “接受方“ 接收帧机制 | 滑动窗口长度 | 计算示例 )★
- 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★
- 【计算机网络】网络层 : 无分类编址 CIDR ( 编址发展 | CIDR 优点 | CIDR 相关计算 | 构成超网 | 最长前缀匹配 | 计算示例 )★
- 【计算机网络】网络层 : RIP 协议 ( 路由选择协议分类 | RIP 协议简介 | 信息交换 | 距离向量算法 | 计算示例 )★
- 【Android UI】贝塞尔曲线 ⑦ ( 使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线示例 )
- 【CSS】CSS 特性 ⑤ ( CSS 优先级 | 经典权重计算示例 1 )
- 【CSS3】CSS3 伪元素选择器 ( 伪元素选择器语法简介 | 伪元素选择器权重计算 | 代码示例 )
- Go语言计算函数执行时间
- MySQL计算字符出现次数的实现方法(mysql字符出现次数)
- 北航蔡维德:区块链的新计算基础设施 | CCF-GAIR 2017
- Linux:提高计算效率的高性能操作系统(linux高性能计算)
- 达内 Linux 云计算视频让你瞬间精通云计算技术(达内linux云计算视频)
- Oracle支持的精准微秒级计算(.oracle 毫秒)
- 利用Redis确定槽位的计算方法(计算redis的槽)
- Oracle云计算报告分析驱动与前景(oracle云计算报告)
- 使用Oracle灵活性求和Sum计算(oracle中sum计算)
- Redis过期多线程实现高性能计算(redis过期 多线程)
- ASp.net文本框(TextBox)计算,判断输入的是否是数字
- C语言小程序计算第二天日期示例代码
- SQLSERVER根据地图经纬度计算距离差示例
- c#日期间隔计算示例
- python益智游戏计算汉诺塔问题示例