第十七章 计算理论

第十七章 计算理论

  • 首先介绍一种语言,称为简单语言,通过它可以看到计算机解决任何问题所需要的最少语句是三条
  • 介绍一种称为图灵机的计算机模型,简单语言可以解决的问题也可以通过图灵机解决
  • 证明没有任何程序可以知道另一个程序终止与否
  • A?? B用来测试A是否会终止讨论
  • 算法的复杂性

17.1 简单语言

我们可以仅用三条语句来定义一种语言,它们是:递增语句、递减语句和循环语句

在该语言中,只能使用非负整数数据类型

该语言使用少数的几个符号,如“{”和“}”

17.1.1 递增语句

递增语句:对变量加1,如incr(X)

17.1.2 递减语句

递减语句:对变量减1,如decr(X)

17.1.3 循环语句

循环语句:在变量值不为0时,重复执行一个动作(或一系列动作),如

		while(X) {                          
            decr(X)                         
            Body of the loop 
        } 

17.1.4 简单语言的威力

证明只使用三种语句的简单程序设计语言和现在使用的任何一种复杂语言(如C语言)一样强大

17.2 图灵机

17.2.1 图灵机组成部件

图灵机由三部分组成:磁带、控制器和读/写头

磁带:任何时候只能保存一系列顺序字符,该字符来自计算机所能接收的字符集中

假设图灵机只能接收两个符号:空白(b)和数字1

左边的空白b定义整数的开始,右边空白b定义整数的结束

假设磁带处理一元算术中的正整数,在一元算术中,正整数仅由1组成,如整数4表示为1111(4个1),7表示为1111111,没有1的地方表示0

读/写头:任何时刻总是指向磁带上的一个符号,我们称这个符号为当前符号,读/写头每次在磁带上读写一个符号。每读写完一次后,它向左移、向右移。读、写和移动都是在控制器的指令下进行的

控制器:是理论上功能作用类似于CPU的一个部件,它是有限状态自动机,即该机器有预定的有限个状态并能根据输入从一个状态转移到另一个状态,但任何时刻它只能处于这些状态中的一种

建立一个每一行代表一个状态和状态转移表

17.2.2 对简单语言的模拟

对简单语言的模拟

递增语句:incr(X)语句的图灵机,控制器有4个状态:从S1到S4,S1:开始状态,S2:右移状态,S3:左移状态,S4:停机状态,如果到达停机状态,机器就停止,没有指令从这个状态开始

incr(X)语句有5条指令

递减语句:decr(X)语句的图灵机,控制器有三个状态,S1、S2、S3,S1:开始状态,S2:检查语句,检查当前符号是1还是b,如果是b,语句进入停机状态,如果下一个符号是1,第二条语句把它改写成b,然后进入停机状态,S3:停机状态

循环语句:为了模拟循环,假定X和循环体处理的数据存储在磁带上,中间以单个空白符号相隔

三个状态S1、S2和S3控制循环,通判断X的值,如果X=0,退出循环

  • 状态MR:把读写头移过在每次重复中在处理数据开始时定义了数据开始位置的空白符号
  • 状态ML:把读写头移过在每次重复中在处理数据结束时定义了X的开始位置的空白符号
  • 状态BS:定义了循环体的开始状态
  • 状态BH:定义了循环体的停机状态

17.2.3 邱奇-图灵论题

如果存在一个能完成一个符号操纵任务的算法,那么也存在一台完成这个任务的图灵机。

17.3 歌德尔数

在计算机科学理论中,一个无符号数能被分配给任何用特定语言编写的程序,通常称为歌德尔数

17.3.1 表示一个程序

17.3.2 翻译一个数字

17.4 停机问题

一个典型的编程问题

我们能编写一个程序来测试任何可以用歌德尔数表示的程序是否会终止?

证明:停机问题是不可解决的

反证法:假设这样的测试程序存在,然后证明它的存在将产生一个矛盾。

  • 第一步

  • 第二步

  • 第三步

17.5 问题的复杂度

在计算机科学领域,一般来说问题可以分为两类

可解问题

  • 多项式问题
  • 非多项式问题

不可解问题:无法用计算机解决的问题无穷无尽,停机问题只是其中一个,要证明一个问题是无法解决的,方法是证明如果它可以解决,那么停机问题也同样可以解决,换句话说,证明一个问题能否解决等同于证明停机问题能否解决

可解问题:对于可解问题,我们关心计算机需要花多长时间去解决一个问题

可解问题的复杂度:衡量一个可解问题复杂度的一个方法是找出计算机运行该程序要执行的运算数量

大O表示法:相对于计算机速度,我们关心的是程序总体的数量级而不是精确的数字,在该表示法中,运算数量表示为输入量的函数,如符号**O(n)**表示有n个输入,执行n次运算,符号O(n的2次方)表示有n个输入,执行n的2次方运算

方法是找出计算机运行该程序要执行的运算数量

大O表示法:相对于计算机速度,我们关心的是程序总体的数量级而不是精确的数字,在该表示法中,运算数量表示为输入量的函数,如符号**O(n)**表示有n个输入,执行n次运算,符号O(n的2次方)表示有n个输入,执行n的2次方运算

[外链图片转存中…(img-Kdey2wPC-1721839892855)]

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值