Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c循环函数计算时间复杂度_C_Algorithm_Time Complexity - Fatal编程技术网

c循环函数计算时间复杂度

c循环函数计算时间复杂度,c,algorithm,time-complexity,C,Algorithm,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; } } } void f(int n){ 整数计数=0; 对于(int

我正在学习计算算法的时间复杂度。 可以计算简单循环和嵌套循环,但是如果循环中有赋值,如何计算。 例如:

void f(int n){
    int count=0;
    for(int i=2;i<=n;i++){
        if(i%2==0){
            count++;
        }
        else{
            i=(i-1)*i;
        }
    }
}
void f(int n){
整数计数=0;
对于(inti=2;iAs
i*(i-1)
一直是偶数(
(i*(i-1))%2==0
),如果循环中的else部分有一次为真,
i++
使
i
成为奇数。因此,在循环中的第一个奇数
i
之后,条件总是进入
else
部分


因此,与第一次迭代后一样,
i
将等于
3
,这是奇数,进入
else
部分,
i
将增加
i*(i-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为第一迭代,i(j)是j在j次迭代中的值,则i(1)=3。 也

i(j)=[i(j-1)]^2-i(j-1)+1

上面的方程称为递推关系,有标准的数学方法来求解它,得到i作为j的函数的值。有时可能得到,有时可能非常困难或不可能。坦率地说,我不知道如何求解这个方程


但通常情况下,我们不需要走那么远。在实际情况下,我只会假设复杂性是对数的,因为I的值是指数增长的。

我不认为这有一个一般的规则。在这种情况下,
I
似乎每隔一次迭代就会加倍,所以这应该是正确的大概是O(logn)。指数增长表示对数增长吗?对不起,我对这个问题有点陌生。你能更详细地解释一下吗?@tobias_k