做题的时候看到计算时间复杂度,知识点已经模糊的什么都不清楚了,找了一些文章看,但是感觉都好书面化,重新整理一下
算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行算法所需要的执行次数;而空间复杂度是指执行这个算法所需要的内存空间。
大O表示法,一般用大O表示法来描述复杂度,它表示的是数据规模对应的复杂度,忽略常数、系数、低阶
下面举一些简单例子来算一下(只是为了方便理解)
时间复杂度:
1.if判断
if(n>10) {
System.out.println("n>10");
}else if(n>5){
System.out.println("n>5");
}else {
System.out.println("n<=5");
}
这个执行次数为1,用大O表示法的话就是 O(1)
if()里面的判断我们就不算了,哪怕写的再多,因为也只会执行一次
2.for循环
for(int i=0;i<n;i++) {
System.out.println("test")
}
这个的计算是i=0语句算1次,i<n语句会是n次,i++也会执行n次,for循环里面的语句System.out.println(“test”)也会是n次,所以为(1+n+n+n),大O表示法即为 O(n)
如果是for循环嵌套,如下例,计算为1+n+n+n*(1+n+n+n) =1+3n+3n^2
外面的for循环和上面一样,里面的for循环也要执行n次,括号中是里面的for循环语句计算
就是O(n^2) 忽略低阶
for(int i=0;i<n;i++) {
for(j=0;j<n;j++) {
System.out.println("test");
}
}
如果里面的n变为了具体数据如5,10之类的,方法相同计算
3.while循环
while((n=n/2)>0) {
System.out.println("test");
}
如果是while的话,就不算判断语句了,看里面语句执行多少次
上面的例子相当于n能除多少次2,里面的语句就能执行多次,即
那么在计算执行次数用大O表示法表示时,若计算出来为对数,比如说 那么为O(logn)
对数阶一般省略底数,不管是 还是 ,都统称为logn
for(int i=1; i<n; i=i*2) {
for(int j=0;j<n;j++) {
System.out.println("test");
}
}
计算为1+2*+*(1+3n)
为O(nlogn)
排序: O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)
空间复杂度:
1.例子看上面的for循环的第一个代码
这个代码的空间复杂度就是看占多少的存储空间,这一句代码只定义了一个变量i,也就是只占了一个int类型,说明空间复杂度我们可以认为是O(1)
public static void test1(int n) {
int a=10;
int b=20;
int c=a+b;
int[] array=new int[n];
for(int i=0;i<array.length;i++) {
System.out.println("test");
}
}
前三行都是常数项,只有数组才涉及到n,需要多少个就向堆空间申请多少个
为O(n)