标签:来源 因此 不用 判断 detail 程序 blog 运行时 相互
小白的我总是搞不清楚
因此做个整理(来源http://data.biancheng.net/view/2.html)
算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来的可以运行的代码。
时间复杂度
由于是估算算法的时间复杂度,相比而言,循环结构对算法的执行时间影响更大。
所以,算法的时间复杂度,主要看算法中使用到的循环结构中代码循环的次数(称为“频度”)。次数越少,算法的时间复杂度越低。
a) ++x; s=0;
b) for (int i=1; i<=n; i++) { ++x; s+=x; }
c) for (int i=1; i<=n; i++) { for (int j=1; i<=n; j++) { ++x; s+=x; } }
上边这个例子中,a 代码的运行了 1 次,b 代码的运行了 n 次,c 代码运行了 n*n 次。
算法的时间复杂度的表示方式为:
这种表示方式称为大“O”记法
。
对于上边的例子而言,a 的时间复杂度为O(1)
,b 的时间复杂度为O(n)
,c 的时间复杂度为为O(n2)
。
如果a、b、c组成一段程序,那么算法的时间复杂度为O(n2+n+1)
。但这么表示是不对的,还需要对n2+n+1
进行简化。
简化的过程总结为3步:
所以,最终a、b和c合并而成的代码的时间复杂度为O(n2)
。
几种常见的算法时间复杂度的比较(又小到大):
O(1)常数阶
< O(logn)对数阶
< O(n)线性阶
< O(n2)平方阶
< O(n3)(立方阶)
< O(2n) (指数阶)
代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)。
int[] m = new int[n]
for(i=1; i<=n; ++i)
{
j = i;
j++;
}
这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)
原文链接:https://blog.csdn.net/jsjwk/article/details/84315770
标签:来源 因此 不用 判断 detail 程序 blog 运行时 相互
原文地址:https://www.cnblogs.com/cupe/p/11743061.html