第四个知识点 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. JVM2 类加载子系统

    目录 类加载子系统 类加载器子系统 类加载器ClassLoader角色 类加载的过程 案例 加载Loading 连接Linking 初始化Intialization clinit() 类的加载器 虚拟 ...

  2. A Child's History of England.2

    They made boats of basket-work, covered with the skins of animals, but seldom, if ever, ventured far ...

  3. day01 MySQL发展史

    day01 MySQL发展史 今日内容概要 数据库演变史 软件开发架构 数据库本质 数据库中的重要概念 MySQL下载与安装 基本SQL语句 今日内容详细 数据库演变史 # 1.文件操作阶段 jaso ...

  4. k8s使用ceph的rbd作后端存储

    k8s使用rbd作后端存储 k8s里的存储方式主要有三种.分别是volume.persistent volumes和dynamic volume provisioning. volume: 就是直接挂 ...

  5. 启动spark-shell --master yarn的bug

    报错如下 18/06/06 15:55:31 ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited ...

  6. 如果你不想让pthread_join阻塞你的进程,那么请调用pthread_detach

    如果你不想让pthread_join阻塞你的进程,那么请调用pthread_detach 2016年01月13日 16:04:20 炸鸡叔 阅读数:7277   转发自:http://baike.ba ...

  7. oc中调用c函数 实现将字符串转换成unsigned char

    帮助码友解决问题,从而复习了一下oc中调用c函数的方式 1,新建c 头文件  test.h 定义 c 函数 #ifndef test_h #define test_h void verificatio ...

  8. 3.0 rust 项目路径

    $ rustc --versionrustc 1.44.0 (49cae5576 2020-06-01) 将代码存在到不同的文件 main.rs mod aa; fn main() { println ...

  9. 页面屏蔽backspace键

    1 //页面加载完成 2 $(document).ready(function(){ 3 //禁止退格键 作用于Firefox.Opera 4 document.onkeypress = banBac ...

  10. 注册页面css版本

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...