时间复杂度与空间复杂度

这里我们不说时间复杂度与空间复杂度是如何推理得到的,我们来点硬货,直接看代码,得到时间和空间复杂度,大家自己在平常的练习中要习惯性的分析一下时间复杂度与空间复杂度,在面试的时候会很有用处的。

1、时间复杂度

:时间复杂度主要看函数的运行次数,且只看最高位的时间复杂度,常数位置忽略

## 1.1常数复杂度O(1)

如下代码,代码只执行了一次,所以它的时间复杂度是O(1)
在这里插入图片描述
再看下面这段代码,虽然它执行了3次但是3是常数,所以它的时间复杂度依旧是O(1)
在这里插入图片描述

## 1.2线性时间复杂度O(n)

如下代码,当n=1,它就运行1次,此时时间复杂度为O(1), n = 100 运行100次,时间复杂度为O(100),n = 100000000…它就运行1亿次,所以随着n得不同它执行得次数也不同,它的时间复杂度和n是成线性关系的,所以我们把它叫做O(N),n等于它的执行次数,它的运行复杂度就是n的一次方,所以叫做O(N)线性的时间复杂度。
在这里插入图片描述
上面的代码已经是段成熟的代码了,它学会了套路,于是…如下代码,这样子这行代码就执行了nn次也就是n的平方,于是它的时间复杂度为O(n^²)。
简而言之,如果是嵌套的话,比如如上代码是3层嵌套那就是n
n*n那就是n的三次方了,那就是O(N^3),所以我们只看最高位的,但是只要是并列的,没有嵌套那时间复杂度就是O(N)

在这里插入图片描述
那如果它没把自己给套路而是下面这样呢,这样子每段代码都执行了n次,总共是2n次,也就是O(2n)
但是时间复杂度里我们忽略常数,这里的2就是常数,我们只看最高位的时间复杂度,所以下面的代码时间复杂度是O(n)
在这里插入图片描述

1.3对数复杂度O(log N),注:log默认的底数为2
如下代码,
如果 n = 2 ,执行1次,如果n=4的话,那么只会执行2次,n =8 ,执行3次,那么这个函数体的执行次数永远是它的log2n,所以它的复杂度就是O(log N)的
在这里插入图片描述
1.4递归函数的复杂度
递归的时间复杂度,其实就是k的n次方,这里的k是一个常数,可以认为是2的n次方或者3的n次方其实是一样的,例如简单的求递归fibonacci的话它是很慢的,指数级的时间复杂度
在这里插入图片描述
这里说一下递归时间复杂度的分析方法。递归它不像循环那样执行了多少次,就很直观。
递归的话它层层嵌套,把递归它的执行顺序画出这么一个树的结构,我们称之为,递归状态的递归树。
在这里插入图片描述
以上图中的例子分析,下图中的n我们取6。要计算6的话,f6 = f5 + f4 也就是说计算f6至少的计算一个f5和一个f4,那么计算一个f5 需要计算一个f4 + f3一次类推…最终结果下图这样。
在这里插入图片描述
以上图来自覃超老师…
这样我们可以看到两个现象:
现象1:指数级
它每展开一层,运行的节点数就是上面一层的2倍,第一层只有一个节点,第二层有两个节点,第三层有2的2次方也就是4个节点,那么再下一层就是8个节点。所以每一层它的节点数,也就是执行次数是按指数级递增的,所以下到最后一层的话它就变成了2的n次方大概这么一个数量级的节点。那么肯定最后执行次数就变成指数级了。所以该递归的时间复杂度大约是26。
现象2:有重复的节点
我们可以发现中间有很多的节点被重复计算,导致了大量冗余的计算,所以面试中不要这么写,可以加一个缓存,把中间的数据缓存下来,或者用一个循环去实现这个递归。

其实不同的递归,它的时间复杂度也是不尽相同的。有下面这个方法帮我们去直接记忆。
主定理,它是用来解决所有的递归函数的时间复杂度。
在这里插入图片描述
上图都是面试或者工作中经常用到的
1、 二分查找O(log(n))
2、 二叉树遍历O(n)
3、 二维矩阵(排好序的二维矩阵) O(n)
4、 归并排序O(n log n)

注意1:所以如果是一维的数组进行查询那么就是log(n),如果是二维的有序矩阵进行查找,因为被降了一维所以就不是指数的算法而是O(n)的算法。
注意2:所有排序的办法的最优解就是n log n

2、空间复杂度

1、数组的空间复杂度:数据的长度
2、递归的空间复杂度:递归的深度

1、 如果代码离开了数组,那么数组的长度基本上就是空间复杂度。
比如开了一个一维数组,那么它的长度为传入的元素的个数,那么它的空间复杂度就是O(n)的。如果开的是二维数组,它的数组的长度为n2,那么空间复杂度基本上就是n2.
2、 如果是有递归的话,那么递归的最深的深度就是时间复杂度。
3、 如果即开了数组又开了递归,那么两者之间的最大的空间复杂度就是你的空间复杂度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值