当前位置: 首页 > article >正文

[数据结构与算法·C++] 笔记 1.4 算法复杂性分析

1.4 算法复杂性分析

算法的渐进分析

  • 数据规模 n 逐步增大时, f(n)的增长趋势
  • 当 n 增大到一定值以后,计算公式中影响最大的就是 n 的幂次最高的项
  • 其他的常数项和低幂次项都可以忽略

大O表示法

  • 函数f,g定义域为自然数,值域非负实数集
  • 定义: 如果存在正数c和n,使得对任意的 n > = n 0 n >=n_0 n>=n0,都有 f ( n ) ≤ c g ( n ) f(n)≤cg(n) f(n)cg(n)
  • f ( n ) f(n) f(n) 在集合 O ( g ( n ) ) O(g(n)) O(g(n)) 中,简称 f ( n ) 是 O ( g ( n ) ) f(n)是 O(g(n)) f(n)O(g(n)) 的, 或 f ( n ) = O ( g ( n ) ) f(n)= O(g(n)) f(n)=O(g(n))
  • 大 O 表示法: 表达函数增长率上限
  • 一个函数增长率的上限可能不止一个
  • 当上、下限相同时则可用 Θ 表示法(大O最常用, 大Θ也可简单看作大O)

大O表示法的单位时间

  • 简单布尔或算术运算

  • 简单 I/O

    • 指函数的输入/输出
    • 例如,从数组读数据等操作
    • 不包括键盘文件等 I/O
  • 函数返回

大 O 表示法的运算法则

  • 加法规则: f 1 ( n ) + f 2 ( n ) = O ( m a x ( f 1 ( n ) , f 2 ( n ) ) ) f_1(n)+f_2(n)=O(max(f_1(n),f_2(n))) f1(n)+f2(n)=O(max(f1(n),f2(n)))

    • 顺序结构,if 结构,switch 结构
  • 乘法规则: f 1 ( n ) ⋅ f 2 ( n ) = O ( f 1 ( n ) ⋅ f 2 ( n ) ) f_1(n)·f_2(n) =O(f_1(n)·f₂(n)) f1(n)f2(n)=O(f1(n)f2(n))

    • for, while, do-while 结构 (复杂度相乘)
    • 例如:
      for(i=0; i<n; i++)
        for (j=i; j<n; j++)
          k++;
      
      • 上述两个循环的复杂度为 n 2 = n ⋅ n n^2=n \cdot n n2=nn

大Ω表示法

  • 定义 :如果存在正数c和 no,使得对所有的 n ≥ n 0 n≥n_0 nn0都有 f ( n ) ≥ c g ( n ) f(n)≥ cg(n) f(n)cg(n), 则称 f(n) 在集合 Ω ( g ( n ) ) Ω(g(n)) Ω(g(n)) 中,或简称 f ( n ) f(n) f(n) Ω ( g ( n ) ) Ω(g(n)) Ω(g(n)) 的,或 f ( n ) = Ω ( g ( n ) ) f(n)=Ω(g(n)) f(n)=Ω(g(n))
  • 大 O表示法和大 Ω 表示法的唯一区别在于不等式的方向而已
  • 采用大 Ω 表示法时,最好找出在函数增值率的所有下限中那个最"紧"(即最大)的下限


复杂度增长率函数曲线
f ( n ) f(n) f(n)值越大, 复杂度增长率越高, 效率越低

时空权衡

  • 增大空间开销可能改善算法的时间开销
  • 可以节省空间,往往需要增大运算时间

http://www.kler.cn/news/314546.html

相关文章:

  • [附源码]SpringBoot+VUE+Java实现人脸识别系统
  • 实战指南:深度剖析Servlet+JSP+JDBC技术栈下的用户CRUD操作
  • 探秘 Web Bluetooth API:连接蓝牙设备的新利器
  • 828华为云征文|Flexus X实例GitLab部署构建流水线-私人一体化代码仓库~
  • AWS账号可以共用吗?
  • vue 中互相不关联的两个组件怎么进行通信(数据传输)
  • MFC获取网页的html文本
  • 视频V4改进
  • 锐捷 睿易路由器存在RCE漏洞
  • 会声会影2025视频剪辑教学
  • 开源集成开发环境搭建之VSCode安装部署教程
  • MySQL:基本查询操作
  • java计算机毕设课设—土地档案管理系统(附源码、文章、相关截图、部署视频)
  • 基于Java的SSM(Spring、Spring MVC、MyBatis)框架构建的远程诊断系统
  • 论文阅读 - MDFEND: Multi-domain Fake News Detection
  • 探索iPhone一键删除重复照片的方法
  • Kafka 为什么这么快?
  • 某乐指数爬虫逆向分析
  • Qemu开发ARM篇-2、uboot交叉编译
  • Android14 手机蓝牙配对后阻塞问题解决
  • python 自动化测试接口
  • 递归快速获取机构树型图
  • 【赵渝强老师】基于ZooKeeper实现Hadoop HA
  • DELPHI编译软件时带上当前IDE的版本号
  • 2024/9/21 leetcode 21.合并两个有序链表 2.两数相加
  • Hive企业级调优[5]—— HQL语法优化之数据倾斜
  • [Vue] 从零开始使用 Vite 创建 Vue 项目
  • webrtc gclient sync报错问题解决
  • 独孤思维:图书电商,又精进了
  • SwiftUI里的ForEach使用的注意事项