求复杂的时间复杂读方法(假设法)

其实求时间复杂度的方法就是找出执行得最多的语句然后判断其量级罢了,只是有时候不太容易直接看出来,所以需要用假设的方式辅助辅助

for(int i=0;i<n;i=i*3)
    cout<<"hehe"<<endl;

如上这段代码,执行最频繁者不过是那句输出语句罢了,执行了多少次呢?我们按以下方法推演便知:

执行次数                    i的值

1                                  3

2                                  3**2

3                                  3**3

....                                 ....

k                                 3**k

假设执行到k次的时候结束,结束条件是3**k大于等于n了,方便计算,我们取等于既是:3**k=n。k就是我们要求的时间复杂度!

由此我们可以推出,上述例子的时间复杂度为log3n。

那么有时候是递归的函数怎么解?如下例子

void f(int n){
    if(n==0) return;
    else return f(n/3);
}

其实和上面的例子一样,我们也是按照递推的方式推演得出结果:

执行次数                              n的值(或者在此递归传入的值)

1                                                   n

2                                                   n/3

3                                                   n/(3**2)

,,,                                                   ....

k                                                   n/(3**k)

当n等于0的时候结束循环,为方便计算,我们取k=0时候结束.(此处描述不太准确,意会即可)

n/(3**k)=1 我们还是可以解出时间复杂度为log3n

最后来一个稍稍难一点的:

int i=0;
int s=0;
while(s<n){
    i++;
    s=s+i;
}

执行次数                   i的值              s的值

1                                     1                    1

2                                     2                    1+2

3                                     3                    1+2+3

...                                    ...                    ...

k                                     k                     1+2+3+...k

1+2+3+...+k=n

(1+k)K/2=n

k=sqrt(n)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章