算法复杂度分析

news/2024/4/20 2:22:55/文章来源:https://blog.csdn.net/m0_58699417/article/details/127628006

复杂度分析

参考:《算法导论》、复杂度 - OI Wiki (oi-wiki.org)、一文弄懂算法的时间和空间复杂度分析 - 知乎 (zhihu.com)、算法讲解之复杂度分析 - 知乎 (zhihu.com)、算法的时间复杂度和空间复杂度-总结_zolalad的博客-CSDN博客_时间复杂度

算法复杂度分析的阶段:

  • 事前分析
  • 事后测试

时间复杂度

时间复杂度是指执行这个算法所需要的计算工作量,其复杂度反映了程序执行时间**「随输入规模增长而增长的量级」**,时间复杂度越高,算法越慢

术语

  • 频率计数:某条语句的执行次数

  • f(n)f(n)f(n) :所有代码的执行总次数,类似于 T(n)T(n)T(n) ,但是是 T(n)T(n)T(n) 没有加渐进符号(O之类O之类O之类)的形式

  • g(n)g(n)g(n):在事前分析时确定的一个关于 nnn 的函数,与具体的语言和机器无关

  • 时间频度 T(n)T(n)T(n):一个算法中所有语句的执行次数,是最坏情况运行时间函数,T(n)T(n)T(n) 的规律称为时间复杂度

    • 所有代码的执行总时间 T(n)T(n)T(n) 和每行代码的执行次数 nnn (问题的规模)之间的关系是: T(n)=O(f(n))T(n)=O(f(n))T(n)=O(f(n))
  • 时间复杂度中 loglogloglglglg 都指 log2log_2log2

  • 渐进记号:

    • (1)【渐进上界】上界函数 O(n)O(n)O(n) :对应最坏情况

      • 如果算法用 nnn 值不变的同一类数据在某台机器上运行时,所用的时间总是小于 ∣g(n)∣|g(n)|g(n) 的一个常数倍。所以 g(n)g(n)g(n) 是计算时间 T(n)T(n)T(n) 的一个上界函数,f(n)f(n)f(n) 的最大数量级是 g(n)g(n)g(n)
      • O(g(n))={f(n):存在正常量c和n0,使得对所有的n≥n0,都有0≤f(n)≤cg(n)}O(g(n))=\{f(n):存在正常量c和n_0,使得对所有的n \geq n_0,都有 0 \leq f(n) \leq cg(n) \}O(g(n))={f(n):存在正常量cn0,使得对所有的nn0,都有0f(n)cg(n)}

      (2)【渐进下界】下界函数 Ω(n)Ω(n)Ω(n) :对应最好情况

      • 如果算法用 nnn 值不变的同一类数据在某台机器上运行时,所用的时间总是大于 ∣g(n)∣|g(n)|g(n) 的一个常数倍。所以 g(n)g(n)g(n) 是计算时间 T(n)T(n)T(n) 的一个下界函数,f(n)f(n)f(n) 的最小数量级是 g(n)g(n)g(n)
      • Ω(g(n))={f(n):存在正常量c和n0,使得对所有的n≥n0,都有0≤cg(n)≤f(n)}Ω(g(n))=\{f(n):存在正常量c和n_0,使得对所有的n \geq n_0,都有 0 \leq cg(n) \leq f(n) \}Ω(g(n))={f(n):存在正常量cn0,使得对所有的nn0,都有0cg(n)f(n)}

      (2)【渐进确界】平均函数 Θ(n)Θ(n)Θ(n) :对应平均情况

      • Θ(g(n))={f(n):存在正常量c1,c2和n0,使得对所有的n≥n0,都有0≤c1g(n)≤f(n)≤c2g(n)}Θ(g(n))=\{f(n):存在正常量c_1,c_2和n_0,使得对所有的n \geq n_0,都有0 \leq c_1g(n) \leq f(n) \leq c_2g(n) \}Θ(g(n))={f(n):存在正常量c1,c2n0,使得对所有的nn0,都有0c1g(n)f(n)c2g(n)}
      • 即当且仅当有 T(n)=Ω(g(n))T(n) = Ω(g(n))T(n)=Ω(g(n))T(n)=O(g(n))T(n) = Ο(g(n))T(n)=O(g(n)) 时,有 T(n)=Θ(g(n))T(n)=Θ(g(n))T(n)=Θ(g(n))

