假设我们有一个FOR循环
int n;
for (int i = 0; i < sqrt(n); i++)
{
statement;
}
计算我的sqrt是否会增加循环的O(n)复杂度的复杂性?在我的例子中,Java中的sqrt函数的时间复杂度为O(log n),这如何影响循环的时间复杂度? sqrt函数是应用于循环的每个序列还是只应用一次,并且该值会被存储并再次使用?
答案 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)
独立于i
或statement
中的任何其他值,因此计算总是花费相同的时间。所以从我的理解来看,不会增加循环的复杂性,它仍然是O(n)。