【运筹基础】一文读懂 P问题、NP问题、NP-complete问题和NP-hard问题


声明:

  • 本文的目的是记录和分享学到的知识。作者已尽一切努力确保本文内容的准确性。作者在此声明不承担因本文中的错误或遗漏造成的任何损失所带来的责任,无论这些错误或遗漏是意外、疏忽或其他原因导致的。
  • 转载请备注来源,欢迎点赞收藏或指出本文不足。
  • 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  • 本文链接:https://blog.csdn.net/weixin_45746917/article/details/125451645

0 概述

  本文主要记录了一些关于P问题NP问题的知识。这些知识的来源请见参考文献,掺杂个人的理解与可能不恰当的例子,并不能保证所述内容完全正确,仅供参考。具体内容请参见参考文献。

1 预备知识

  在介绍P和NP之前,需要一些有关算法复杂度归约的预备知识。这些知识有助于我们理解这个上述的问题。

1.1 时间复杂度

  算法的时间复杂度是指一个算法执行的基础步骤的总数,关注的是算法“最坏的”情况。
维基百科:

In computer science, the time complexity is the computational complexity that describes the amount of computer time it takes to run an algorithm.

百度百科:

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。

  算法的时间复杂度常用 O ( f ( n ) ) O(f(n)) O(f(n))表示,其中 O O O称为朗道符号,是用于描述函数渐近行为的数学符号,由德国数论学家保罗·巴赫曼在其1892年的著作《解析数论》(Analytische Zahlentheorie)首先引入的。而这个记号则是在另一位德国数论学家艾德蒙·朗道的著作中才推广的,因此它有时又称为朗道符号(Landau symbols)。代表“order of …”(……阶)的大O,最初是一个大写希腊字母“Ο”(omicron),现今用的是大写拉丁字母“O”。

1.1.1 多项式时间算法

  如果上述的 f ( n ) f(n) f(n) n n n的多项式,那么对应的算法成为多项式时间算法。其中 f ( n ) f(n) f(n)可以是 n , n 2 , n k n,n^2,n^k n,n2,nk等,也可以是 n l o g ( n ) nlog(n) nlog(n)等。指数时间指的是 f ( n ) f(n) f(n) n n n的指数,比如 e n , 2 n , n ! e^n,2^n,n! en,2n,n!等。

1.1.2 举例

  1. 顺序查找:想从 n n n个人中找到小明。于是遍历询问你是否为小明。这个遍历对比的过程最坏情况下总共执行了 n n n步,因此算法的复杂度是 O ( n ) O(n) O(n)
  2. Dijkstra算法:在一个含有 n n n个点的图中,找到某个点到其他所有点的最短路径。复杂度 O ( n 2 ) O(n^2) O(n2)
  3. 单纯型法: n n n个约束的线性规划问题,算法复杂度为 O ( 2 n − 1 ) O(2^n-1) O(2n1)

1.2 多项式时间归约

维基百科

In computational complexity theory, a polynomial-time reduction is a method for solving one problem using another. One shows that if a hypothetical subroutine solving the second problem exists, then the first problem can be solved by transforming or reducing it to inputs for the second problem and calling the subroutine one or more times. If both the time required to transform the first problem to the second, and the number of times the subroutine is called is polynomial, then the first problem is polynomial-time reducible to the second.


非官方翻译:在计算复杂性理论中,多项式时间归约是指另一个问题求解问题的方法。它表明,假定一个子程序可以求解已存在的第二个问题,然后第一个问题可以通过转换、化简成第二个问题的输入并调用或者多次调用子程序的方式求解。如果从第一个问题转换成第二个问题所需的时间、调用子程序的次数都是多项式的,那么第一个问题多项式时间可归约至第二个问题。

百度百科:

在计算复杂性理论中,多项式时间归约是指假设已有解决一个问题的子程序,利用它在多项式时间内(不考虑子程序运行所用时间)解决另一个问题的归约方法。

  当且仅当存在一个求解问题 L 1 L_1 L1的一个算法 A 1 A_1 A1以多项式次数调用求解问题 L 2 L_2 L2的算法 A 2 A_2 A2,则称问题 L 1 L_1 L1多项式时间归约至问题 L 2 L_2 L2

1.2.1 举例

  还是以 n n n个点的网络中的最短路问题为例,现在我们已知:Dijkstra算法( A 2 A_2 A2)可以求图中一个点到其他点的最短路( L 2 L_2 L2)。那么现在有一个新问题,想求图中任意两点间的最短路( L 1 L_1 L1)。于是,我们设计一个算法 A 1 A_1 A1,在图中每个点都调用一次Dijkstra算法( A 2 A_2 A2),因为共用 n n n个点,所以 A 1 A_1 A1调用 A 2 A_2 A2的次数为 O ( n ) O(n) O(n),是多项式时间。因此我们称,问题 L 1 L_1 L1(求图中任意两点间的最短路)多项式时间归约至问题 L 2 L_2 L2(求图中一个点到其他点的最短路)。

1.3 决定性问题

  一类回答“是”或者“否”的问题。

2 P与NP问题

