《计算复杂性:现代方法》——1.2 图灵机

简介:

本节书摘来自华章计算机《计算复杂性:现代方法》一书中的第1章,第1.2节,作者 [美]桑杰夫·阿罗拉(Sanjeev Arora),博阿兹·巴拉克(Boaz Barak),译 骆吉洲,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.2 图灵机\

screenshot

screenshot

演草纸

演草纸包含k条带,每条带均由单向无限延伸的很多单元构成,每个单元能够存储称为机器的字母表的有限集Γ中的一个符号。每条带均有一个带头,它具有在带上每次读或写一个符号的能力。机器的计算划分为一系列离散的时间步骤,带头在每个步骤中能够向左或向右移动一个单元。

机器的第一条带是输入带,其带头只能从该带上读取符号而不能写符号,因此这是一条只读带。另外的k-1条读写带称为工作带,其中最后一条带是输出带,机器在计算终止前把最终计算结果写在输出带上。

图灵机还允许使用随机访问存储器。然而,已经证明,图灵机的这种变形与标准的图灵机具有相同的计算能力(参见习题1.9)。

有限操作/规则集

图灵机有有限种状态,表示为Q。机器有一个“寄存器”,它能够在任何时刻记录机器处于Q中的何种“状态”。状态确定了机器在下一个计算步骤要采取的动作,包括:(1)直接读取k个带头所在存储单元的符号;(2)在k-1条读写带上,将带头所在存储单元的符号替换为新的符号(也可以通过再次写下原来的符号而不改变带);(3)修改寄存器使其记录来自有限集Q中的另一种状态(状态也可以保持不变,这只需选择与之前相同的状态);(4)将每个带头向左或向右移动一个单元(或保持不动)。

图灵机可以看成是现代计算机的简化,它的带是计算机的内存,而转移函数和寄存器则是计算机的中央处理器(CPU)。虽然如此,但最好还是将图灵机视为描述算法的一种简单的形式化方法。尽管描述算法的最佳方法是用白话,但这种形式化的描述方法将有助于对算法的数学分析(与此类似,用程序设计语言描述算法则是为了在计算机上执行算法)。

形式定义

screenshot

screenshot

screenshot

1.将输入复制到读写工作带上;

2.将输入带带头移动到输入的开始位置;

3.输入带带头向右移动,而工作带带头向左移动。如果机器在带头移动过程的任何时刻发现了两个不同的值,则停机并输出0。

4.停机并输出1。

screenshot

显然,完整地描述一个图灵机非常繁琐,但却并不是总能提供更多的信息。尽管如此,你自己构造一两个完整的图灵机也是十分有益的(见习题1.1)。本书其余部分将不再像上例一样给出每个图灵机的每个细节,而将在更高的层次上描述图灵机。对于具备了部分编程经验的读者,例1.2将使他们(至少在原理上)了解到如何构造图灵机来求解通过编程能解决的各种计算任务。

1.2.1 图灵机的表达能力

我们的第一印象是,图灵机是否概括了关于计算的直觉概念还不甚明了。读者最好能自己做一些简单的练习14,比如将加法和乘法的标准算法用图灵机表示出来以完成相应的函数计算(参见习题1.1),这必将大有裨益。做完这样的练习,就可以考虑下面的例子,把你用熟悉的编程语言编写的程序转换为图灵机。(反之,大多数编程语言也能模拟图灵机。)

例1.2(用图灵机模拟一般编程语言) 本例需要关于计算的一些背景知识。我们概略地说明如何把用熟悉的编程语言(如C和Java)编写的程序转换为等价的图灵机。首先,用编程语言编写的程序可以(用编译技术)翻译成用机器语言表示的程序,也就是一个指令序列,每个指令均是如下的几种简单操作之一:(a)从内存读取数据放入一个寄存器中,寄存器的个数是有限的;(b)把某个寄存器中的数据写入内存;(c)将某两个寄存器的值相加后将结果存入第三个寄存器;(d)将某两个寄存器的值相乘后将结果存入第三个寄存器。所有这些操作均可以很容易地被图灵机模拟。内存和寄存器可以实现为图灵机的带,而指令则实现为图灵机的转移函数。例如,不难实现将两数相加或相乘的图灵机。2带图灵机可以用来模拟计算机内存,它用一条带表示被模拟的内存,另一条带则用来实现二进制到一进制的转换。这样,对每个用二进制表示的数i,图灵机可以借助第二条带将i转换成一进制,再据此读取或修改第一条带上的第i个位置的值。我们将上述过程的细节留作习题1.8。

练习1.10要求为定制的程序设计语言严格地证明上述模拟。

相关文章
|
7月前
|
数据可视化 数据挖掘 数据建模
数据可视化工具大比拼:从Tableau到Power BI,谁才是你的最佳拍档?
数据可视化工具大比拼:从Tableau到Power BI,谁才是你的最佳拍档?
1031 12
|
Ubuntu Linux
【Ubuntu18.04 解决蓝牙wifi 之ax201无线网卡驱动安装】
【Ubuntu18.04 解决蓝牙wifi 之ax201无线网卡驱动安装】
3569 0
|
存储 开发框架 JavaScript
深入探讨Flutter中动态UI构建的原理、方法以及数据驱动视图的实现技巧
【6月更文挑战第11天】Flutter是高效的跨平台移动开发框架,以其热重载、高性能渲染和丰富组件库著称。本文探讨了Flutter中动态UI构建原理与数据驱动视图的实现。动态UI基于Widget树模型,状态变化触发UI更新。状态管理是关键,Flutter提供StatefulWidget、Provider、Redux等方式。使用ListView等可滚动组件和StreamBuilder等流式组件实现数据驱动视图的自动更新。响应式布局确保UI在不同设备上的适应性。Flutter为开发者构建动态、用户友好的界面提供了强大支持。
295 2
|
机器学习/深度学习 存储 数据可视化
特征选择的艺术:利用Scikit-learn提升模型性能
【7月更文第22天】在机器学习的实践中,特征选择是一项至关重要的步骤,它直接影响到模型的性能、训练速度以及对新数据的泛化能力。特征选择,或称为变量选择,旨在从原始特征集中识别并保留最相关、最有影响力的特征子集,同时剔除冗余或无关紧要的特征。本文将探讨特征选择的重要性,并通过使用Python中的Scikit-learn库演示几种有效的特征选择方法,以提升模型性能。
801 4
|
传感器 监控 安全
|
API C# 图形学
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
378 1
|
存储 NoSQL Java
Spring Boot与Neo4j图数据库的集成应用
Spring Boot与Neo4j图数据库的集成应用
|
Java Android开发
Eclipse设置内存大小
Eclipse设置内存大小
534 0
|
机器学习/深度学习 并行计算 计算机视觉
Shunted Self-Attention | 源于 PvT又高于PvT,解决小目标问题的ViT方法(一)
Shunted Self-Attention | 源于 PvT又高于PvT,解决小目标问题的ViT方法(一)
420 0
|
SQL 关系型数据库 MySQL
Docker下Nacos持久化配置
在Docker环境下,实战将Nacos的所有数据从嵌入式数据库改为MySql存储
1044 1
Docker下Nacos持久化配置