算法复杂度的计算

做题的时候看到计算时间复杂度,知识点已经模糊的什么都不清楚了,找了一些文章看,但是感觉都好书面化,重新整理一下

算法复杂度分为时间复杂度和空间复杂度。时间复杂度是指执行算法所需要的执行次数;而空间复杂度是指执行这个算法所需要的内存空间。

大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

如果是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,里面的语句就能执行多次,即 l o g 2 n log_{2}n log2n

那么在计算执行次数用大O表示法表示时,若计算出来为对数,比如说 l o g 2 n log_{2}n log2n 那么为O(logn)
对数阶一般省略底数,不管是 l o g 2 n log_{2}n log2n还是 l o g 9 n log_{9}n log9n,都统称为logn

for(int i=1; i<n; i=i*2) {
			for(int j=0;j<n;j++) {
				System.out.println("test");
			}
		}

计算为1+2* l o g 2 n log_{2}n log2n+ l o g 2 n log_{2}n log2n*(1+3n)
为O(nlogn)

排序: O(1)

空间复杂度:
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)

你可能感兴趣的:(算法复杂度的计算)