时间复杂度只关注最高数量级,且与系数也没有关系

时间复杂度计算方法

时间复杂度一般按照最坏情况(比如排序时让数据是逆序的)计算。

时间复杂度分析有一个基本的法则,就是四则运算法则。

  • 加法法则:如果算法的代码是平行增加的,那么就需要加上相应的时间复杂度。
  • 乘法法则:如果算法的代码增加的是循环内的嵌套或者函数的嵌套,那么就需要乘上相应的时间复杂度。循环需要由内向外分析
  • 减法法则:如果是去掉算法中平行的代码,就需要减掉相应的时间复杂度。
  • 除法法则:如果是去掉嵌套内的循环或函数,就需要除去相应的时间复杂度。

即:总结:时间复杂度分析的基本策略是:从内向外分析,从最深层开始分析。如果遇到函数调用,就要深入函数进行分析

  • 常数项忽略(只有常数项时就是 O(1)O(1)O(1)
  • 只保留最高阶项
  • 与最高阶项相乘的系数忽略
  • 常数级操作:O(1)O(1)O(1)
  • 1层循环:O(n)O(n)O(n)nnn 为循环的次数
  • 多层循环:O(n1×n2×n3×...)O(n_1 \times n_2 \times n_3 \times ...)O(n1×n2×n3×...)nin_ini 是第 iii 层循环的次数【由内向外分析】
  • 条件判断语句:总的时间复杂度等于其中 时间复杂度最大的路径 的时间复杂度
  • 顺序执行语句:总的时间复杂度等于其中最大的时间复杂度

主定理(Master Theorem)

特别的,对于递归算法,可以使用递归树或者主定理求解时间复杂度

主定理适用于求解如下递归式算法的时间复杂度:

T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)

其中:

  • nnn 是当前问题规模大小;
  • aaa 是原问题的子问题个数;
  • n/bn/bn/b 是每个子问题的大小,这里假设每个子问题有相同的规模大小;
  • f(n)f(n)f(n) 是将原问题分解成子问题和将子问题的解合并成原问题的解的时间(还有常数操作的时间)。

使用情况:

  1. If f(n) = O(n logb a−ε ) for some constant > 0, then T (n) = Θ(n logb a ).
  2. If f(n) = Θ(n logb a logk n) with1 k ≥ 0, then T (n) = Θ(n logb a logk+1 n).
  3. If f(n) = Ω(n logb a+ε ) with > 0, and f(n) satisfies the regularity condition, then T (n) = Θ(f(n)). Regularity condition: af(n/b) ≤ cf(n) for some constant c < 1 and all sufficiently large n

常见的时间复杂度

  • 多项式时间:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nm)Ο(1)<Ο(log_2n)<Ο(n)<Ο(nlog_2n)<Ο(n^2)<Ο(n^3)<Ο(n^m)O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nm),对应 P(Polynomial,多项式)类问题

  • 指数时间:O(2n)<O(n!)<O(nn)Ο(2^n)<Ο(n!)<O(n^n)O(2n)<O(n!)<O(nn),对应NP(Non-Deterministic Polynomial, 非确定多项式)问题

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nm)…<O(2n)<O(n!)<O(nn)Ο(1)<Ο(log_2n)<Ο(n)<Ο(nlog_2n)<Ο(n^2)<Ο(n^3)<Ο(n^m)…<Ο(2^n)<Ο(n!)<O(n^n)O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nm)<O(2n)<O(n!)<O(nn)

注意:当规模 nnn 很大时,一定存在常数 mmm,使得 2n>nm2^n>n^m2n>nm

请添加图片描述

空间复杂度

空间复杂度是对一个算法在运行过程中**临时占用存储空间大小的量度,所谓的临时占用存储空间指的就是代码中「辅助变量所占用的空间」,它包括为参数表中「形参变量」分配的存储空间和为在函数体中定义的「局部变量」**分配的存储空间两个部分。【全局变量不属于空间复杂度考虑范围

空间复杂度使用 S(n)=O(f(n))S(n)=O(f(n))S(n)=O(f(n)) 来定义,其中 nnn 为问题的规模。

