c循环函数计算时间复杂度
c loop function computing time complexity
我正在学习计算算法的时间复杂度。
可以计算简单循环和嵌套循环,但如果循环内有赋值,我该如何计算。
例如:
void f(int n){
int count=0;
for(int i=2;i<=n;i++){
if(i%2==0){
count++;
}
else{
i=(i-1)*i;
}
}
}
i = (i-1)*i
影响循环次数运行。如何计算此函数的时间复杂度?
由于 i * (i-1)
始终为偶数 ((i * (i-1)) % 2 == 0
),如果循环中 else 部分为真一次,则 i++
使 i
奇数。结果,在循环中的第一个奇数 i
之后,条件总是进入 else
部分。
因此,在第一次迭代之后,i
将等于 3
,这是奇数并且在 else
部分内,i
将增加i * (i-1) + 1
在每次迭代中。因此,如果我们用 T(n)
表示循环的时间复杂度,我们可以渐进地写成:T(n) = T(\sqrt(n)) + 1
。所以,如果 n = 2^{2^k}
, T(n) = k = log(log(n))
.
没有通用规则来计算此类算法的时间复杂度。你必须使用你的数学知识来获得复杂性。
对于这个特定的算法,我会这样处理。
由于最初 i=2 并且它是偶数,让我们忽略第一次迭代。
所以我只考虑从 i=3。从那时起,我将永远是奇怪的。
您的表达式 i = (i-1)*i
以及 for 循环中的 i++
最终计算为 i = (i-1)*i+1
如果将i=3视为第1次迭代,i(j)是第j次迭代中i的值,则i(1)=3。
还有
i(j) = [i(j-1)]^2 - i(j-1) + 1
上面的方程称为递归关系,有标准的数学方法可以求解它并得到 i 的值作为 j 的函数。有时有可能获得,有时可能非常困难或不可能。坦率地说,我不知道如何解决这个问题。
但一般来说,我们不会遇到需要您走那么远的情况。在实际情况下,我只是假设复杂度是对数的,因为 i 的值呈指数增长。
我正在学习计算算法的时间复杂度。 可以计算简单循环和嵌套循环,但如果循环内有赋值,我该如何计算。 例如:
void f(int n){
int count=0;
for(int i=2;i<=n;i++){
if(i%2==0){
count++;
}
else{
i=(i-1)*i;
}
}
}
i = (i-1)*i
影响循环次数运行。如何计算此函数的时间复杂度?
由于 i * (i-1)
始终为偶数 ((i * (i-1)) % 2 == 0
),如果循环中 else 部分为真一次,则 i++
使 i
奇数。结果,在循环中的第一个奇数 i
之后,条件总是进入 else
部分。
因此,在第一次迭代之后,i
将等于 3
,这是奇数并且在 else
部分内,i
将增加i * (i-1) + 1
在每次迭代中。因此,如果我们用 T(n)
表示循环的时间复杂度,我们可以渐进地写成:T(n) = T(\sqrt(n)) + 1
。所以,如果 n = 2^{2^k}
, T(n) = k = log(log(n))
.
没有通用规则来计算此类算法的时间复杂度。你必须使用你的数学知识来获得复杂性。
对于这个特定的算法,我会这样处理。
由于最初 i=2 并且它是偶数,让我们忽略第一次迭代。 所以我只考虑从 i=3。从那时起,我将永远是奇怪的。
您的表达式 i = (i-1)*i
以及 for 循环中的 i++
最终计算为 i = (i-1)*i+1
如果将i=3视为第1次迭代,i(j)是第j次迭代中i的值,则i(1)=3。 还有
i(j) = [i(j-1)]^2 - i(j-1) + 1
上面的方程称为递归关系,有标准的数学方法可以求解它并得到 i 的值作为 j 的函数。有时有可能获得,有时可能非常困难或不可能。坦率地说,我不知道如何解决这个问题。
但一般来说,我们不会遇到需要您走那么远的情况。在实际情况下,我只是假设复杂度是对数的,因为 i 的值呈指数增长。