多项式时间和指数时间

时间:2010-11-30 19:01:15

标签: algorithm

有人可以解释多项式时间,非多项式时间和指数时间算法之间的区别吗?

例如,如果算法需要O(n ^ 2)时间,那么它在哪个类别?

9 个答案:

答案 0 :(得分:82)

以下是分析算法时的一些常见Big-O功能。

  • O( 1 ) - 恒定时间
  • O( log(n)) - 对数时间
  • O((log(n)) c ) - 多对数时间
  • O( n ) - 线性时间
  • O( n 2 ) - 二次时间
  • O( n c ) - 多项式时间
  • O( c n ) - 指数时间
  • O( n!) - 阶乘时间

(n =输入的大小,c =某个常数)

以下是表示某些函数的Big-O复杂度的模型图

graph model

欢呼: - )

图表信用http://bigocheatsheet.com/

答案 1 :(得分:66)

检查this

指数比多项式差。

O(n ^ 2)属于二次类,这是一种多项式(指数的特殊情况等于2)并且优于指数。

指数 比多项式差。看看函数如何增长

n    = 10    |     100   |      1000

n^2  = 100   |   10000   |   1000000 

k^n  = k^10  |   k^100   |    k^1000

k ^ 1000非常大,除非k小于1.1。就像宇宙中的每个粒子一样,每秒数亿亿亿次操作需要花费数万亿甚至数十亿年才能完成。

我没有计算出来,但是它很大。

答案 2 :(得分:42)

O(n ^ 2)是多项式时间。多项式是f(n)= n ^ 2。另一方面,O(2 ^ n)是指数时间,其中隐含的指数函数是f(n)= 2 ^ n。不同之处在于n的函数是否将n置于求幂的基础中,或者置于指数本身中。

任何指数增长函数都会比任何多项式函数显着更快地(长期)增长,因此区别与算法的效率有关,特别是对于大的n值。

答案 3 :(得分:20)

多项式时间。

多项式是看起来像Constant * x^k的术语之和 指数意味着像Constant * k^x

(在两种情况下,k是常数,x是变量)。

指数算法的执行时间比多项式算法的执行时间快得多。

答案 4 :(得分:16)

指数(如果MINIMAL ONE EXPONENT依赖于参数,则您具有指数函数):

  • E.g。 f(x)=常数^ x

多项式(如果NO EXPONENT不依赖于某些函数参数,则有多项式函数):

  • E.g。 f(x)= x ^常数

答案 5 :(得分:2)

多项式时间O(n)^ k表示操作数与输入大小的功率k成正比

指数时间O(k)^ n表示操作数与输入大小的指数成正比

答案 6 :(得分:0)

o(n sequre)是多项时间复杂度,而o(2 ^ n)是指数时间复杂度 如果p = np,当最好的情况下,在最坏的情况下p = np不相等,因为当输入大小n增长这么长或输入sizer增加这么长时它会遇到最坏的情况和处理因此复杂性增长率增加并取决于n的输入大小当输入很小时,当输入大小变大时它是多项式,因此p = np不等于它意味着增长率取决于输入的大小" N"。 优化,sat,clique和independ集也以指数形式满足多项。

答案 7 :(得分:0)

这是对新手最简单的解释:

多项式: 如果表达式包含或函数等于当常量是变量的幂时,例如

f(n) = 2 ^ n

同时

指数: 如果表达式包含或函数等于当变量是常量的幂时,例如

f(n) = n ^ 2

答案 8 :(得分:0)

更精确的指数定义

polynomial 的定义非常普遍和简单,所以我不会进一步讨论。

Big O 的定义也非常普遍,您只需仔细考虑维基百科定义中的 Mx0,并通过一些示例进行操作。

所以在这个答案中,我想专注于指数的精确定义,因为它需要更多思考/不太为人所知/不太普遍,尤其是当您开始考虑某些边缘情况时。然后我将在下面进一步将它与多项式进行对比

指数时间最常见的定义是:

2^{polymonial(n)}

其中 polynomial 是一个多项式:

  • 不是常数,例如1,否则时间也是恒定的
  • 最高阶项具有正系数,例如-2n,否则在无穷大处归零

例如:

2^{n^2 + 2n + 1}

请注意,底数 2 可以是任何大于 1 的数字,并且定义仍然有效,因为我们可以通过乘以指数来转换底数,例如:

8^{polymonial(n)} = (2^3)^{polymonial(n)} = 2^{3 * polymonial(n)}

3 * polymonial(n) 也是多项式。

另请注意,添加无关紧要,例如2^{n + 1} = 2 * 2^{n}+ 1 对于大 O 符号无关紧要。

因此,大 O 符号中的最小指数如下所示:

(1 + e)^{n}

对于非常小的 e。最高阶项是 n^1,阶一。

超多项式和次指数

但请注意,上面的定义排除了一些在实践中出现的非常大的东西,我们会倾向于称之为“指数”,例如:

  • 2^{n^{1/2}}。这有点像多项式,但它不是多项式,因为多项式的幂必须是整数,这里我们有 1/2
  • 2^{log_2(n)^2}

那些函数仍然非常大,因为它们的增长速度比任何多项式都快。

但严格来说,它们比我们严格定义中的多项式小 O!

这激发了以下定义:

  • 超多项式:比任何多项式增长得更快
  • 次指数:增长速度低于任何指数,即 (1 + e)^{n}

本节上面给出的所有例子都属于这一类。

请记住,如果您将一些非常小的东西放在指数上,它当然可能会回到多项式,例如:

2^{log_2(n)} = n

对于小于 log_2 的任何事物也是如此,例如:

2^{log_2(log_2(n))} = log_2(n)

是次多项式。

重要的超多项式和次指数示例

  • general number field sieve 已知最快的 integer factorization 算法,具有 2^{(k + o(1))(log(n)^(1/3) * log(log(n)))^(2/3)} 形式的复杂性

    这里的小 o 符号 o(1) 表示在无穷远处变为 0 的术语。

    这种复杂性甚至有一个命名的概括,因为它可能出现在其他分析中:L-notation

    奇妙的答案:What would cause an algorithm to have O(log log n) complexity? 给出了 O(log log n) 来自何处的直观解释:而 log n 来自一种算法,该算法在每一步都删除了一半的选项,而 { {1}} 来自一种算法,该算法将每一步的选项减少到总数的平方根!

https://math.stackexchange.com/questions/3975382/what-problems-are-known-to-be-require-superpolynomial-time-or-greater-to-solve 询问任何已被证明是超多项式的有趣算法(并且大概有最优性证明,否则一般数筛将是一个明显的选择,但我们不知道它是否是最优的)

证明指数在无穷大处总是大于多项式

https://math.stackexchange.com/questions/3975382/what-problems-are-known-to-be-require-superpolynomial-time-or-greater-to-solve

次指数不同可能定义的讨论