计算复杂性学习2-多带图灵机模拟

上一节用单带图灵机模拟了PAL,其实可以用一种称为多带的图灵机来模拟,就像第一篇文章中介绍的那样,多带图灵机是具有多个读写头的图灵机。

一个k带图灵机可以定义为一个四元组M=(K,Σ,δ,s),其中K,Σ,δ和普通图灵机一样,δ是一个必须反映多带复杂的程序。直观地,和以前一样,δ决定下一个状态,也决定每一串的覆写字符,并通过当前状态和每一根带上的当前字符决定读写头的方向。形式化地,δ是从K×Σ?到(K∪{h,"yes","no"})×(Σ×{←,→,?})k的函数。直观地,δ(q,σ1,...σk)=(p,ρ1,D1,...ρk,Dk)意味着,若M在状态q,并且第一条带上的图写头是σ1,第二条是σ2等,那么下一步的状态是p,并且第一个读写头的将写ρ1,并且按照D1所示的方向移动,其它读写头也是如此,停机时输出可以从最后的第k条带上字符串读出。

我们用一个3带图灵机(即输入带,工作带,输出带)模拟PAL和字母表{?,□,0,1},它如下进行操作:

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

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

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

4.停机并输出1。

下面用更形式化的方法描述改图灵机。图灵机有5种状态,{qstart,qcopy,qleft,qright,qtest,qhalt},其转移函数的定义如下:

1、在开始状态qstart上:输入带带头向右移动,在工作带上写下开始符号,?之后,工作带带头向右移动,机器状态变成qcopy。

2、在qcopy状态:qcopy状态意味进入拷贝输入带字符的状态,如果从输入带上读到的字符不是空白符号□,则输入带和工作带一起向右移动,将输入带的字符依次拷贝到工作带上,机器状态为qcopy

如果从输入带读到的字符是空白符号□,则输入带带头向左移动,工作带带头停留当前位置(不覆写字符),机器进入状态qleft。

3、在状态qleft:

如果从输入带带头读到的字符不是开始字符?,则输入带带头向左移动,工作带带头仍停留在当前位置, 机器停留在qleft状态下;

如果从输入带带头读到的字符是开始字符?,则输入带带头向移动,工作做带带头向左移动(不覆写),机器进入qtest。

4:在状态qtest:如果输入带和工作带读到的符号相同,则输入带带向右移动,工作带带头向左移动,机器状态为qtest;

如果输入带和工作带读到的符号不同,输出带写0,机器进入qhalt;如果到最后输入带移动到□,工作带移动到?,说明是PAL,输出带输出1,机器进入qhalt。

当然可以改进以上步骤,模拟方法也不是唯一的,一步一步的分析图灵机的过程比较繁琐,但是更能加深对图灵机工作的过程。下一节单带图灵机和多带图灵机结合在一起讨论。

时间: 2024-10-08 03:16:07

计算复杂性学习2-多带图灵机模拟的相关文章

【iScroll源码学习00】模拟iScroll

[iScroll源码学习00]模拟iScroll 前言 相信对移动端有了解的朋友对iScroll这个库非常熟悉吧,今天我们就来说下我们移动页面的iScroll化 iScroll是我们必学框架之一,我们这次先根据iScroll功能自己实现其功能,然后再学习iScroll源码 下面先给出iScroll官方的例子和源码,要看效果的朋友自己去看吧:https://github.com/cubiq/iscroll 本人能力有限,文中有误请提出 viewport 在移动端新出了一个属性叫做“viewport

好程序员前端学习路线分享模拟JavaScript中面向对象技术

好程序员前端学习路线分享模拟JavaScript中面向对象技术,在C#和Java语言中,面向对象是以类的方式实现的,特别是继承这个特性,类的方式继承表现出了强大的功能,而且也易于学习.JavaScript不是纯的面向对象的语言,而是基于对象的语言,对象的继承是以原型函数的形式继承的,很多初学者刚开始接触的时候不太理解,但是JavaScript这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能,本文主要讨论了JavaScript的面向对象技术.?一.原型对

