编译原理第二版3.4答案

2023-11-12

3.4 节的练习

3.4.1

给出识别练习 3.3.2 中各个正则表达式所描述的语言状态转换图。

解答

解答步骤:NFA -> DFA -> 最少状态的 DFA(状态转换图)

  1. a(a|b)*a

    NFA:

    3 4 1-1-nfa

    DFA:

    NFA DFA a b
    {0} A B
    {1,2,3,5,8} B C D
    {2,3,4,5,7,8,9} C C D
    {2,3,5,6,7,8} D C D

    3 4 1-1-dfa

    最少状态的 DFA(状态转换图):

    合并不可区分的状态 B 和 D

    3 4 1-1

  2. ((ε|a)b*)*

    3 4 1-2

  3. (a|b)*a(a|b)(a|b)

    NFA:

    3 4 1-3-nfa

    DFA:

    NFA DFA a b
    {0,1,2,4,7} A B C
    {1,2,3,4,6,7,8,9,11} B D E
    {1,2,4,5,6,7} C B C
    {1,2,3,4,6,7,8,9,10,11,13,14,16} D F G
    {1,2,4,5,6,7,12,13,14,16} E H I
    {1,2,3,4,6,7,8,9,10,11,13,14,15,16,18} F F G
    {1,2,4,5,6,7,12,13,14,16,17,18} G H I
    {1,2,3,4,6,7,8,9,11,15,18} H D E
    {1,2,4,5,6,7,17,18} I B C

    最少状态的 DFA(状态转换图):

    合并不可区分的状态 A 和 C

    3 4 1-3

  4. a*ba*ba*ba*

    3 4 1-4

3.4.2

给出识别练习 3.3.5 中各个正则表达式所描述语言的状态转换图。

3.4.3

构造下列串的失效函数。

  1. abababaab
  2. aaaaaa
  3. abbaabb
解答

代码详见:src/failure-function.js

  1. [ 0, 0, 1, 2, 3, 4, 5, 1, 2 ]
  2. [ 0, 1, 2, 3, 4, 5 ]
  3. [ 0, 0, 0, 1, 1, 2, 3 ]

3.4.4 !

对 s 进行归纳,证明图 3-19 的算法正确地计算出了失效函数。

图 3-19:计算关键字 b_1b_2…b_n 的失效函数

01  t = 0;
02  f(1) = 0;
03  for (s = 1; s < n; s ++){
04      while( t > 0 && b_s+1 != b_t+1) t = f(t);
05      if(b_s+1 == b_t+1){
06          t = t + 1;
07          f(s + 1) = t;
08      }else{
09          f(s + 1) = 0;
10      }
11  }
证明
  1. 已知 f(1) = 0
  2. 在第 1 次 for 循环时,计算 f(2) 的值,当第5行代码 b_2 == b_1 成立时,代码进入到第7行得出 f(2) = 1,不成立时,则代码进入第9行得出 f(2) = 0。显然,这次循环正确的计算出了 f(2) 。
  3. 假设在第 i-1 次进入循环时,也正确的计算出了 f(i),也有 f(i) = t (无论 t 是大于 0 还是等于 0)
  4. 那么在第 1 次进入循环时,分两种情况进行考虑:
    1. t == 0

      这种情况比较简单,直接从第 5 行开始,当 b_i+1 == b_1 时,f(i+1) = 1,否则 f(i+1) = 0

    2. t > 0
      while 循环会不断缩小 t 值,试图找出最大可能的使得 b_i+1 == b_t+1 成立的 t 值,如果找到了,则进入第 5 行执行,得到 f(i+1) = t+1;或者直到 t == 0 时也没有找到,则跳出循环,这时进入第 5 行执行,过程类似于前一种情况。

3.4.5 !!

说明图 3-19 中的第 4 行的复制语句 t = f(t) 最多被执行 n 次。进而说明整个算法的时间复杂度是 O(n),其中 n 是关键字长度。

