第四个知识点 P类复杂问题

原文地址:http://bristolcrypto.blogspot.com/2014/10/52-things-number-4-complexity-class-p.html

这个是密码学52件事第四篇,和理论密码学的第一篇。在这篇中我被要求定义P类复杂问题。我对计算理论科学知道的非常少当我开始我的PhD,而且我确信很多人和我一样。因此这篇文章从最简单的开始,如果你已经会了你可以跳过前面的部分。首先我会描述复杂性的定义和为什么他很重要,然后我们定义图灵机,最后是P类复杂问题,通过一个例子做总结。

这篇文章主要的内容就是重写Introduction to the Theory of Computation by Michael Sipser[1],我觉得他对我真的很重要。

Section 1: Complexity and Big O Notation

为了设计高效的程序,我们想知道计算机执行给定任务有多难。问题在于,计算机的处理能力因硬件而异(例如,参考上周的52件事)。所以我们想要一个不依赖与执行任务的机器的具体细节的任务难度的度量。其中一种方法就是限定一个特定型号的计算机执行操作所需要的操作数。这就是所谓的(时间)复杂性理论。

不过操作的数量取决于任务的输入,甚至输入长度相同操作数都不相同。举个栗子,假设我们设计一个程序来判断你的输入整数是不是质数。如果我们输入256,程序可能判断的比输入323更快。尽管它们的长度都是9.因为第一个数字的2就是它的一个因数,第二个有更大的因数。因此我们通常给出一个最坏时间复杂的分析,当我们记录实际的运行长度的时候。因此我们获得了一个t(n)的表达式。反应了所有输入的最长运行时间。

而且,当输入的长度n非常大的时候,我们能够忽略表达式中除了最大项的项,也可以忽略任何实例的系数。这被叫做渐进分析。我们假设n是非常大的,并且询问当给定最差的n的时候。计算模型需要多少步能完成,然后我们把答案写成\(O(t(n))\)。例如,如果我们发现需要$ 6n3-n2+1\(步。我们写做\)O(n^3)$,因为所有的项都能被忽略。

Section 2:Turing Machines

如今我们给出这个第一节当中最经常被用的模型。首先,要明白一个字母表是一个非空有穷集。一个字符串是一个从字母表的符号序列。一个语言是字符串集的一部分。

图灵机模型就是真实的计算机。它的内存就是一个有限长度的纸条。任何时候,纸条的每一块要么是空的要么是包含了字符表的中的字符。这个机器有一个读写头能够每次在纸带上向左向右移动,或者在纸带上进行读写。在机器运行的开始,纸带最左边n个都是输入,剩下的都是空白的。(输入中没有空白的,这样可以确定输入结束的位置)。磁带头从最左边的正方形开始,读取一个输入符号,然后根据转换函数决定下一步要做什么。转换函数取决于它当前所读取的内容,和机器当前的状态。和返回:

  • 一个新的状态
  • 另一个写入的符号(可能跟之前的相同)
  • 一个移动的方向(左或者右)

这个机器持续的运行,读符号,计算转换函数,写符号,移动,直到进入接受状态或者拒绝状态。

如果机器在一个接受状态结束的话,我们说它接受了输入。但是注意:它可能进入一个循环没有接收也没有拒绝。例如,它可能从不挂起。如果一个图灵机接受一些语言的每个字符串和拒绝其它字符串,我们就说这个机器判定了这种语言。我们把这个过程看作机器测试这个输入字符串是否是这个语言的一部分。给定一个语言,如果有一个图灵机可以判定它,那么我们就说这个语言是可判定的。

这个模型的厉害就是一个图灵机能做现代计算机所有的事情(被叫做Church-Turing论断)。我们定义时间复杂类\(TIME(t(n))\)这样的一类就是所有的能够被时间复杂度为\(O(t(n))\)的图灵所能判定的,然后我们就能把计算问题变成一个语言关系问题(输入字符串是某种语言的成员吗?这个表示整数的字符串属于表示素数整数的字符串语言吗?),同时可以将计算问题分类变成时间复杂度类。

Section 3: P类复杂问题

最终,我们终于到达了这个问题!如果\(t(n)=n^k\)对一些\(k>0\),同时\(O(t(n))\)被叫做多项式时间.P类复杂度问题就是那些图灵机可以在\(O(t(n))\)时间内可判定的语言。因为\(k\)可能非常大,图灵机可能运行的非常慢。但是这个类是给粗略的模型,描述了计算机可以实现的功能。注意\(t(n)\)比如\(2^n\)这样时间的语言类与P类是完全不同的,增长速度如此之快,即使你对某些语言有一个决定,你可能会发现宇宙在你输入之前就结束了!

我们用一个多项式时间的问题做一个例子。假设你有一个单向图(一组点和边,每两个点之间最多有一条边,每个边有一个箭头表示方向)。如果我们编码这个图,把两个节点当做一个单一字符串。我们可以形成一种由表示图形的字符串和两个节点组成的语言,这样就可以沿着第一个节点的边走,最终到达第二个节点。因此这个语言会有效率的回答是否有一个从节点A到节点B的路径,这就是路径问题,通过接受或者拒绝你输入的图或者节点。我们给出这样的决策器,它能够在多项式时间内判定这个问题。

  • 首先在A上做一个标记
  • 扫描图的所有边。如果你发现一个边从标记过的节点指向未标记的节点,标记这个未被标记的节点
  • 重复这个过程
  • 如果B被标记了,接受这个语言,否则,拒绝这个语言。

