算法笔记-复杂度分析1

本文深入探讨算法复杂度分析的重要性,介绍时间复杂度与空间复杂度的概念,详解其分析方法及常见实例,助您理解算法性能,提升代码效率。

算法复杂度分析

本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。

是什么
什么是算法复杂度分析?
  • 通过时间和空间两个维度来评估算法和数据结构的性能。
  • 用时间复杂度 (时间渐进复杂度) 和空间复杂度 (空间渐进复杂度)两个概念来描述性能问题,统称复杂度。
  • 算法复杂度描述的是算法执行时间以及占用空间与数据规模的关联关系
  • 算法复杂度分析是理论上的分析

为什么

为什么要做算法复杂度分析
  • 有种性能分析叫做 ‘事后统计法’ 该方法是在程序结束之后根据记录的运行时间,内存占用情况,分析出系统的性能。该方法的局限性就是极度依赖测试环境,测试数据的规模对测试结果影响很大。
  • 算法复杂度分析则不依赖于测试环境,成本低,效率高
  • 算法复杂度分析帮助我们了解程序的性能,指导我们编写高效率的代码

怎么办

如何表示时间算法复杂度
  • T(n)=O(f(n))T(n) = O(f(n))T(n)=O(f(n))表示,其中T(n)T(n)T(n) 表示代码执行的时间;nnn 表示数据规模的大小;f(n)f(n)f(n) 表示代码执行的总次数,公式中的 OOO,表示代码的执行时间 T(n)T(n)T(n)f(n)f(n)f(n)表达式成正比
算法时间复杂度分析方法
  • 算法时间复杂度全称:时间渐进复杂度,表示算法的执行时间与数据规模之间增长关系
  • 只关注循环次数最多的一段代码
    : 如果一段代码中包含一个 for 循环,则我们以 for 循环的执行次数 nnn 作为该段代码的时间复杂度,记为:O(n)O(n)O(n)
  • 嵌套代码的复杂度等于内层与外层代码复杂度之积
    : 如果一段代码中包含一个 for 循环,而这个 for 循环体中又包含了一个相同的 for 循环,那么时间复杂度就为:t(n)∗g(n)t(n) * g(n)t(n)g(n),假设t(n)=g(n2)t(n) = g(n^2)t(n)=g(n2),则最终时间复杂度记为:O(n3)O(n^3)O(n3)
  • 只关注复杂度量级最大的那段代码
    : 如果一段代码包含两个 for 循环,其中一个 for 循环体中再次包含一个 for 循环,则该段代码的时间复杂度应为:
    t(n)+g(n2)t(n) + g(n^2)t(n)+g(n2) 如果n足够大的时候,则t(n)t(n)t(n) 值可忽略不计,只取g(n2)g(n^2)g(n2) 的值,那么时间复杂度为:O(n2)O(n^2)O(n2)
常见算法时间复杂度实例
  • 常量阶O(1)O(1)O(1)
  • 对数阶O(logn)O(logn)O(logn)
  • 线性阶O(n)O(n)O(n)
  • 线性对数阶O(nlogn)O(nlogn)O(nlogn)
  • 平方阶O(n2)O(n^2)O(n2) 立方阶O(n3)O(n^3)O(n3)
  • 指数阶O(2n)O(2^n)O(2n)
  • 阶乘阶O(n!)O(n!)O(n!)
空间复杂度分析方法
  • 算法空间复杂度全称:空间渐进复杂度,表示算法的存储空间与数据规模之间增长关系
  • 算法空间复杂度分析比较简单直接,只需统计代码运行时需要申请的空间大小。
  • 常见的空间复杂度实例有O(1),O(n),O(n2)O(1),O(n),O(n^2)O(1)O(n)O(n2)
总结

初入算法复杂度分析,必是步履蹒跚,一路磕磕绊绊跌跌撞撞。看不懂别慌,也别忙着总结,先读五遍文章先,无他,唯手熟尔~
与诸君共勉

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值