算法复杂度(时间复杂度与空间复杂度)

作为一个码农,我的希望的是写出来的代码,灰常的优秀~
那么如何衡量一段代码是否优秀呢?当然是看功能是否完善,运行是否正常,容错机制是否强大,bug特别少,还有一个非常重要的点就是要搞笑,哦不,是高效

衡量代码是否高效,那我们就把代码拉出来跑一跑喽~然后掐个秒表还不是美滋滋,当然这是不可能的!首先人类脑子的反应速度真的跟计算机没法比,更重要的是,不同的运行环境代码的运行效率差别是非常大的。比如你拿神威太湖之光跟我的神船跑一跑,虽然我的神船也有一个神字,但是神威还是惹不起~

那么究竟该如何衡量一段代码的效率是否高效呢?我们用一个叫做算法复杂度的东西来衡量代码的运行效率。算法复杂度又分为时间复杂度和空间复杂度。

首先我们来聊聊时间复杂度,什么叫做时间复杂度呢?时间复杂度其实就是一个函数,该函数计算的是执行操作的总次数。

算法存在最好、平均和最坏情况。
最坏情况:任意输入规模的最大运行次数(上界)。
平均情况:任意输入规模的期望运行次数。
最好情况:任意输入规模的最小运行次数,通常最好情况不会出现。(下界)

在实际中通常关注的是算法的最坏运行情况,即:任意输入规模N,算法的最长运行时间。

一个算法语句总的执行次数是关于问题规模N的某个函数,即为f(N),N称为问题规模。语句总的执行次数记为T(N),当N不断变化时,T(N)也在变化,算法执行次数的增长速率和f(N)的增长速率相同。则T(N)=O(f(N)),称O(f(N))为时间复杂度的大O渐进表示法

一般O(n)计算方法:
用常数1取代运行时间中所有加法常数。
在修改后的运行次数函数中,只保留最高阶项。
如果最高阶项系数存在且不是1,则去除与这个项相乘的常数。

递归算法时间复杂度:递归总次数*每次递归次数
这里写图片描述

时间复杂度的基本概念就这么多了,接下来我们来聊聊空间复杂度。

空间复杂度:函数中创建对象的个数关于问题规模函数表达式,一般情况下也用O渐进表示法表示。

递归算法的空间复杂度:递归的深度*递归创建空间的大小。