O(1)O(1)O(1) 的空间复杂度是指算法消耗的空间不随数据规模的增大而增大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410298.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梦开始的地方 —— C语言数据在内存中的存储(整形+浮点型)

文章目录整形在内存中的存储1. 数值类型的基本分类2. 整形在内存中的存储1. 原码、反码、补码2. 内存中为什么要存放补码&#xff1f;3. 大小端存储4. 无符号有符号数练习5. 有符号数无符号数小结浮点型在内存中的存储IEEE 754整形在内存中的存储 1. 数值类型的基本分类 整形…

AJAX基础+Axios快速入门+JSON使用+综合案例

目录1、 AJAX1.1 概述1.1.1 作用1.1.2 同步和异步1.2 快速入门1.2.1 服务端实现1.2.2 客户端实现1.3 案例1.3.1 需求1.3.2 分析1.3.2 后端实现1.3.3 前端实现2、 Axios异步框架2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名3、 JSON3.1 概述3.2 JSON基…

GAS技能系统

HUT -》 在\Intermediate\Build\Win64\UE4Editor\Inc\的目录下 找到generated 头文件和cpp文件 里面有HUT根据UCLASS 和 Generate Body 生成的 定义 以及声明宏(UFUNCTION 里的CustomThunk元可以让用户自己手动添加宏定义和宏声明) 将wildcard改为通配符然后手动将自定义的…

Terraform 华为云实践 项目初始化

这个架构就是DNS加上负载均衡加ecs&#xff0c;最后vpc的架构。网络这块是DNS和VPC&#xff0c;对象存储是用来做terraform的后端来配置。 项目的初始化 Terraform Registry 华为云的terraform链接如上所示。 先将项目的目录结构建好&#xff0c;modules是我们的模块&#xf…

来一场关于元宇宙的灵魂辩论|BOOK DAO内容共建招募

「 备选问题 」1. 你认为元宇宙最重要的特点是什么&#xff1f;用一句话描述你理解的 “元宇宙”2. 元宇宙是游戏2.0吗&#xff1f;它与游戏有什么不同&#xff1f;3. 元宇宙是否需要区块链&#xff1f;是否需要NFT&#xff1f;各扮演什么角色&#xff1f;4. 元宇宙是否需要经济…

大数据项目之电商数仓、电商业务简介、电商业务流程、电商常识、业务数据介绍、电商业务表、后台管理系统

文章目录5. 电商业务简介5.1 电商业务流程5.2 电商常识5.2.1 SKU和SPU5.2.2 平台属性和销售属性5.2.2.1 平台属性5.2.2.2 销售属性6. 业务数据介绍6.2 电商业务表6.2.1 收藏商品6.2.2 加购物车6.2.3 领用优惠券6.2.4 下单6.2.5 支付6.2.6 退单6.2.7 退款6.2.8 评价6.3 后台管理…

部署简易POD image自己定义镜像

k8s部署pod apiversion: 版本 kind: 类型 metadata: 字面意识&#xff0c;元素信息&#xff0c;POD信息 name: POD名字 labels: 字母意识&#xff0c;标签 通过拓扑 label 进行副本调度 label的使用无非就是增删改查 还有个重要的标签namespace&#xff08;命名空间&…

针对垃圾渗滤液中膜产水脱氮工艺的设计,除氨氮树脂

垃圾渗滤液是指来源于垃圾填埋场中垃圾本身含有的水分、进入填埋场的雨雪水及其他水分&#xff0c;扣除垃圾、覆土层的饱和持水量&#xff0c;并经历垃圾层和覆土层而形成的一种高浓度的有机废水&#xff0c;有堆积的准备用于焚烧的垃圾渗漏出的水分。为什么要处理垃圾渗滤液&a…

黑马点评-达人探店

摘要&#xff1a;达人探店业务&#xff1a; 本质是发表blog和点赞等功能。利用Redis的Set实现点赞与取消点赞&#xff0c;然后利用SortedSet对点赞功能进行改进实现点赞排行的功能。 在学习的过程中&#xff0c;我们不应该急于写代码&#xff0c;首先分析业务逻辑&#xff0c;…

SpringBoot项目启动执行任务的几种方式