C语言学习--类的模拟

在学习linux下编程时,不可避免的要学C了,下面先简单写写C下对C++中的类的模拟. 我们要用到的是 struct和函数指针,不懂的同学自行搜索这两个东东,我现在只写我的第一个实现,更多实现方式我会稍后补充. 首先先上代码: 1 #include<stdlib.h> 2 #include<stdio.h> 3 4 struct Swen{ 5 int number; 6 char name; 7 void (*test)(struct Swen* mythis); 8 }; 9

WinForm学习 --简单的模拟时钟程序

今天学习GDI+,试着想写一个模拟时钟的小程序,原以为很简单实现:但其实还有些复杂,特别是利用三角函数的那部分,让我四处找资料恶补了一下高中数学才算弄清楚,现在就回顾一下这个程序吧. 程序的目的是要模拟出时钟的效果,那首先就是要画出这个时钟的样子.不考虑美观,一个时钟最简单的组成是一个圆形的表盘,三根直线代表的时针.分针和秒针. <img缺失> 看起来很简单吧,但要怎么样画呢?让我们一步一步来吧: 1.画表盘 Graphics g = this.CreateGraphics(); //创建一个

【NS-3学习】ns-3模拟基础:目录结构,模块,仿真流程

前言 ns-3是一个离散事件驱动网络模拟器,旨在满足学术研究和教学对网络仿真模拟的需求.ns-3项目是一个始于2006年的开源项目,负责开发ns3软件. ns-3并不是ns-2的扩展,而是一个全新的模拟器.ns-3的官网:http://www.nsnam.org/ 下面介绍 ns-3的软件目录 .现有模块和ns-3的仿真流程. ns-3的目录结构 AUTHORS examples src utils.pyc wutils.py bindings LICENSE test.py VERSION w

学习Javascript之模拟实现new

前言 本文1021字,阅读大约需要5分钟. 总括: 本文对new进行了一个简单介绍,然后使用一个函数模拟实现了new操作符做的事情. 参考文档:new 运算符 公众号:「前端进阶学习」,回复「666」,获取一揽子前端技术书籍 人生是没有毕业的学校. 正文 new是JS中的一个关键字,用来将构造函数实例化的一个运算符.例子: function Animal(name) { this.name = name; } Animal.prototype.sayName = function() { con

学习Javascript之模拟实现bind

前言 本文1703字,阅读大约需要5分钟. 总括: 本文模拟实现了bind方法的更改this,传参和绑定函数作为构造函数调用时this失效的特性. 参考文档:Function.prototype.bind() 公众号:「前端进阶学习」,回复「666」,获取一揽子前端技术书籍 愿每次回忆,对生活都不感到负疚. 正文 bind和call,apply的作用类似,都是用来更改函数的this值的,不同的是,call和apply会直接把函数执行,但bind会返回一个函数,我们称之为绑定函数: functio

python爬虫学习(3)_模拟登陆

1.登陆超星慕课,chrome抓包,模拟header,提取表单隐藏元素构成params. 主要是验证码图片地址,在js中发现由js->new Date().getTime()时间戳动态生成url,python对应time.time(),生成验证码图片url,图片下载在本地,手动输入.代码如下: #coding=utf-8 import requests import time from bs4 import BeautifulSoup header={ 'Referer':'http://aus

[PHP学习教程]002.模拟守护进程(Daemon)-程序永远在后台运行

引言:如何模拟那些自动轮循的服务,像守护进程(Daemon)那样,可以一直执行,永不停歇呢! Come on! Do it! Do! Do! Do!.... 使用接口: int ignore_user_abort ( [bool setting] ) 方法声明: 这个函数的作用是指示服务器端在远程客户端关闭连接后是否继续执行下面的脚本. 参数说明: setting:参数是一个可选参数.如设置为True,则表示如果用户停止脚本运行,仍然不影响脚本的运行(即:脚本将持续执行):如果设置为False,