[时间复杂度]关于时间复杂度的个人理解
时间复杂度
关于时间复杂度的相关知识:
对于一个算法(程序)而言 ,在时间复杂度方面观测的话,无非是整体运行时间长短不同
如何对一个算法/程序计时呢?
计时器、实际运算等方法在大型程序下显得无力。
针对一个算法实际测试
![时间复杂度[算法图样].png](http://192.168.7.180:529/usr/uploads/2020/01/2660049476.png)
试猜想这一段代码执行时间为多少?
再猜想 参数 n 如果变为 10,000 又会消耗多长时间?

假设
- 蓝条框内语句花费一个假设单位时间
- 黑条框内语句花费 n 个假设单位时间【在 for 中最后仍有一次比较】,所以消耗时间为 n+1
- 红色框内语句,因为执行了 n 次,有两条红色语句,所以耗费时间为 n+n
综合总结:
一共花费时间则是 3n+3 单位时间,用 T(n)表示函数执行时间长短,则得到:
T(n)=3n+3

总结函数执行时间长短与 n 成正比例关系(线性关系)
| 问题规模 n | 1 | 1000 | 10000 |
|---|---|---|---|
| 3n+3 | 6 | 3003 | 30003 |
| 3n | 3 | 3000 | 30000 |
| n | 1 | 1000 | 10000 |
有此可见 n变大时,低阶项影响变得可有可无
n再次变大时,最高阶项系数影响力也较小,
所以 简化函数后就会得到函数的大概趋势:
T(n)
剩下再次比较时间复杂度,就剩下简单的比较大小:

示例
简化后的式子被称为:时间复杂度,记作O(f(n))
O被记作时间复杂度,学名 “渐进上界” 。
for(int i=0;i<n;n++){
fmt.Printf("TEST语句");
}
上面的程序复杂度则为:“O(n)”
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
fmt.Printf("平方阶");
}
}
上面的程序复杂度则为:“O(n^2)”
一个更复杂的时间复杂度判断
int sum=1;
while( sum < n ){
sum = sum * 2;
}
此算法时间复杂度:" O( logn ) "
详解
sum = sum *2;
此语句每循环一次,sum就给自身乘2,乘了多少次跳出循环?【不知道】,我们设为x,所以2^x=n 。
由此可解 : x = logn ,这说明随着n增大,消耗时间的内层语句sum = sum*2消耗的时间趋势呈对数变化,所以 O( logn )


浙公网安备 33010602011771号