经过整理后得到以下几种常用方式&#xff0c;供大家参考。 1. 使用过滤器 init() &#xff1a;该方法在tomcat容器启动初始化过滤器时被调用&#xff0c;它在 Filter 的整个生命周期只会被调用一次。可以在这个方法中补充想要执行的内容。 Component public class MyFilter …

vs2017 外网远程调试

外网远程调试:由于外网的目标电脑IP无法直接访问&#xff0c;则需要第三方内网穿透工具辅助&#xff0c;本文使用NATAPP进行 注册一个账号&#xff1a;NATAPP -注册完成&#xff0c;登录后&#xff0c;在购买隧道中选择Free免费购买一个 购买成功后&#xff0c;在我的隧道中可…

突破出行市场桎梏,需要高端出行的精神内核?

如果高端出行是一本书&#xff0c;那么豪车可能只是封面和封底。真正重要的&#xff0c;是隐藏其中的服务的精神与体验的内核。 这一点&#xff0c;国内高端出行市场的探索者们应当深有体会。从早期高端巡游出租车&#xff0c;到BBA豪华车势力曾经推动的高端出行网约车&#x…

「设计模式」工厂方法模式

文章目录一、概念二、用途三、实现方式四、工厂方法模式的利与弊为什么要使用工厂来创建对象&#xff1f;为什么每种对象要单独有一个工厂&#xff1f;五、工厂方法与简单工厂的区别六、总结参考资料一、概念 工厂方法模式(Factory Method Pattern)又称为工厂模式&#xff0c;…

前端工具——01-VS Code的使用

前言 文章标题&#xff1a;《第一次使用 VS Code 时你应该知道的一切配置》。本文的最新内容&#xff0c;更新于 2020-06-19。大家完全不用担心这篇文章会过时&#xff0c;因为随着 VS Code 的版本更新和插件更新&#xff0c;本文也会随之更新。 本文的最新内容&#xff0c;也会…

腾讯云centos7安装mysql5.7

昨天服务器上的数据库被勒索了&#xff0c;重装系统之后不得不再装一次数据库&#xff0c;踩了很多坑&#xff0c;在此记录安装过程。 首先把centos7自带的数据库mariadb卸载掉&#xff0c;把MySQL的相关文件夹都删掉。 查看组件服务 rpm -qa | grep -i mariadb rpm -qa | gr…

Mybatics-连接配置

1、mysql连接数_MySQL配置参数优化 1.1、优化最大连接数max_connections 是MySQL最大并发连接数默认值是151 MySQL允许的最大连接数上限是32767 实际连接数是最大连接数的85%较为合适 查询数据库目前设置的最大并发连接数是多少 查询数据库目前实际连接的并发数是多少 在MyS…

SpringBoot集成JWT(极简版):

文章目录1.JWT依赖2.JWT工具类TokenUtils.java3.token示例4.拦截器JwtInterceptor.java5.拦截器设置InterceptorConfig.java6.统一接口WebConfig.java7.设置自定义头配置 CorsConfig .java8.GlobalExceptionHandler.java9.ServiceException.java10.设置token:11.最终效果&#…

离线下IDEA打开拷贝的完整工程,解决工程代码大量报错的问题

一、背景 在日常工作中&#xff0c;代码工程的保存和协作开发一般是通过代码仓库实现的。但是对于正常的多人研究开发时&#xff0c;工程代码的物理拷贝也是需要的&#xff0c;这可以节省工程代码依赖环境的安装和配置&#xff0c;同时也能保证代码完整和版本一致。 在大部分企…

【测试沉思录】9. 数据工厂低代码平台探索与实践

欢迎订阅我的新专栏《现代命令行工具指南》&#xff0c;精讲目前最流行的开源命令行工具&#xff0c;大大提升你的工作效率。 作者&#xff1a;吴锺瑞、刘洪初 编辑&#xff1a;毕小烦 一. 需求背景 造数据可能是日常迭代中最频繁也是最耗时的工作。 我们在20年8月对部门内的…

HashSet实现类的使用

【1】放入Integer类型数据package com.msb.test06;import java.util.HashSet;/*** @author : liu* 日期:10:36:57* 描述:IntelliJ IDEA* 版本:1.0*/ public class TestInteger {//这是一个main方法:是程序的入口public static void main(String[] args) {//创建一个HashSet集合…