不,阶乘时间不是多项式时间。多项式时间通常表示 O(N k )形式的方程,其中 N = 正在处理的项目数,k = 某个常数。重要的部分是指数是一个常数——你将 N 乘以它自己,其中一些是固定的——不依赖于 N 本身。阶乘复杂度算法意味着乘法的数量不是固定的——乘法本身的数量随着 N 增长。
您似乎在这里遇到了同样的问题。N 2将是多项式复杂度。2 N不会。您的基本原则也是错误的——阶乘复杂度算法并不意味着“我们有一个相当快的算法”,至少作为一般规则。如果有的话,结论恰恰相反:阶乘算法在一些特殊情况下可能是实用的(即 N 非常小),但随着 N 的增长很快变得不实用。
让我们试着正确看待这一点。二进制搜索是 O(log N)。线性搜索是 O(N)。在排序中,“慢”算法是 O(N 2 ),“高级”算法是 O(N lg N)。阶乘复杂度(显然足够)O(N!)。
让我们试着给出一些数字,考虑(目前)只有 10 个项目。这些中的每一个将大致是处理 10 个项目而不是 1 个项目的处理时间的多少倍:
O(log N): 2
O(N):10
O(N log N): 23
O(N 2 ): 100
O(N!): 3,628,800
目前我有点作弊,并使用自然对数而不是以 2 为底的对数,但我们只是在这里尝试进行粗略估计(无论如何,差异都是一个相当小的常数因子)。
如您所见,阶乘复杂度算法的增长率比其他任何算法都快得多。如果我们将其扩展到 20 项,差异将变得更加显着:
O(log N): 3
O(n): 20
O(N log N): 60
O(N 2 ): 400
O(N!): 2,432,902,008,176,640,000
N 的增长率!速度如此之快,几乎可以保证它们是不切实际的,除非已知所涉及的项目数量非常少。对于 grins,我们假设上述进程的基本操作都可以在单个机器时钟周期内运行。只是为了争论(并保持计算简单),让我们假设一个 10 GHz CPU。因此,基础是处理一项需要 0.1 ns。在这种情况下,有 20 个项目:
O(log N) = .3 ns
O(N) = 2 ns
O(N log N) = 6 ns
O(N 2 ) = 40 ns
O(N!) = 7.7 年。