解答

详见 matrix 的博文 KMP算法详解

3.4.6

应用 KMP 算法判断关键字 ababaa 是否为下面字符串的子串:

  1. abababaab
  2. abababbaa
解答

代码详见:src/failure-function.js

  1. true
  2. false

3.4.7 !!

说明图 3-20 中的算法可以正确的表示输入关键字是否为一个给定字符串的子串。

图 3-20:KMP 算法在 O(m + n) 的时间内检测字符串a_1a_3…a_n 中是否包含单个关键字 b1b2…bn

s = 0;
for(i = 1; i <= m; i ++){
    while(s > 0 && a_i != b_s+1) s = f(s);
    if(a_i == b_s+1) s = s + 1;
    if(s == n) return "yes";
}
return "no";

3.4.8

假设已经计算得到函数 f 且他的值存储在一个以 s 为下标的数字中,说明图 3-20 中算法的时间复杂度为 O(m + n)。

解答

详见 matrix 的博文 KMP算法详解

3.4.9

Fibonacci 字符串的定义如下:

  1. s1 = b
  2. s2 = a
  3. 当 k > 2 时, sk = sk-1 sk-2

例如:s3 = ab, s4 = aba, s5 = abaab

  1. sn 的长度是多少?
  2. 构造 s6 的失效函数。
  3. 构造 s7 的失效函数。
  4. !! 说明任何 sn 的失效函数都可以被表示为:f(1) = f(2) = 0,且对于 2 < j <= |sn|, f(j) = j - |sk-1|,其中 k 是使得 |sk| <= j + 1 的最大整数。
  5. !! 在 KMP 算法中,当我们试图确定关键字 sk 是否出现在字符串 sk+1 中,最多会连续多少次调用失效函数?
解答
  1. 维基百科

  2. s6 = abaababa

    failure = [ 0, 0, 1, 1, 2, 3, 2, 3 ]

  3. s7 = abaababaabaab

    failure = [ 0, 0, 1, 1, 2, 3, 2, 3, 4, 5, 6, 4, 5 ]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理第二版3.4答案 的相关文章

  • SHELL入门学习

    SHELL SHELL 入门学习 shell 变量 shell echo shell printf shell test shell if then shell While shell function SHELL 入门学习 shell 变
  • 1.[springMvc]Servlet的基础知识

    Servlet的基础知识 servlet是啥 Servlet运行流程 示例 Servlet GenericServlet HttpServlet ServletContext Filter servlet映射器 servlet是啥 Java
  • 联合概率、边际概率、条件概率

    一时忘了联合概率 边际概率 条件概率是怎么回事 回头看看 某离散分布 联合概率 边际概率 条件概率的关系 其中 Pr X x Y y 为 XY的联合概率 Pr X x 为 X的边际概率 Pr X x Y y 为 X基于Y的条件概率 Pr Y
  • Openwrt编译报错 TCP Fast Open is not available for client mode 的解决办法

    报错信息 configure error TCP Fast Open is not available for client mode please rerun without enable tfo client gmake 3 Makef
  • Python安装教程步骤2:Windows中创建虚拟环境安装Pytorch并在PyCharm中配置虚拟环境

    python安装教程步骤2 windows中Anaconda创建虚拟环境安装pytorch并在pycharm中使用虚拟环境 作者介绍 windows中Anaconda创建虚拟环境安装pytorch 1 添加镜像源 2 创建虚拟环境 3 进入
  • ubuntu16.04详细安装pytorch(GPU)

    安装pytorch要安装两个模块 torch和torchvision torch是主模块 用来搭建神经网络 torchvision是辅模块 里面有搭建好的网络可以直接用 1 安装pip3 ubuntu自带python3 5和2 7 所以没装
  • linux 设置静态 ip 或者 修改 DNS

    设置 linux 静态 ip 或者 添加DNS preface 操作步骤 1 执行命令 nmtui 2 确认设置是否成功 supplements 3 1 linux 中 子网掩码的表示 3 2 DNS 和 ip 设置 3 3 DHCP 协议
  • Ribbon负载均衡(一)Ribbon实战

    Ribbon实战 文章目录 Ribbon实战 1 注册中心 1 1 服务注册到注册中心 1 2 服务注册列表Ribbon负载均衡选取相应节点 2 负载均衡方案 2 1 集中式负载均衡 2 2 进程内聚在均衡 3 Ribbon实践 3 1 配
  • Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习 14 球机云台控制PTZ 文章目录 Onvif协议学习 14 球机云台控制PTZ 一 介绍 二 代码实现 八个方向 放下及缩小控制 聚焦控制 原文链接 https blog csdn net u013566528 art
  • 步进电机原理及驱动

    这里把步进电机的资料做个整合 文章目录 步进电机是什么 原理 定子 定子的种类 转子及其种类 工作方式 单拍方式 双拍方式 单双拍方式 通电方式 驱动器 驱动程序 步进电机是什么 什么是步进电机 步进电机是将电脉冲信号 转变为角位移或线位移
  • Nginx概念及应用

    Nginx 一 反向代理 概念 反向代理服务器位于用户与目标服务器之间 但是对于用户而言 反向代理服务器就相当于目标服务器 即用户直接访问反向代理服务器就可以获得目标服务器的资源 同时 用户不需要知道目标服务器的地址 也无需在用户端做任何设

