[时间复杂度]关于时间复杂度的个人理解

时间复杂度

关于时间复杂度的相关知识:
对于一个算法(程序)而言 ,在时间复杂度方面观测的话,无非是整体运行时间长短不同
如何对一个算法/程序计时呢?
计时器、实际运算等方法在大型程序下显得无力。

针对一个算法实际测试

时间复杂度[算法图样].png
试猜想这一段代码执行时间为多少?
再猜想 参数 n 如果变为 10,000 又会消耗多长时间?

时间复杂度1.png
假设

  • 蓝条框内语句花费一个假设单位时间
  • 黑条框内语句花费 n 个假设单位时间【在 for 中最后仍有一次比较】,所以消耗时间为 n+1
  • 红色框内语句,因为执行了 n 次,有两条红色语句,所以耗费时间为 n+n

综合总结:

一共花费时间则是 3n+3 单位时间,用 T(n)表示函数执行时间长短,则得到:
T(n)=3n+3

时间复杂度1-2.png
总结函数执行时间长短与 n 成正比例关系(线性关系)

问题规模 n 1 1000 10000
3n+3 6 3003 30003
3n 3 3000 30000
n 1 1000 10000

有此可见 n变大时,低阶项影响变得可有可无
      n再次变大时,最高阶项系数影响力也较小,
所以 简化函数后就会得到函数的大概趋势:
  T(n)

剩下再次比较时间复杂度,就剩下简单的比较大小:
时间复杂度1-3.png


示例

简化后的式子被称为:时间复杂度,记作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 )
时间按复杂度2-1.png

posted @ 2020-04-06 21:36  Stonegarlics  阅读(297)  评论(0)    收藏  举报