java笔试攻略——Base系列(时间复杂度和空间复杂度)

首先明确,时间复杂度和空间复杂度都不是指一个具体的数值,只是用来估算的比较接近实际的函数
时间复杂度:一个算法执行所耗费的时间
n表示基本操作模块被执行的次数,时间复杂度常用大写O符号表示,叫做大O阶记法
1 用常数1表示运行时间中加法常数
2 在最后算出的运行次数函数中,只保留高阶项
3 如果高阶项存在且不是1,则去除它的常数系数

int n = 100000; //执行了1次
	for(int i = 0; i < n; i++){  //执行了n+1次
	  for(int j = 0; j < n; j++) //执行了n*(n+1)次
	  {
	      printf("i = %d, j = %d", i, j); //执行了n*n次
	  }
	}

	for(int i = 0; i < n; i++){  //执行了n+1次
	  printf("i = %d", i); //执行了n次
	}

	printf("Done"); //执行了1次

第一步:用常数1取代运行时间上所有加法常数,执行总次数 = 2n^2 + 3n + 1;
第二步:保留最高项,执行总次数 = 2n^2
第三步:最高项存在,且不是1,去除它的常数系数,执行总次数 = n^2;
所以最后的出的算法时间复杂度为:O(n^2)

经验总结:
当程序中出现一层for循环时,时间复杂度是n,当出现了两层for循环时,时间复杂度是n^2,但是
如果其中在循环体里面,控制循环参数i发生了变化时,就要详细对时间复杂度进行计算。
有时候可以利用归纳法
如:嵌套一层for循环的时间复杂度为:O(n),二层for循环为O(n^2),二分的算法时间复杂度为:O(logn),如果一个for循环套一个二分,那么时间复杂度为O(nlogn);
常见的时间复杂度
O(1),O(logn),O(n),O(n^2)
空间复杂度:运行完一个程序所需内存的大小
当一个算法的空间复杂度为一个常量,即不随处理数据量n的变化而变化时,可表示为O(1)
当一个算法的空间复杂度以2为底的n的对数成正比时,可表示为log2n
当一个算法空间复杂度与n成线性比例关系时,可表示为O(n)

时间复杂度和空间复杂度都取到最小的情况是不存在的,小的时间复杂度必定会带来大的空间复杂度,大的空间复杂度可以减少时间复杂度,具体如何取舍就看自己的权衡了,一般情况下,
我们都会选择牺牲空间复杂度换取更高的代码运行效率。

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