随机推荐

  • 2023年2月浙江省中小企业协会与各专委会大事记

    1 1月13日上午 协会领导蔡章生带队走访国家绿色技术交易中心 调研绿色技术创新工作 与国家绿色技术交易中心副主任贺沛宇 中教能源研究院黄刚院长 线上视频参会 项目主管郦剑飞等进行座谈 研究推进 双碳 产业 EATNS碳管理体系建设以及节能
  • 计算机网络知识点总结——第二章物理层

    第二章 物理层 一 概述 重点概念 二 数据通信 一 数据模型 二 数据通信相关术语 三 三种通信方式 四 数据传输方式 五 同步传输 异步传输 六 小节脑图 七 码元 八 数字通信系统数据传输速率 码元传输速率 码元速率 波形速率 调制速
  • 知识体系之MySQL

    目录 前言 1 一条select是怎么执行的 1 1 连接器 1 1 1 连接器的工作 1 1 2 长 短连接 1 2 查询缓存 1 3 解析器 1 4 执行SQL 1 4 1 预处理器 1 4 2 优化器 1 4 3 执行器 2 一条up
  • mysql有numeric类型吗_mysql数值类型 - numeric

    本文介绍php出现Warning A non numeric value encountered问题 用实例分析出现这种错误的原因 并提供避免及解决问题的方法
  • Codeforces 1634 F. Fibonacci Additions —— 斐波那契数列加,想法

    This way 题意 给你长度为n的数组a和数组b 每次会有一个操作 x l r 如果x是A表示在数组a上进行操作 否则是b l r表示将区间 l r 的数一一对应加上斐波那契数列 1 r l 1 的数 问你最后a和b是否相等 题解 斐波
  • 【建议收藏】新到手的电脑Windows10/11系统优化、使用规范和技巧及软件推荐,提升范电脑性能和体验

    目录 一 了解电脑 1 查看电脑和系统的基本信息 2 电脑测评 二 Windows10 11系统优化及设置 1 控制面板 回收站等桌面图标显示设置 2 任务栏管理 3 桌面图标排列 4 卸载程序 5 关闭P2P分享 传递优化 6 电设置脑为
  • SSTI 绕过方法总结

    SSTI 绕过方法总结 学习绕过的重点是掌握一个技术的使用方法 这其中的许多方法 看起来好像就那样 但是实验起来 就会发现哪哪都碰壁 针对不同的过滤情况 我们可以先构造一个常规的 payload 然后再根据实际情况进行改造绕过 这个常规 p
  • 数字化升级里,RPA的下一步正在走向哪?

    如果说 API这种能力在2021年并未成为 刚需 那么在2022年其已经一跃成为RPA进入企业真正场景的 必需品 作者 斗斗 编辑 皮爷 出品 产业家 今年八月 调查机构Gartner发布了2022全球RPA魔力象限 数据显示 2021年
  • 科学实验中剔除坏值的方法--肖维勒准则法

    def Chauvenet v c 5 1 65 6 1 73 7 1 8 8 1 86 9 1 92 10 1 96 11 2 12 2 03 n len v ave getAve v stdDev getStdDev v if len
  • mac的find命令

    在mac上使用find查找某个文件夹下面的所有 md文件 find name md 在mac上报如下错误 find illegal option n 在stackoverflow上找到了答案 https stackoverflow com
  • DBus研究笔记(一)

    一 建立连接 要使用DBus进行通信必须首先与系统建立连接 并申请一个 域名 使得其他应用可以找到你 常用DBusConnection dbus bus get DBusBusType DBusError 系列函数来与bus daemon建
  • 关于C++中constexpr的用法

    在C 11 primer中 关于constexpr用法给出的解释是 允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式 声明为constexpr的变量一定是一个常量 而且必须用常量表达式初始化 第一句中 c
  • 冬来春往

    二月 我回来了 黄昏与日落 高山与河流 城镇与村庄 冷风 我感觉到了你透过车窗缝隙那透心凉的滋润 随着二月而来 又伴三月而去 二月 你游戏了我春去冬来的过往 如候鸟一般 俯瞰天南地北 归去来兮 候鸟 你是一种循着春节轻装上阵飞翔的姿态 天空
  • Java获取文本文件字符编码的两种方法

    Java判断文本文件字符编码的两种方法 1 通过文件流的前面部分字节判断 2 通过cpdetector库提供的监听方法来判断 1 取文件流方式 public static String codeString String fileName
  • 阿里云oss使用教程

    一 准备工作 1 点击 注册账号账号 输入用户名 密码 手机号 2 实名阿里云账号 点击跳到个人中心 对阿里云账号进行实名 这里我建议选择企业实名 3 购买阿里云OSS 打开OSS入口 选择 OSS资源包 地区 中国大陆 标准 本地冗余存储
  • jeesite框架下获取当前登录人的部门编号部门名称以及姓名:

    部门编号 String dept StringUtils isNotBlank EmpUtils getOffice getOfficeCode EmpUtils getOffice getOfficeCode 部门名称String dep
  • 第十二讲:生成树概念及STP技术应用

    在传统的交换网络中 设备通过单条链路进行连接 当某一个点或是某一个链路发生故障时可能导致网络无法访问 解决这种问题的办法是在网络中提供冗余链路 但是交换机网络中的冗余链路会产生广播风暴 MAC地址失效等现象 最终出现的结果就是网络瘫痪 为避
  • 如何一眼分辨是C还是C++

    C语言的历史 C语言是由贝尔实验室的Dennis Ritchie在20世纪70年代初开发的一种通用程序设计语言 在早期的计算机时代 许多计算机使用不同的汇编语言编写程序 这导致了程序的可移植性和代码的可重用性很低 因此 Dennis Rit
  • markdown模板(个人使用)

    头部1 博客标签规定 文章目录 一 常用可以内嵌的HTML标签 一 标题 知识点 知识点 二 图片 三 字体 五 表格 六 锚链接 七 Typora中的技巧 一 常用可以内嵌的HTML标签
  • 编译原理第二版3.4答案

    3 4 节的练习 3 4 1 给出识别练习 3 3 2 中各个正则表达式所描述的语言状态转换图 解答 解答步骤 NFA gt DFA gt 最少状态的 DFA 状态转换图 a a b a NFA DFA NFA DFA a b 0 A B