快速找到
存在一个算法,让求解时间随输入规模多项式增长。不是「一瞬间」,而是不会随规模爆炸。
P VS NP · 判断与寻找
一个尚未写下的等号
P 是「能快速找到解」的问题;NP 是「能快速验证解」的问题。 P = NP 问的是:如果答案一旦被给出,你可以很快检查它,那么你是否也总能很快找到它?
P ⊆ NP 是确定的。等号是否成立,至今没有人证明,也没有人推翻。
存在一个算法,让求解时间随输入规模多项式增长。不是「一瞬间」,而是不会随规模爆炸。
给出一个候选解,存在一个算法在多项式时间内检查它对不对。每个 P 问题都在 NP 里。
如果 NP 里的每个问题都能被快速求解,等号成立。这是理论计算机科学最著名的开放问题。
01 / SUBSET SUM
这是 P vs NP 的日常形状:验证一个候选解,只要把选中的数加一遍; 找到它,却要在 216 个子集里搜索。
点数字选中它。检查是即时的。
02 / THE EXPONENTIAL WALL
验证始终只需要 n 次加法;暴力搜索要试 2n 个子集。 拖动滑杆,看这两条线怎样分开。
横条按对数刻度画,所以它看起来不像指数——数字会提醒你它是。
03 / IF THE EQUALS SIGN HOLDS
假设某天有人证明了 P = NP,并且给出了算法。这不是魔法,但一些被认为 「只能碰运气」的事会变成「可以计算」的事。
多数研究者相信 P ≠ NP;但信念不是证明。
04 / BOUNDARIES
问题。子集和(subset sum)是 NP 完全问题:给定一组整数和目标,是否存在一个子集,其和恰好等于目标。候选解是一个子集,验证只需 O(n) 次加法;暴力搜索有 2n 个子集。
实例。页面生成 16 个互不相同的整数,并挑一个只对应唯一子集、且在枚举顺序里靠后的目标和。搜索矩阵有 65,536 个格子,正好对应 216 个子集。
估算。「每秒 10 亿次」只是把 2n 换算成人类尺度的标尺;宇宙年龄按 138 亿年计。P = NP 的部分全部是条件句,不是已知事实。
代码。规则与动画在 js/pnp.js,样式在 css/pnp.css。没有使用任何机器学习或图论库。