首页 > 其他分享 >computational complexity笔记

computational complexity笔记

时间:2022-12-29 13:11:27浏览次数:40  
标签:computational 一个 模型 元素 纸带 针头 complexity 笔记 计算

the computational model

最初的目标是构造一个计算的模型。这个模型可以看作一个集合,这个集合中的每个元素相当于某一个具体问题的解决方案,也就是一个“程序”;这个集合整体就是一个计算模型,也就是一个可以运行任何“程序”的“计算机”。所以构造一个计算模型的目标,分别从程序和计算机的角度就是要规定程序如何表达和程序如何运行。
直观上来说“计算”就是已有一些“数据”和一些的“草稿纸”,按照“解题思路”每次在数据和稿纸中拿出一些数据进行计算,将结果写在稿纸上或写在“答题纸”上。构造的计算模型应该符合这一直觉。
我们还希望这个模型具有“通用性”,也就是研究“计算”可以建立在这个模型基础上,而非将计算这个本质的概念特殊化,将“可计算”等问题的研究限定在当今世界中。这样,理论计算才能成为一门永恒的科学,而非日新月异的技术。

turing machine

图灵机的一些细节

一个图灵机可以看作一个程序。
纸带和针头(数据草稿纸):多个纸带,纸带上面每个位置可以写单个字符,每条纸带有一个针头,每次可以向左或向右移动一个单位,也可不动。有一个输入纸带,表示给定的数据;一个输出纸带,在运行结束时输出纸带上的值就代表输出结果;其他纸带均用于存储中间运算的结果。设有\(k\)个纸带,纸带上字符集大小为\(\Gamma\)
状态(临时记忆):状态只是一个抽象的数,但作为一个临时的记忆,可以存储的东西种类很多,例如“程序进行到第几步了”,“上一秒从纸带读入的数据是哪些”等等,但因为只是一个数,可以认为记录的信息量是关于读入\(O(1)\)的。状态是集合\(Q\)的一个元素。
计算一步的过程:从每个纸带的针头处读取一个元素,再根据读取的元素和目前的状态决定下一个状态,这些针头处的值如何修改,以及每个针头分别如何移动,或者选择结束计算。那么整个计算的运行时间就可以看作这样的计算的步数。
转移函数(解题思路):由于修改和移动完全取决于针头处的值和目前的状态,因此可以将每次计算看作一个函数\(\delta:Q\times \Gamma^k \rightarrow Q\times \Gamma^{k-1}\times \{L,S,R\}^k\)。
值得注意的是,“状态”这个数不是可有可无的,比如说我想将纸带的某个位置的值\(x\)移到纸带末尾,那么我在移动的每一步“必须要记住\(x\)的值”,这个值是无法在纸带的读入中得到的,所以必须要将\(x\)的值作为一个临时记忆放在状态里以便转移。

定义的普遍性

先定义一个图灵机的运行时间:如果对于所有长度为\(n\)的输入,运行时间不超过\(T(n)\),则称运行时间为\(T(n)\)。
可以从以下几点中感受图灵机模型定义的普遍性:字符集大小的任意性,纸带条数的任意性,纸带可以是双向延伸也可以是单向延伸。这里的任意性说的是在一种模型下的任一程序,可以对应到另一模型下的一个程序使得输出相同,且运行时间不慢太多。

对于任意\(k+2\)个纸带的图灵机,运行时间\(T(n)\),存在三个纸带的图灵机得到相同的结果,运行时间\(kT(n)\log T(n)\)。

证明:将用于草稿的\(k\)个纸带变成一个纸带,字符集\(\Gamma\)变成\(\Gamma^k\),然后\(k\)个针头的移动转化成\(k\)条纸带分别平移,直接暴力平移是\(kT(n)^2\)的。优化每条纸带的平移可以优化到\(T(n)\log T(n)\),算法如下:类似倍增的方法,以针头为中间点,左右从中间向两边按\(2,4,8,...,2^k,...\)依次分块,保证\(2^k\)的块内有效元素个数为\(2^k\)或\(2^{k-1}\)或\(0\),其他元素用空字符填充,且对称(块大小相同的两个块)内有效元素个数之和为\(2^k\)。以左移距离,先找到右侧第一个有效元素数不为\(0\)的块\(2^t\),那么右侧\(2,4,8,...,2^{t-1}\)这些块为空。将\(2^t\)块内的\(2^{t-1}\)个元素取出,依次放到针头处,\(2,4,8,...,2^{t-1}\)这些块各填满一半,对于左侧,进行相反的操作,将针头处,\(2,4,8,...,2^{t-1}\)这些块的元素各拿出一半,放到\(2^t\)处。例如|oooo|aa|i|oo|bcdd|变为|ooaa|oi|b|co|ddoo|。注意到如果访问到\(2^k\)块,单次复杂度为\(O(2^k)\),但此后至少\(2^{k-1}\)内不会再访问到\(2^{k-1}\)块,因此每块均摊复杂度\(O(T(n))\)。

标签:computational,一个,模型,元素,纸带,针头,complexity,笔记,计算
From: https://www.cnblogs.com/crasysky/p/17011926.html

相关文章

  • 笔记本默认设置125%或者150%缩放,导致布局错乱的解决方法
    目录一:为什么会出现有这个问题?二:有什么解决方案?三:vue项目utils下新建js四:全局导入App.vue五:重新进入项目六:注意事项一:为什么会出现有这个问题?因为现在很多14寸......
  • 现代通信理论与新技术 PPT笔记整理
    文章目录​​现代通信理论与新技术​​​​绪论​​​​概述​​​​卫星通信简介​​​​光纤通信简介​​​​移动通信简介​​​​光纤传输网技术​​​​基本概念​​​......
  • #yyds干货盘点# react笔记之学习之空列表提示
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • 算法笔记小抄
    栈和队列​​232.用栈实现队列​​225.用队列实现栈20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值239.滑动窗口最大值347.前K个高频元素参......
  • 中国计算机大会CNCC【笔记】
    中国计算机大会CNCC【笔记】​​前言​​​​推荐​​​​中国计算机大会CNCC​​​​CNCC青年精英思想秀主题:当呼吸化为空气——物联网安全​​​​云原生一站式数据管理......
  • FastAPI 记录笔记
    https://fastapi.tiangolo.com/安装pipinstallfastapipipinstall"uvicorn[standard]"基本代码main.pyfromtypingimportUnionfromfastapiimportFastAPI......
  • Android笔记--按钮触控
    Button(由TextView派生而来)但也是有一定的区别:具体实现:按钮控件的新增属性具体实现:在未使用textAllCaps属性之前,按钮名称会默认为全部使用大写字母:在指定了该属性......
  • Python学习笔记--高阶技巧(二)
    Socket服务端开发基本步骤如下:socket客户端开发基本步骤如下:1、创建socket对象2、连接到服务器3、发送消息4、接收返回消息5、关闭连接正则表达式基础方法......
  • 【MindStudio训练营第一季】课程笔记​
    【MindStudio训练营第一季】课程笔记​新手班课程零基础入门之后,可以了解AI应用的开发流程。使用MindStudio可视化完成流程编排,迅速上手N腾AI应用开发。总结学习的一些知识......
  • 详解数据链路层-局域网&广域网【王道计算机网络笔记】
    局域网局域网(LocalAreaNetwork):简称LAN,是指在某一区域内由多态计算机互联成的计算机组,使用广播信道特点覆盖的地理范围较小,只在一个相对独立的局部范围内联,如一座或集......