时间复杂度和空间复杂度简单分析

我们在分析一个算法的优劣时,都离不开它的时间复杂度和空间复杂度。那么时间复杂度和空间复杂度到底是什么,又该如何分析呢。

                                           **时间复杂度**

时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系,并不是程序的执行时间。
分析时间复杂度需要引入大O复杂度表示法,接下来我们就学习怎样以大O复杂度表示法来分析时间复杂度。

大O复杂度表示法
我们先分析下面这段代码的执行时间

 int factorial(int n) {
	 int total = 1;
	 for(int i = 1; i <= n; ++i) {
		 total = i*total;
	 }
	 return total;
 }

上面是一段求阶乘的代码,我们假设CPU执行每一行代码的时间都是相同的为unit_time。从上面可以看出第2行代码执行一次需要1unit_time的时间,第3、4行代码各执行n次需要(2n)unit_time的时间。因此整个程序的执行时间T(n) = (2n + 1)unit_time的时间。 我们可以看出程序的执行时间T(n)和每行代码的执行次数成n正比
我们可以这样表示

T(n)= O(f(n))

其中T(n)表示程序的执行总时间,f(n)表示代码的执行次数,n表示数据规模。所以T(n) = O(2n + 1)当数据量非常大时我们可以忽略常数以及系数对T(n)的影响,所以程序的执行时间可表示为T(n) = O(n)。因为程序的执行时间和代码的执行次数成正比,因此我们可以用大O表示法来表示时间复杂度,从而判断一个程序的执行快慢。

分析方法
从上面可以看出,分析一个程序的时间复杂度我们可以用大O表示法来表示。而大O表示法体现的是代码的执行次数,并且将系数和常数项所忽略。因此分析一个程序的时间复杂度我们只需要分析整个程序中执行次数最多的那一段代码就可以了。
我们举几个例子分析一下

 int accumulation() {
	 int sum = 0;
	 for(int i = 0;i <= 10000; ++i) {
		 sum = sum + i;
	 }
	 return sum;
 }

上面这段代码是一个10000以内的累加,我们可以很容易的看出执行最多的代码次数是10000次。虽然10000这个数很大,但是时间复杂度它表示的是算法的执行时间与数据规模之间的增长关系。在这里10000它是一个常数,并没有增长关系。所以哪怕这个数再大,它的时间复杂度也是O(1)。

 i=1;
 while (i <= n)  {
   i = i * 2;
 }

我们可以很容易的知道,上面的这段程序第三行代码执行的次数是最多的,那么具体这行代码对执行多少次呢。从代码中我们可以看出i每一次都扩大为前面的两倍,而当i=n时循环结束,我们可以知道i的变化就是一个公比为2 的等比数列

2^0		2^1		2^2		……		2^k		……		2^x

我们假设2^x = n,所以x的值就是代码的执行次数,我们可以求出x = log2^n。
所以这段代码的时间复杂度为O(log2^n)又因为我们之前分析大O表示法忽略系数和常数,在这里我们同样也忽略底数。最终这段代码的时间复杂度表示为O(logn)。

常见的时间复杂度

常数阶O(1),
对数阶O(logn),
线性阶O(n),
线性对数阶O(nlogn),
平方阶O(n^2),
立方阶O(n^3)
k次方阶O(n^K),
指数阶O(2^n)
                                              **空间复杂度**

从上面我们知道时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。我们类比空间复杂度可以知道空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系
我们同样也分析一个具体的例子

void print(int n) {
  int i = 1;
  int[] a = new int[n];
  for (;i <= n;++i) {
    a[i] = i * 2;
  }
  for (i = n-1; i >= 0; --i) {
     System.out.println(a[i]);
  }
}

我们类比分析时间复杂度的分析方法来分析空间复杂度,从代码中我们可以知道程序的第2行申请了一个临时空间存储变量i,第3行我们申请了一个大小为n的空间来存储int类型的数组。同样的我们忽略系数和常数的影响,所以这段程序的空间复杂度可以表示为O(n)。

常见的空间复杂度有O(1)、O(n)、O(n^2),空间复杂度的分析相对来说比较简单,常用的情况比较少。想要熟练的掌握时间和空间复杂度的分析方法还需要勤加练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值