算法篇之第()幕——时间/空间复杂度详解(O(1)、O(n)、O(logn)、O(nlogn))

文章目录

  • 一、(渐进)时间复杂度 O ( n ) O(n) O(n)
    • 1、常数阶 O ( 1 ) O(1) O(1)
    • 2、线性阶 O ( n ) O(n) O(n)
    • 3、对数阶 O ( l o g O(log O(logn ) ) )
    • 4、线性对数阶 O ( O( O(n l o g log logn ) ) )
    • 5、平方阶 O ( n 2 ) O(n^2) O(n2)
  • 二、空间复杂度 S ( n ) S(n) S(n)
    • 1、 O ( 1 ) O(1) O(1)
    • 2、 O ( n ) O(n) O(n)
    • 3、 O ( n 2 ) O(n^2) O(n2)

一、(渐进)时间复杂度 O ( n ) O(n) O(n)

时间复杂度可以表示为: T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))

  其中 f ( n ) f(n) f(n)表示每行代码执行次数和, O O O表示正比关系,该公式称为算法的渐进时间复杂度。
算法是随着 n n n 的变化而变化的,算法可以简化为: T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n)
简化是因为这个表达式不是用来实际计算算法的执行时间的,只是表示代码执行时间的增长变化趋势

  对比一下几种常见的复杂度之前,先搞清楚 O ( l o g n ) O(logn) O(logn),这整个表示什么,其中 O ( ) O() O()中的 l o g n logn logn就是一个f(n),表示该时间复杂度,跟数据量有关,n就是输入的数据量。

公式 含义 示例
O ( 1 ) O(1) O(1) 常量,也就是说时间/空间复杂度跟输入的数据量无关,无论你输入多少数据,复杂度都一样 hash算法
O ( n ) O(n) O(n) 数据量扩大n倍,复杂度也扩大n倍 遍历
O ( n 2 ) O(n^2) O(n2) n个数排序,需扫描n*n次 冒泡排序
O ( l o g n ) O(logn) O(logn) 数据量扩大n倍时,耗时扩大 l o g n logn logn 二分查找,每次排除一半,16个数查找
O ( n l o g n ) O(nlogn) O(nlogn) 当数据量扩大256倍,那复杂度就是 8 ∗ l o g 8 = 2048 8*log8=2048 8log8=2048倍,比线性高,比平方低 归并排序

1、常数阶 O ( 1 ) O(1) O(1)

表示无论执行多少次,复杂度都是1。

	int i=0;
	int j=1;
	System.out.println("sum="+(i+j));

看上去消耗时间是3,简化后就是O(1)。

2、线性阶 O ( n ) O(n) O(n)

	for(int i=0;i<n;i++){
     
		System.out.println("i="+i);
	}

System.out会执行n遍,消耗时间随着n的增长而增长。

3、对数阶 O ( l o g O(log O(logn ) ) )

  在逛博客的时候看到一段代码,觉得很直观,可以看下:

	int score = 1;
	while(score < full){
     
		score = score*2;
	}

  怎么解释,就是score乘以2这个动作,进行x次以后,就会因为≥full而跳出循环,那就是说 2 x = n 2^x=n 2x=n,即 x = log ⁡ 2 n x=\log_2 n x=log2n,复杂度为 O ( l o g n ) O(logn) O(logn)

如果 2 x = n 2^x=n 2x=n , 也就是说 x = log ⁡ 2 n x=\log_2 n x=log2n,就是个对数函数,2就是以n为底的对数,a是底数,n是真数。
以n(真数)为自变量,指数为因变量,底数为常量的函数。

4、线性对数阶 O ( O( O(n l o g log logn ) ) )

  结合上面说的对数阶和线性阶也就容易理解了,其实就是把时间复杂度为 O ( l o g O(log O(logn ) ) )的代码循环n遍。

	for(int i=0; j<n; i++){
     
		j=1;
		while(j < n){
     
   			j = j*2;
   		}
	}

5、平方阶 O ( n 2 ) O(n^2) O(n2)

  就是把 O ( n ) O(n) O(n)的代码再嵌套一遍。

	for(int i=0; i<n; i++){
     
		for(int j=0; j<n; j++){
     
			System.out.println("sum="+(i+j));
		}
	}

二、空间复杂度 S ( n ) S(n) S(n)

  是对算法在运行过程中,将会临时占用存储空间大小的一个度量,同样也是主要反映一个趋势。

1、 O ( 1 ) O(1) O(1)

  所需临时空间不随着n的变化而变化。

	int i=0;
	int j=1;
	System.out.println("sum="+(i+j));

2、 O ( n ) O(n) O(n)

略。

3、 O ( n 2 ) O(n^2) O(n2)

略。

你可能感兴趣的:(算法,java,算法)