何为算法之时间复杂度

时间复杂度

同空间复杂度相比,时间复杂度的分析要复杂一些。时间复杂度是指运行算法所需要的计算工作量,记作:
T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))

简单理解,时间复杂度就是执行语句的次数。也就是说,时间复杂度高则运行时间长,时间复杂度低则运行时间短。常见的时间复杂度有 O ( 1 ) 、 O ( n ) 、 O ( n 2 ) 、 O ( 2 n ) 和 O ( l o g 2 n ) O(1)、O(n)、O(n^2)、O(2^n)和O(log_2n) O(1)、O(n)、O(n2)、O(2n)和O(log2n)等如下图所示
我们还能据此对算法进行分类。T(n)=O(1)类算法称作"常数时间算法",T(n)=O(n)类算法称作"线性时间算法",T(n)= O ( l o g 2 n ) O(log_2n) O(log2n)类算法称作"对数时间算法"等。除此之外,还有幂对数时间算法、次线性时间算法和线性对数时间算法等。这些就交给大家自己去想去讨论,正好检验一下自己是否已经掌握。

讲到这里还没有讲如何计算T(n)。不知道大家是否还记得空间复杂度的判别方法,如果不记得也没关系,毕竟T(n)和S(n)的计算完全不一样。

时间复杂度的计算方法

  1. 先将每行代码的执行次数写下来,然后相加。
  2. 将算式中的所有常数项去掉。
  3. 保留算式中的最高阶项。
  4. 去掉最高阶项的系数。

解读时间复杂度的计算方法

是不是没有看懂?笔者刚开始接触时间复杂度的时候也对其算法百思不解一脸懵逼,又是列式子又是一堆专业名词,差点被"绕晕"。不过,人生在勤,不索何获?在经过大量的练习和实际应用后,笔者终于参透并总结出了上面的时间复杂度的计算方法。和空间复杂度一样,用以下Python 代码来表示读者就能看明白了。

python 复制代码
# 时间复杂度为1
a = 'Python'
# 时间复杂度为1
a = '1'
b = 'love'
c = 'you'
# 时间复杂度为n
for i in range(n):
    print(i)
# 时间复杂度为n^2
for i in range(n):
    for j in range(i):
        print(j)
# 时间复杂度为n^2
for i in range(n):
    for j in range(i):
        print((j))
#时间复杂度为n^3
for i in range(n):
    for j in range(n):
        for k in range(n):
            print(k)

注意

时间复杂度和空间复杂度一样,都只是算法运行时消耗时间的一个量度,而绝对

执行时间是无法计算的。

时间复杂度为 l o g n log_n logn

是否觉得很简单 易如反掌?那就让我们继续学习下一个时间复杂度吧:

python 复制代码
# 时间复杂度为(log n)
n = 64
while n >1 :
    n = n // 2  #取商
    print(n

运行结果

是否又觉得满腹疑团、如坠云雾?看,这段代码有一个 while 循环,而且每循环一次,n就要除以2然后取整,直到n不大于1。这个时候就应该想到log函数了,因这段代码和log函数的定义几乎一样。

因为
2 6 = 64 2^6=64 26=64

所以
l o g 2 64 = l o g 2 2 6 = 6 log_2 64 = log_2 2^6=6 log264=log226=6

由此可见,答案就是 O ( l o g 2 n ) , 即 O ( l o g n ) 。 O(log_2 n),即O(logn)。 O(log2n),即O(logn)。

由此我们可以得出结论:循环减半算法的时间复杂度为 O ( l o g 2 n ) O(log_2 n) O(log2n)

如果你实在理解不了这一段,那就记住结论吧。让我们继续看下一个时间复杂度 O ( 2 n ) O(2^n) O(2n)的代码:

python 复制代码
# 时间复杂度为2^n
def fib0nacci(n):
# 当n为负数时
   if n<0:
       return 'invalid n' # 返回'invalid n'的错误提示
   # 当n==0 和 n==1时
   elif n<2:
       return n   #返回 n本身
   return fib0nacci(n-1) +fib0nacci(n-2)  #返回前两项的和

这是一个超级经典的算法,叫斐波那契数列,后面的文章还会讲到它,这里只是先让大家有个印象。由于上述代码使用了递归策略,所以它的时间复杂度是高度为(n-1)的不完全二叉树的节点数,近似为 O ( n 2 ) O(n^2) O(n2)。

注意

T(n) 是最坏情况复杂度。还有一种平均情况复杂度,一般在指定情况下使用。为了避免混淆,这里也不讲解,如果有兴趣可自行学习。

总结

了解了空间复杂度和时间复杂度之后,我们便可以据此对一个算法进行衡量。然而,所谓鱼和熊掌不可兼得,空间复杂度和时间复杂度也时常处在此消彼长的状况,这时候就需要我们选取一个平衡点,以达到最佳的效率。

相关推荐
王小王-1236 分钟前
基于Python的车联网数据聚合与可视化分析平台设计与实现
python·车联网·新能源汽车·车联网聚合分析
dtq042415 分钟前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
拉勾科研工作室21 分钟前
区块链工程毕业论文题目【249个】
开发语言·javascript
郭梧悠26 分钟前
Hash算法入门Hash冲突解决方案
算法·哈希算法
叫我:松哥33 分钟前
基于Flask框架的校园二手书籍交易平台,注重校园场景的特殊需求,通过学号认证保障用户真实性
后端·python·sqlite·flask·bootstrap
namexingyun1 小时前
开源前端生态如何成为 AI UI 生成的“燃料“:shadcn/ui、Tailwind CSS、Storybook 技术价值全解剖
java·前端·人工智能·python·ui·开源·ai编程
通信仿真爱好者1 小时前
第【17】期--考虑硬件损伤和不完美CSI的RIS-MISO系统的深度强化学习联合优化-python完整代码+参考文献
python·深度强化学习·ris
装不满的克莱因瓶1 小时前
自然语言处理常见任务——从文本理解到生成式AI的完整任务体系
人工智能·pytorch·python·深度学习·ai·自然语言处理
z落落1 小时前
C#WinForm控件实战:Panel与单选框动态创建
开发语言·c#
ptc学习者1 小时前
python 中描述符@property property 大概的样子
开发语言·python