三步分析法之复杂度分析,让你对复杂度不在迷茫!

复杂度是什么?

我们大家都知道,学习数据结构和算法是相让给代码运行的更快而且运行时占用更少的内存,但是我们需要怎么去衡量这个快和慢呢?这里我们先说一下执行效率的这个定义,执行效率是用来衡量一个算法好坏的一个指标,而复杂度就是用来衡量一个算法的执行效率,所以现在应该对复杂度有了一个简单的理解了吧。

光知道这些其实还是不够的,我们还得知道复杂度都有哪些,其实复杂度分为两类,一类是事件复杂度,一类是空间复杂度。

那么什么是时间复杂度呢?

其实时间复杂度并不表示代码真正的执行时间,时间复杂度又叫做渐进时间复杂度,他表示的是代码执行时间随着数据规模的变化趋势,大家可能对这个数据规模不太了解,简单的举个例子,大家都写过for循环,中间那个i < n这个n就代表了一个数据规模。所以再次强调,时间复杂度是代码执行时间随着数据规模的变化趋势并不代表着真正的执行时间。

那么空间复杂度就是表示算法存储空间与数据规模之间的增长关系。简单举一个例子吧。

public void reverse(int[] a,int n){
   int[] temp = new int[n];
   for(int i = 0;i < n;i++){
      temp[i] = a[n-i-1];
   }
   for(int i = 0;i < n;i++){
      a[i] = temp[i];
   }
}

先来看第三行代码,申请了一个空间用来存储i,但是i是一个常量阶,并不是一个数据规模,所以i所占用的存储空间并不随着数据规模的变化而变化。下面再看第二行代码,申请了一个大小为n的数组,除此之外就没有占用多余的存储空间,所以空间复杂度为O(n)。 

为什么要进行复杂度分析?

我们为什么不通过一些手段来检测代码执行的时间和用了多少空间呢?为什么还要做时间复杂度分析和空间复杂度分析呢?其实道理很简单,一些代码的测试结果受测试环境的影响,什么意思呢》就是硬件的好坏或者简单说就是你的电脑配置的好坏,当然配置好的电脑运行速率就高了,另一方面是测试结果受测试数据的影响比较大,这个大家先记住就行。

怎样进行复杂度分析?

这里我们首先需要了解一下什么是大O复杂度表示法。简单的说,就是表示复杂度的一种方法。那么怎么进行表示呢?

我们只要把这个公式给弄明白就可以了。

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

n之前我们说过,表示数据规模,f(n)表示每条语句执行次数的累加和,什么意思呢,看看上面那一段代码,假设每条语句执行的时间相同,我们假设为unit_time,那么3,4,7,8行代码执行的时间就为4n*unit_time,此时的f(n) = 4n+1,那么用大O表示就为T(n) = O(4n+1)。

也就是说这个值与n有关,用f(n)这样一个表达式来表示。

不够这还不是最简的表示方法,关于这一点,大家只要记住,公式中的低阶,常量,系数三部分可以省略,也就是说,上面可以写成O(n)。

这篇文章和我之前写的是匹配的,大家一定要将两者结合再一起看,相信收获一定很大。!!!

一定要看!!!

复杂度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值