2.1 NP问题

  在介绍P和NP之前,继续举例子。假设在一个有 n n n个人的酒吧里,你必须按顺序找到两个人:小布和胖虎。然后把这两个人按顺序交到两个老师手里面。你并不认识他俩,但是一个老师知道胖虎不知道小布,另一个老师知道小布不知道胖虎。
  这个问题对于你来说非常艰巨,因为有太多排列组合的情况了( A n 2 A_n^2 An2)。但是对于老师而言,就非常简单,因为你给他一个人,他立马就知道是不是小布或者胖虎。
  上述的问题中,求解似乎很困难,但是验证一个解非常容易。

  NP问题,非确定性多项式时间问题(nondeterministic polynomial time problem,是指某个解可以在多项式时间内验证为“是”的决定性问题。

  非确定性是指,我们不确定这个解是怎么来的,大多情况下,我们是猜的。
  就像上述例子中,很容易验证是不是胖虎,是不是小布?(这就是一个决定性问题)

  引用百度百科的话:一个复杂问题不能确定是否在多项式时间内找到答案,但是可以在多项式时间内验证答案是否正确。

2.2 P问题

  以上述的顺序查找例子为例,想从 n n n个人中找到小明。于是遍历询问你是否为小明。这个遍历对比的过程总共执行了 n n n步,因此算法的复杂度是 O ( n ) O(n) O(n)
  上述的问题中,求解似乎变得简单了。

  P(polynomial)问题是指一类可以在多项式时间内解决的决定性问题。

2.3 P与NP的关系

  似乎所有的决定性问题都是NP问题?很明显不是。比如,在TSP问题中,是否存在一个比 M M M还短的路径? 这就不是一个NP问题,因为我们不能在多项式时间内验证这个决定性问题,除非把所有的路径枚举并与 M M M逐个比对,算法复杂度为 O ( n ! ) O(n!) O(n!)

  但是,能在多项式时间内求解的问题,一定能在多项式时间内验证。进而 P ⊆ N P P\subseteq NP PNP

   一个重要且经典的问题是:P=NP吗? 这个问题至今没有证明出来(千禧年难题之一),但是大家普遍相信不等于。

2.4 NP-complete问题

   一个问题是NP-complete问题,需要满足两个条件,当且仅当:
      1. 这个问题是NP问题。
      2. NP问题中任何一个问题都可以多项式归约成这个问题。

   NP-complete问题,本文中简称NPC问题,它的第二个性质说明所有的NP问题都能转换成它。也就是说,如果NPC问题有多项式时间算法,那么就解决了P=NP。同时,第二个性质也说明,NPC问题能转换成NPC问题,因为NPC问题是NP问题,任意一个NP问题都可以归约成NPC问题。

2.4.1 证明一个问题是不是NPC问题

   我们想证明一个问题是不是NPC问题,步骤如下:
   首先,我们证明这个问题是NP问题。
   其次,我们再证明一个NPC问题可以归约至这个问题。

2.4.2 举例:证明TSP的决定性问题属于NPC问题

2.4.2.1 TSP的决定性问题

  TSP问题不再赘述。其决定性问题的表述如下:是否存在长度小于或等于 B B B的路线?

2.4.2.2 哈密顿回路问题

  首先,我们下定义:哈密顿回路问题(Hamiltonian cycle problem, HCP)是NPC问题
  哈密顿回路的定义: G=(V,E)是一个图,若G中一条路径通过且仅通过每一个顶点一次,称这条路径为哈密顿路径。若G中一个回路通过且仅通过每一个顶点一次,称这个环为哈密顿回路。
  哈密顿回路问题:在一个无向图中,是否存在哈密顿回路?

2.4.2.3 证明过程

  为了证明TSP的决定性问题是NPC问题。我们需要证明 (i) 这个问题是NP问题。 (ii) 证明一个NPC问题(在这个问题中是HCP问题)可以归约至这个问题。

  (i) 给定一个TSP的解,我们很容易验证这个解的长度,即所有经过的弧的长度相加。再判断这个回路的长度和是否小于等于B。很明显是多项式时间的。

  (ii) 我们构建一个和HCP问题中点集相同的完全图,如果在这个完全图中的弧已经存在于HCP问题中,则令这个弧的长度为1,否则为2。显然,当且仅当在完全图上的TSP问题有长度小于等于 n n n时,HCP问题有解(其中 n n n是点的个数)。这就将一个HCP问题转换成了一个TSP问题的决定性问题

  所以,TSP的决定性问题属于NPC问题。

2.5 NP-hard问题

  满足NPC问题的第二个条件的问题就是NP-hard问题,即NP问题中任何一个问题都可以多项式时间归约成这个问题,这个问题就是NP-hard问题,本文简称NPH。

  很明显,NPC问题属于NPH问题,即NPH问题未必是NP问题。
  同理,一个NPH问题如果有存在多项式时间算法,那么P=NP。

3 总结

3.1 P NP NPH NPC的关系

  当 P ≠ N P P\ne NP P=NP时,四者关系如图所示,来源维基百科
P NP NPH NPC的关系

3.2 延伸

  1. NPC问题是NP问题中最难的一类,尚未有多项式时间算法。但是一些问题存在伪多项式时间算法,这类问题称为弱NPC问题(例如0/1背包问题可用动态规划求解)。
  2. NPC和NPH求解困难,在没有证明出P=NP之前,找不到快速求解的方法。
  3. 证明一个问题M是NPC或者NPH的,就找一个已知的NPC或者NPH问题,把这个已知的问题转换成你想证明的问题M就行了。
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值