时间复杂度

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

算法-循环中的时间复杂度


情形一(累加)

for(int i=0; i<n; i++){
    // do something
}  

// 1.判断内层循环的复杂度
// 设t(i) 表示 第i次 循环内部的时间复杂度,如果内部时间复杂度一直为O(1)
//即
t(1)= O(1)
t(2)= O(1)
.....

// 2.找出执行次数与变量i的关系,通过循环的退出条件,找出t与n关系( 他们通过i关联)    
// 设t表示执行次数(t是变量,和上面的t函数没关系)
// 寻找i关于t的函数,观察表,有
i = f(t) = t 
i = n   // 退出条件
t = n  // 内层执行一次的时间复杂度为O(1),执行t次的时间复杂度t*O(1)=>O(t), 也就是O(n)

// 3.过程    
  0   +      O(1)  +     O(1) +   ....      O(1)     //一共n项
(i=0)        (i=1)        (i=2)   ....      (i=n)
一共t个O(1)   也就是 n * O(1)  即为O(n)

找规律:

执行次数i
00
11
22
nn
for(int i=0; i<n; i=i+3){
    // do something
}  

// 1.判断内层循环的复杂度
// 设t(i) 表示 第i次 循环内部的时间复杂度,如果内部时间复杂度一直为O(1)
//即
t(1)= O(1)
t(2)= O(1)
.....

// 2.找出执行次数与变量i的关系,通过循环的退出条件,找出t与n关系( 他们通过i关联)    
// 设t表示执行次数(t是变量,和上面的t函数没关系)
// 寻找i关于t的函数,观察表,有
i = f(t) = t*3 
i = n   // 退出条件
t*3 = n , =>  t=n/3 // 内层执行一次的时间复杂度为O(1),执行t次的时间复杂度t*O(1)=>O(t), 即O(n/3)
// 也就是O(n)

// 3.过程    
0      +      O(1)  +     O(1) +   ....      O(1)     //一共n/3项
(i=0)         (i=1)       (i=2)   ....     (i=n/3)
一共t个O(1)   也就是 n/3 * O(1),O(n/3) 也就是O(n)

找规律:

执行次数i
00
13
26
39
nn*3

情形二(累乘)

for(int i=1; i<n; i*=2){
    // do something
}


// 1.判断内层循环的复杂度
// 设t(i) 表示 第i次 循环内部的时间复杂度,如果内部时间复杂度一直为O(1)
//即
t(1)= O(1)
t(2)= O(1)
.....
    

// 2.找出执行次数与变量i的关系,通过循环的退出条件,找出t与n关系( 他们通过i关联)    
// 设t表示执行次数(t是变量,和上面的t函数没关系)
// 寻找i关于t的函数,观察表,有

i=f(t)=2的t次幂
i=n   // 退出条件
2的t次幂 = n  ,=> t=log(2)n ,//内层执行一次的时间复杂度为O(1), 所以时间复杂度为O(log(2)n)
//即O(log n)    
    
0      +      O(1)  +     O(1) +   ....      O(1)     //一共log(2)n项
(i=0)         (i=1)       (i=2)    ....     (i=log(2)n)
一共t个O(1)   也就是 log(2)n * O(1)O(log(2)n)  也就是O(log n)

找规律:

执行次数i
01
12
24
38
n2(n)

情形三(嵌套)

for(int i=0; i<n; i++){
   for(int j=0; j<i; j++){
    	 // do something
	}
}

// 对于  
for(int j=0; i<j; j++){
    
}
// 如果内存循环时间复杂度为O(1)
// 设t(i) 表示第i次的时间复杂度
// 时间复杂度为t(i)=i * O(1)


// 对于
for(int i=0; i<n; i++){
	// 时间复杂度为t(i)=i * O(1)
}


i = f(t) = t
t = n
// 即需要执行t=n次  
// 过程
 0    +   O(1)  +     (O(1) + O(1))  +   (O(1) + O(1)+ O(1))      +      .....
(i=0)     (i=1)           (i=2)                (i=3)                     (i=n)

所以总的时间复杂度为: 总共(1+n)*n/2O(1)   ,故时间复杂度为O(n的平方)          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值