第四个知识点 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. 巩固javaweb的第二十一天

    巩固内容:对输入信息进行验证 JavaScript 语言 在 Web 应用中需要在客户端执行的功能可以使用 JavaScript 语言编写,在使用的时候 需要把 JavaScript 代码放在下面的两 ...

  2. 学习java 7.12

    学习内容: File是文件和目录路径名的抽象表示,File封装的不是一个真正存在的文件,仅仅是一个路径名 File类的方法 绝对目录和相对目录的区别 字节流 使用字节输出流写数据的步骤 : 创建字节输 ...

  3. PLSQL导出oracle表结构和数据

    1.导出表结构和数据 方式1.tools->export user objects是导出表结构 tools ->export user object 选择选项,导出.sql文件 说明:导出 ...

  4. Linux学习 - 文本编辑器Vim

    一.Vim工作模式 二.命令 插入 a 光标后插入 A 光标所在行尾插入 i 光标前插入 I 光标所在行首插入 o 光标下插入新行 O 光标上插入新行   删除 x 删除光标处字符 nx 删除光标处后 ...

  5. linux 磁盘满了,vim 编辑文件时无法保存

    早上来发现 redis 不能用,报 MISCONF Redis is configured to save RDB snapshots, but it is currently not able to ...

  6. APiCloud - api对象

    详见网址:https://www.cnblogs.com/jiqing9006/p/5919317.html

  7. 使用beanFactory工厂实例化容器的方式实现单例模式

    //配置文件bean.properties(注意书写顺序) accountService=com.itheima.service.impl.AccountServiceImplaccountDao=c ...

  8. linux系统下命令的学习

    本博客是本人工作时做的笔记 ps aux |grep ^profile |grep A190200024 ^ 表示行首匹配 linux查看文件大小: 具体可查看:https://www.cnblogs ...

  9. python3.6.4 scrapy框架from PIL import Image报错 from . import _imaging as core

    scrapy框架爬取url下载图片时,用ImagesPipeline下载图片 from PIL import Image报错 from . import _imaging as core Import ...

  10. [BUUCTF]PWN——xdctf2015_pwn200

    xdctf2015_pwn200 附件 步骤 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入,习惯性的检索程序里的字符串,没有发现什么铭感的地方,直接看ma ...