java时间复杂度和空间复杂度详解

文章目录

  • 前言
  • 一、时间频度介绍
  • 二、时间频度分析
    • 1.分析算法中的时间频度
    • 2.结果
  • 三、时间复杂度介绍
  • 四、计算时间复杂度的方法
    • 1.方法
    • 2.示例
  • 五、时间复杂度分析
    • 1.分析算法中的时间复杂度
    • 2.结果
  • 六、常见的时间复杂度
    • 1.常数阶O(1)
    • 2.对数阶O(log~2~n)
    • 3.线性阶O(n)
    • 4.线性对数阶O(nlog~2~n)
    • 5.平方阶O(n^2^)
    • 6.立方阶O(n^3^)
    • 7.指数阶O(2^n^)
  • 六、空间复杂度介绍
  • 七、空间复杂度分析
    • 1.分析算法中的空间复杂度
    • 2.结果
  • 总结

前言

时间复杂度和空间复杂度看起来就像数学中的一些公式,初次接触感觉可能会很难,因为我们总是会情不自禁的想像学数学那样通过推演它来理解它,其实并不需要如此,本文会介绍如何轻松的理解它们。

一、时间频度介绍

一个算法中语句的执行次数称为时间频度,记为T(n)。

二、时间频度分析

1.分析算法中的时间频度

private static void test() {
     
		int n = 10;
		for(int i=0;i<n;i++){
     
			System.out.println(i);
		}
	}

2.结果

时间频度为T(n)=n+1,n是算法的规模。示例中算法的规模为10,为何结果是11而不是10,这是因为i

三、时间复杂度介绍

一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)为T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

四、计算时间复杂度的方法

1.方法

1)用常数1代替时间频度函数中的常数项。
2)只保留时间频度函数中最高阶项,去掉其它低次项。
3)去掉最后保留项的系数。

2.示例

由上述方法可知,T(n)=n2+7n+6和T(n)=3n2+2n+2它们的T(n)不同,但时间复杂度相同,都是O(n2)

五、时间复杂度分析

1.分析算法中的时间复杂度

private static void test() {
     
		int n = 10;
		for(int i=0;i<n;i++){
     
			System.out.println(i);
		}
	}

2.结果

前面已经分析出算法的时间频度为T(n)=n+1,通过计算时间复杂度的方法可得出时间复杂度为O(n)=n。

六、常见的时间复杂度

1.常数阶O(1)

private static void test() {
     
		int i = 1;
		int j = 2;
		int m = i + j;
		System.out.println(m);
	}

2.对数阶O(log2n)

private static void test() {
     
		int i = 1;
		int n = 8;
		while(i<n){
     
			i *= 2;
		}
		System.out.println(i);
	}

3.线性阶O(n)

private static void test() {
     
		int n = 10;
		for(int i=0;i<n;i++){
     
			System.out.println(i);
		}
	}

4.线性对数阶O(nlog2n)

private static void test() {
     
		int n = 10;
		for (int i = 0; i < n; i++) {
     
			int j = 1;
			while (j < n) {
     
				j *= 2;
			}
		}
	}

5.平方阶O(n2)

private static void test() {
     
		int n = 10;
		for (int i = 0; i < n; i++) {
     
			for (int j = 0; j < n; j++) {
     
				System.out.println(i * j);
			}
		}
	}

6.立方阶O(n3)

private static void test() {
     
		int n = 10;
		for (int i = 0; i < n; i++) {
     
			for (int j = 0; j < n; j++) {
     
				for (int k = 0; k < n; k++) {
     
					System.out.println(i * j * k);
				}
			}
		}
	}

7.指数阶O(2n)

private static int fibonacci(int n) {
     
		if(n<=1){
     
			return 1;
		}else{
     
			return fibonacci(n-1)+fibonacci(n-2);
		}
	}

六、空间复杂度介绍

类似于时间复杂度的分析,一个算法的空间复杂度定义为该算法所耗费的存储空间,它也是问题规模n的函数,渐进空间复杂度简称为空间复杂度。

七、空间复杂度分析

1.分析算法中的空间复杂度

private static void test() {
     
		int n = 10;
		for(int i=0;i<n;i++){
     
			System.out.println(i);
		}
	}

2.结果

跟时间复杂度的分析类似,该算法所占用的空间在运行过程中始终是不变的,也就是算法所占用的空间不随问题规模n的变化而变化,由此可得知算法的空间复杂度为O(1),其它各种类型的空间复杂度分析也与时间复杂度的分析类似。

总结

学会了时间复杂度和空间复杂度的分析,我们才算是正式步入了算法学习的大门,不管前路再艰难,我都会坚定不移的走下去。

你可能感兴趣的:(数据结构与算法,数据结构,算法,java)