这个过程成功的标记了到A距离为1的所有节点,距离为2的所有节点。。。。。因此图灵机显然可以实现上面的过程。现在我们考虑这个时间复杂度。步骤1和步骤4太容易了。所以我们集中注意力在步骤2和步骤3,步骤2包括了搜索输入和在一个位置上放上标记,这个过程明显是多项式时间内可以完成的。步骤3重复步骤2的次数不多于节点的数量,节点的数量肯定少于输入的数量,因此这也是线性的。因此整个算法就是线性的。我们说这个路径问题就是P类问题。

[1] http://www.amazon.co.uk/Introduction-Theory-Computation-Michael-Sipser/dp/0619217642

[2] http://en.wikipedia.org/wiki/Church–Turing_thesis

第四个知识点 P类复杂问题的更多相关文章

  1. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  2. delphi 线程教学第四节:多线程类的改进

    第四节:多线程类的改进   1.需要改进的地方   a) 让线程类结束时不自动释放,以便符合 delphi 的用法.即 FreeOnTerminate:=false; b) 改造 Create 的参数 ...

  3. Java反射机制demo(四)—获取一个类的父类和实现的接口

    Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 ...

  4. javaSE练习13——(知识点:类的继承 方法的覆盖)

    设计2个类,要求如下: (知识点:类的继承 方法的覆盖)1.定义一个汽车类Vehicle, 1.1 属性包括:汽车品牌brand(String类型).颜色color(String类型 )和速度spee ...

  5. SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存

    流式计算在一些情况下会用到分布式缓存,从而实现(1)想把统计或计算结果保存在分布缓存中.供其他模块或其他系统调用. (2)某一滑动时间窗体上计数.比如实时统计1小时每一个Cookie的訪问量.实时统计 ...

  6. Python进阶(十四)----空间角度研究类,类与类之间的关系

    Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...

  7. Java中的集合(十四) Map的实现类LinkedHashMap

    Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...

  8. 并发编程从零开始(十四)-Executors工具类

    并发编程从零开始(十四)-Executors工具类 12 Executors工具类 concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池 12.1 四种对比 单线程 ...

  9. 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法

    第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我 ...

随机推荐

  1. day10 ajax的基本使用

    day10 ajax的基本使用 今日内容 字段参数之choices(重要) 多对多的三种创建方式 MTV与MVC理论 ajax语法结构(固定的) 请求参数contentType ajax如何传文件及j ...

  2. Netty之ByteBuf

    本文内容主要参考<<Netty In Action>>,偏笔记向. 网络编程中,字节缓冲区是一个比较基本的组件.Java NIO提供了ByteBuffer,但是使用过的都知道B ...

  3. 【Python】【Basic】MacOS上搭建Python开发环境

    1. Python3 1.1. 下载地址:https://www.python.org/downloads/mac-osx/ 1.1.1. PKG包安装: 没啥可说的,点点点,下一步而已,不用手动配置 ...

  4. Tomcat(2):配置Tomcat

    1,打开IDEA创建一个项目 2,配置Tomcat服务器 3,运行 5,成功 t t

  5. 【Linux】【Services】【Project】Cobbler自动化装机

    1. 概念 1.1. Cobbler 1.2. PXE 1.3. 2. 版本信息 2.1. OS:Red Hat Enterprise Linux Server release 7.3 (Maipo) ...

  6. Spring Batch Event Listeners

    Learn to create and configure Spring batch's JobExecutionListener (before and after job), StepExecut ...

  7. 通过静态分析和持续集成 保证代码的质量 (Helix QAC)2

    续上.... 第二章 部署示例:Jenkins and Helix QAC工具 第一节 Jenkins 作为持续集成系统 现在有很多持续集成工具,既有免费的,也有商业的.最近的研究显示,Jenkins ...

  8. C# 温故知新 第二篇 C# 程序的通用结构

    C# 程序由一个或多个文件组成. 每个文件均包含零个或多个命名空间. 一个命名空间包含类.结构.接口.枚举.委托等类型或其他命名空间. 以下示例是包含所有这些元素的 C# 程序主干. 主要包括  1. ...

  9. Apache APISIX 的安装和配置请求转发url匹配

    安装apisix套件 创建一个apisix文件夹,在apisix文件夹下再创建一个etcd_data文件夹,用来持久化etcd的数据 在apisix文件夹下 新建3个文件 config.yaml,  ...

  10. 一文详解 纹理采样与Mipmap纹理——构建山地渲染效果

    在开发一些相对较大的场景时,例如:一片铺满相同草地纹理的丘陵地形,如果不采用一些技术手段,就会出现远处的丘陵较近处的丘陵相比更加的清晰的视觉效果,而这种效果与真实世界中近处的物体清晰远处物体模糊的效果 ...