NP问题与可计算性问题笔记

算法的时间复杂度指的是算法计算所需要的数量级,通常用O(·)表示。

O(1)表示一个算法是常数阶,例如访问HashMap的某一个元素(随机存取)只需要一次运算即可。

O(n)表示一个算法是线性阶,例如寻找数组Array中最大的元素,需要遍历数组(顺序表)的所有元素。

O(logn)是对数阶,比O(n)更快,例如有序表的二分查找。

O(n^2)表示一个算法是平方阶,例如冒泡排序算法对数组进行排序。

O(nlogn)介于O(n)和O(n^2)之间,常见的有快速排序、归并排序算法。

以上都是多项式级别的复杂度,即O(n^a)以下。

下面的是非多项式级别,更难计算。

O(a^n)是指数级递增的计算规模。例如常见的“汉诺塔问题”,就是2^n次计算。

O(n!)复杂度的是阶乘规模的算法,例如一组数的全排列。

    如果一个问题可以找到一个能在多项式时间内解决的算法,称为P问题(polynomial)。

    NP问题:可以在多项式时间内验证问题的一个可能解(non-deterministic polynomial)。

    所谓P=NP?就是讨论,是否所有NP问题都是P类问题(显然所有P问题都是NP问题,能找到算法自然可以轻松验证。)

一个复杂度较低的问题,可以约化(Reducibility)为复杂度较高的问题,例如一次方程可以视为二次项系数为0的二次方程。

    NPC是指NP完全问题,可以在多项式时间内验证问题的一个可能解,但是要找到问题的解通常需要高于多项式的时间。1. NPC问题是一个NP问题。2. 所有的NP问题都可以约化为NPC问题。

    NPC的性质:NP虽然可以快速验证,但是没有任何数据结构和算法可以在多项式时间内解决NPC;所有已知的NPC问题都可以用图论的形式表示出来;如果一个问题被归约到某个NPC问题,就可以认为它也是个NPC问题。

    其不可能有多项式级复杂度的算法。只要任意一个NPC问题找到了多项式算法,那么所有的NP问题就都可以用该算法去解决了,即证明了P=NP。(其实恰恰是NPC问题的存在让人们相信P不等于NP)。当前的NPC问题通常只能用指数级别甚至阶乘级别复杂度的算法求解。

    逻辑电路问题:给定一个逻辑电路,问是否存在一种输入使得该电路输出为True。该问题已被证实为NPC问题,并且任意一个NP问题都可以约化为逻辑电路问题。

    NPC问题其他案例:TSP(Traveling Saleman Problem 旅行商问题)、背包问题、图着色问题、布尔可满足性问题(SAT Boolean Satisfiability Problem)、子集和问题等。计算理论、集合论、图论等领域都发现越来越多NP问题,对NPC问题深入研究可以设法克服这些问题。

    证明一个问题是NPC问题。首先证明其是一个NP问题,然后用一个已知的NPC问题进行多项式时间的规约。

    NP-Hard问题不一定是NP问题,也可能是非NP问题。但所有NP问题都可以约化为NP-Hard问题。P属于NP,NP和NP-Hard的交集为NPC。NP-Hard问题同样很难找到多项式算法。

图灵机:是图灵描述的一种抽象机器,它是人们进行数学计算的过程的抽象,肯定了计算机实现的可能性,并引入了读写、算法、程序语言等概念。

定义:(1)无限长度的磁带、(2)读写磁带的磁头,可用来读取、擦除、写入字符,也可以左移、右移一个单位。(3)状态寄存器,存储图灵机的状态,状态数为有限多个。(4)一个指令表,根据机器当前的状态和磁头指向的符号,指示机器进行特定操作(擦除、写入符号,左右移动磁头)。

上述为理想图灵机定义,带子无限长,带子上的字符数有限多,状态有限多,指令有限多。

符号定义:M=(Q,A,B,R, t,f, Q0, Qaccept, Qreject)

分别为Q有限状态集合,A有限输入字母表(不包含空白符B),R无限长度纸带(可以出现A里任意字母以及空白B),t 读写头,f 转移函数(f: QxA->QxAx{L,R}),剩下三个为 初始状态、接收状态、拒绝状态。

转移函数f: QxA->QxAx{L,R}:输入参数(状态q和字符X),输出(状态p和字符Y,方向D)。

图灵完备性:指的是指令系统模拟图灵机的能力。理论上,图灵完整的编程语言可以表达计算机可以完成的任何任务。

图灵机的缺点:(1) 现代计算机的RASP随机存储模型,内存索引优化,图灵机无法实现。(2) 不能很好地进行并发建模。

确定图灵机DTM:规定任何给定情况下最多只能执行一个动作。DTM具有转换功能,对于给定磁头下的状态和符号,制定了要写入磁带的符号、头部移动方向、有限控制的后续状态。

非确定图灵机NTM:给定情况指定了多个可能的动作,NTM的下一状态不是完全由其动作和它看到的符号决定。

确定图灵机和非确定图灵机在计算上是等效的,两者可以相互转换。

关于图灵机设计的计算案例:https://blog.csdn.net/qq_32792523/article/details/79331537。

自动机和图灵机的目的都是 把计算转为一个集合,从数学角度研究计算。

接受状态把字符串分为接受字符串和非接受字符串,其中图灵机M的所有接受字符串w可以组成一个集合L,集合L就是图灵机M的语言 L(M)={w | M接受w字符串},对应计算模型。

图灵机一旦达到接受状态,自动停机;自动机 即使达到接受状态也要把所有字符串读取完毕才停机。

图灵机的语言$A_{TM}$是图灵机可接受的,是可计算的,但不是可判定的。

通用给图灵机语言是计算语言,并且都不可判定。

证明整理:https://blog.csdn.net/shulianghan/article/details/110935394

关于不可判定性 Undecidability ,绝大多数计算问题都是不可判定的,能判定的只占计算问题的一小部分。语言与计算问题个数一样多,都是不可数无穷;图灵机个数与自然数一样多,都是可数无穷的,语言的个数远多于图灵机的个数,因此不可判定问题远多于可判定的。

停机问题不可判定。所谓停机问题,就是“设计一个程序,帮助判定 给定一个程序,该程序是否会停机”,如果知道该程序不会停机,就强制停止该程序,如果知道会停机,就等待程序执行完毕。该判断程序是不存在的。

另外以下三个问题也不可判定:

1 判断图灵机所认识的语言是否是空集。

2 两个图灵机是否等价

3 图灵机所认识的语言,是否能够找到一个认识该语言的自动机

Rice's Theorem 莱斯定理:任何一个关于图灵机的计算问题都是不可判定的。

 

posted @ 2023-07-13 22:04  倦鸟已归时  阅读(184)  评论(0编辑  收藏  举报