算法的时间复杂度定义为它作为输入长度函数运行所花费的时间。
如果我在C中有一个简单的for循环函数,它运行给定的输入n然后:
n的长度是log n(表示它所需的位数)。
由于输入是log n并且循环运行n次,因此代码在其输入长度(2 ^(log n)= n))中指数运行多次。
C代码:
int forfunction(unsigned int n){
unsigned int i=0;
for(;i<n;i++){
// do something ordinary
}
return 0;
}
这个for循环就是一个例子。
但我们永远不会听到有人说,这样的for循环程序在其输入中是指数级的(存储n所需的位)。为什么会这样?我看到的唯一区别是这是一个程序,并为算法定义了时间复杂度。但即使是这样,那么为什么当我们想要对程序进行粗略的时间复杂时,这没有影响/考虑?
编辑: 进一步澄清:我认为声称它的输入呈指数可能是合理的(可能是错误的=))。如果是这样,那么如果一个简单的for循环是指数的,那么其他难题呢?很明显,这个for循环并不是今天任何人的担心。为什么不呢?与其他难题(EXP,NP-Hard等)相比,为什么这不具有(很多)现实世界的含义?注意:我正在用它来定义NP-Hard问题。
答案 0 :(得分:2)
函数所花费的时间是一个由某些东西参数化的函数。通常它将是输入的大小,但有时它是一个明确的参数,当你描述一个函数时,它取决于你,清楚你的意思。因为参数化通常是“显而易见”的,所以它经常被忽略,当参数化对每个人都不明显时会导致很多混乱。
当你添加单词“复杂性”时,所有这意味着不是描述一个函数,而是说它属于一个特定的函数类。它并不排除需要说明函数是什么以及它的论点是什么。
答案 1 :(得分:2)
阐述@Anonymous的答案:你应该问的问题是“什么指数?”最终,这是否是指数时间取决于如何呈现给你。
如果使用O(log n)位将n作为显式二进制整数给出,则此函数将在伪多项式时间内运行(技术上输入位数为指数,但输入数值为多项式) 。这就是为什么简单的素性测试算法,如试验除法(将n除以2到√n之间的所有数字,并查看它们中的任何一个是因子)在技术上以指数时间运行,即使它们确实在时间O(√n)中运行。 / p>
另一方面,如果使用O(n)位隐式使用n(可能是给定邻接矩阵的图中节点数,或者可能是给定字符串的字符串中的字符数) ,那么运行时是多项式的,因为输入至少具有线性大小并且完成了线性工作。这就是为什么像DFS或BFS这样具有O(m + n)形式运行时间的算法在多项式时间内运行:输入中的位数是Ω(m + n)。
希望这有帮助!
答案 2 :(得分:0)
Techincally说for for循环或者就此而言,所有线性程序在它们的输入中都是指数级的,但是这并不是用来解释它们的运行时间,因为运行时被定义为输出变化的变化。在这些问题中,可以认为输入位的数量是常数,例如,您可能只为整数输入定义算法,因此其输入始终为32 bits
,因此即使n的值更改为位,也将其视为常量不要这么恒定的术语不能用来定义算法的增长,因此省略了。