如何计算FOR循环标记会影响复杂性

时间:2016-04-07 21:02:52

标签: algorithm

假设我们有一个FOR循环

int n;

for (int i = 0; i < sqrt(n); i++)
{
    statement;
}

计算我的sqrt是否会增加循环的O(n)复杂度的复杂性?在我的例子中,Java中的sqrt函数的时间复杂度为O(log n),这如何影响循环的时间复杂度? sqrt函数是应用于循环的每个序列还是只应用一次,并且该值会被存储并再次使用?

4 个答案:

答案 0 :(得分:2)

我认为这可能取决于语言,但通常会在每次循环迭代后运行i < sqrt(n)检查,以便您有效地将其称为sqrt(n)次。好主意是将sqrt(n)结果存储在变量中并将其与i进行比较,所以

int n;
double sn = sqrt(n);

for (int i = 0; i < sn; i++)
{
    statement;
}

答案 1 :(得分:0)

sqrt函数适用于循环的每个序列。 n的使用虽然不同。 sqrt的O(logn)的复杂性n是值中的位数,但循环的O(n)n是实际值。根据{{​​1}}的定义,sqrt更像n

对于像这样的循环,像sqrt这样的数字操作的复杂性可以被视为常数时间。位数是有界的,因此与较大的循环相比,时间是无关紧要的。

答案 2 :(得分:0)

对于问题中给出的变量n,

O( log(d =变量位) * sqrt(n =循环中的数字)

假设找到n位(位)数字'sqrt是log(D),首先是'fgb'。

假设 n的位数在整个计算和所有硬件中都是常数,所以:

O(log(常数)* sqrt(n))

O(常数* sqrt(n))

O(SQRT(n))的

但如果它不是强类型的,并且如果n的位逐渐增加(例如从64位变为128到256位到1024但具有相同的值)那么它将是

O(日志(d)* SQRT(n))的

答案 3 :(得分:0)

回答有关时间复杂度的问题

每次迭代都会调用

sqrt(n),这需要额外的时间。

但由于sqrt(n)独立于istatement中的任何其他值,因此计算总是花费相同的时间。所以从我的理解来看,不会增加循环的复杂性,它仍然是O(n)。