北大硕士LeetCode算法专题课---算法复杂度介绍

news2025/2/24 0:15:17

算法复杂度中大O的含义

推荐教程:北大硕士带你手撕Leetcode算法题

O复杂度表示法

算法面试中, 经常会被问到,你写的算法复杂度是多少, 或者设计一个复杂度为 O(nlogn) 的算法复杂度分析是估算算法执行效率的方法,公式O(f(n))表示算法的复杂度,此方法即为O复杂度表示法O(f(n))n表示数据规模,f(n)表示运行算法所需要执行的指令数。

下面的代码非常简单,1,2,3…n 的累加和,我们来估算它的执行效率

假设每行代码执行的时间都一样为t

执行第2行代码需要时间t,第3,4行代码运行了n遍,需要的时间为2n*t

这段代码总执行时间为(2n+1)* t

结论:代码执行的总时间T(n)与每行代码的执行次数成正比

看下面的代码,估算该段代码的执行时间

同样假设每行代码执行的时间都一样为t

执行第2行代码需要时间t

3行代码运行了n遍,需要时间为n*t

45行代码运行了n2次,需要时间为2n2 * t

执行所有代码的总时间为 (2n2 + n + 1)* t

结论:代码执行的总时间T(n)与每行代码的执行次数成正比

O(f(n))来表示算法复杂度

T(n) = O(f(n)) , O表示代码的执行时间T(n) f(n)表达式成比例。

O复杂度表示法:上面例子中的T(n) = O(2n+1), 另一个  T(n) = O(2n2 + n + 1)

O时间复杂度并不表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,也叫作渐进时间复杂度

asymptotic time complexity),简称时间复杂度

当数据量特别大, 也就是n的取值很大的时候,大O表示法中低阶、常量、系数三部分并不会左右增长趋势,可以忽略

上面例子中的T(n) = O(2n+1), 另一个  T(n) = O(2n2 + n + 1)

用大O表示法表示上面两段代码的时间复杂度,可以记为O(n)O(n2)

 数据规模

通过下面的例子,我们来体会一下数据规模对程序运行时间的影响

 通过刚才的例子我们可以得出如下结论,如果想在1s之内解决问题

O(n2) 的算法可以处理大约104级别的数据

O(n) 的算法可以处理大约108 级别的数据

O(nlogn)的算法可以处理大约107级别的数据

有的时候,自己写的算法认为是O(nlogn), 但是在线判题系统提示超时,可以先估计一下,前面提到标准降低一个数量级

O(n2) 的算法可以处理大约103级别的数据

O(n) 的算法可以处理大约107 级别的数据

O(nlogn)的算法可以处理大约106级别的数据

自己写代码实验,数据每增加一个数量级看看耗时的变化

空间复杂度

解决问题时,多创建了一个数组:O(n)

解决问题时,多创建了一个二维数组:O(n2)

解决问题时,用到了几个临时的变量:O(1)

 时间复杂度分析

如何分析一段代码的时间复杂度?

1.在分析一个算法、一段代码的时间复杂度时,只关注循环执行次数最多的那一段代码就可以了

上面的代码中,我们只需要关注内层for循环的时间复杂度就可以了

内层for循环的两行代码被执行了n2次,所以总的时间复杂度就是O(n2)

2.总复杂度等于量级最大的那段代码的复杂度

上面的代码分为两部分,分别是求 sum_sum_1

计算sum_部分的代码段时间复杂度O(n),计算sum_1部分的代码段时间复杂度为O(n2)

总的时间复杂度由复杂度最大的部分决定, 所以上面代码复杂度为O(n2)

3.嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

 上面的代码中第二个函数调用了第一个函数, 如果把fn函数调用当作一个普通操作, 那么第二个函数的时间复杂度为O(n)

Fn函数的时间复杂度为O(n),那么函数整体的时间复杂度为O(n*n) = O(n2)

4.  当两段代码的数据规模不同时,不能省略复杂度低的部分

上面的代码分为两部分,分别是求 sum_sum_1

计算sum_部分的代码段时间复杂度O(n),计算sum_1部分的代码段时间复杂度为O(m2)

总的时间复杂度由复杂度最大的部分决定, 所以上面代码复杂度为O(m2+n)

需要注意的地方:

看见双重for循环,算法的复杂度一定是O(n2)么?

关于O(logn)

 

 

 

上面代码的时间复杂度 O(logn)

n 经过几次“÷10=0    log10n = Ologn)

关于O(logn)

logaN    logbN   之间是什么关系?

logaN  = logablogbN

上面式子当中,logab 为常数,可以忽略

下面代码的复杂度:O(n2)

简单复杂度分析:

关注循环执行次数最多的那一段代码

总复杂度等于量级最大的那段代码的复杂度

嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

当两段代码的数据规模不同时,不能省略复杂度低的部分

复杂度中对数的部分通常忽略底数

递归算法复杂度分析

在递归中只做了一次递归调用时间复杂度:O(logn)

 在递归中只做了一次递归调用

递归深度为D

在每个递归函数中, 时间复杂度为T

总体时间复杂度为O(T*D)

 

 

 

最好、最坏、平均时间复杂度分析

算法复杂度在有些情况下是用例相关的

插入排序算法O(n2)           最好情况:O(n)                               

快速排序算法O(nlogn)     最差情况:O(n2)

算法面试复杂度分析一般指的就是平均情况

均摊复杂度分析

某些复杂耗时操作是为了辅助其它操作,可以将这个复杂操作的时间平摊到其它操作中

 

每一次添加耗时O1), 初始长度填满之后,再添加1个元素,此时需要开辟一块长度为2n的新的空间,并将之前的N个元素复制过来,这一步的操作复杂度为n,平均来看 O2

均摊复杂度:就是把过程复杂操作所耗费时间分担到简单操作上

对一个数据结构进行一组连续操作,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,适合运用均摊复杂度分析代码

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂的格局在细节上是怎么被拉低的

讲几个例子,都是大厂,作为大厂小散沙客户,也就是平头老百姓的角度来反观一下几个问题 第一个【脉脉】 今天(2023年1月9日)偶尔相等一下买买查看一下信息,由于手机没有安装APP.想借助PC的web端登录一下 它提…

小程序中无法播放阿里云的视频点播

背景视频直接存在自己的服务器,视频大了会存在卡顿现象,只能用阿里云或其它服务商的相关服务。原来在APP中已有了视频播放的功能,而且已经能正常使用,但视频的url是 http。现在期望在小程序中也添加视频播放的功能。初期操作申请相…

css——扁平圆弧(底部弧度)

案例演示 使用伪类处理,先将元素自身定位为relative,伪类设置content:‘’,并相对定位为absolute,再设置下left ,top 值,然后通过改变width和和left就可以调节弧度。宽度需大于100%,将left设为(…

微分方程(人口预测与传染病模型)

一、定义 微分方程:含导数或微分的方程 微分方程的阶数:所含导数或微分的最高阶数,如y’’’2y’’-2x0是三阶微分方程 微分方程的解:使得微分方程成立的函数 例如y’-2x0的解可以为x或者x1 微分方程的通解和特解:特…

基于Arduino Pro Micro的游戏手柄制作

基于Arduino Pro Micro的游戏手柄开发 1. Arduino IDE下载及安装 在Arduino官网Software | Arduino下载最新版Arduino IDE并安装。 或使用QQ群中提供的免安装版Arduino IDE,安装完成后Arduino Pro Micro的pin脚定义使用下面路径下的leonardo: 2. Arduino Pro Micr…

GrapeCity 文档处理商业系列Crack-6.0.2Version

GrapeCity 文档处理商业系列Crack文档 API 使用高速、直观的文档 API 全面控制您的文档 包括: Documents for Excel, .NET Documents for Data Viewer Documents for PDF Documents for PDF Viewer Documents for Word Documents for Imaging Documents for Image V…

数据库MySQL基础入门之MySQL隐式转换

一、问题描述 rootmysqldb 22:12: [xucl]> show create table t1\G *************************** 1. row *************************** Table: t1Create Table: CREATE TABLE t1 ( id varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 1 row in set (0.0…

ArcGIS基础实验操作100例--实验74灾害影响缓冲区分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验74 灾害影响缓冲区分析 目录 一、实验背景 二、实验数据 三、实验步骤 (…

剑指offer----C语言版----第十四天

表示数值的字符串 原题链接:剑指 Offer 20. 表示数值的字符串 - 力扣(LeetCode)1.1 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分&a…

常见胶片的分类和结构

胶片的分类方法非常多,本质上属于高分子材料范畴,很多类别已经超出笔者的认知范围,我们只对与档案数字资源长期保存和异质备份相关的胶片分类方法进行介绍。笔者整理了十大分类如下图所示: 各分类简要介绍 1. 按宽度尺寸分类 常…

【Linux】进程信号万字详解(上)

🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…

194: vue+openlayers 根据卫星lat,lon,alt,俯仰角,方位角,绘制地面的拍摄的区域

第194个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中研究卫星的拍摄范围。 根据卫星的高度,经度,纬度,方位角,俯仰角以及拍摄的幅宽,幅长等参数,绘制拍摄的矩形框和中心点。这里用到了一些公式,参考代码,尤其是大部分使用的是弧度而非角度,需…

青铜到王者,8本最好的Python从入门到进阶的书

春节长假还有1周了,是时候囤一些书充充电了!新的一年群里很多小伙伴开始想学Python, 无论是准备转行的,还是想多学一份技能提高职场竞争力的,都想选择Python赛道,下面给大家推荐一些非常不错的Python入门到…

联合证券|利好叠加有望实质兑现 机构加码布局装修建材

组织加码布局装饰建材板块。据了解,受房地产利好方针带动、职业竞赛格式持续改进及原材料本钱下降等多重利好叠加,装饰建材板块有望迎来实质性利好,虽然曩昔两个多月来相关公司有所反弹,但组织以为行情仍然在路上。 多重利好推进 …

架构设计---高可用的处理

前言: 系统的高可用架构就是要在上述各种故障情况下,保证系统依然可用提供服务,具体包括以下几种架构方案。 冗余备份: 各种服务器故障是不可避免的,架构设计上就要保证,当服务器故障的时候,…

简短通俗理解动态规划算法--最短路径问题

问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径。在博客动态规划算法中介绍了动态规划的基本思想已经建立动态规划模型的步骤,下面将其中的方法分析最短路径问题。 最短路径有…

CBAM: Convolutional Block Attention Module

https://arxiv.org/pdf/1807.06521.pdf 摘要: 我们提出了卷积块注意模块(CBAM),一个简单而有效的用于前馈卷积神经网络的注意模块。给定中间特征图,我们的模块依次推导出沿通道和空间两个独立维度的注意图,然后将注意图乘到输入…

vue-seamless-scroll数据量少时,暂停滚动,继续滚动

需求内容 大屏项目:指定dom元素内,如果子元素内容过多,超出父元素的最高高度,可以发生自动滚动;如果子元素内容没有超出父元素的最高高度,不可以发生自动滚动。 . 实现方案 获取数据后并渲染到dom后&am…

并查集的查询与合并详解

文章目录 一、并查集的概念 二、并查集的实现 2、1 并查集不同集合(树)的形成 2、2 find()函数找一个元素集合的编号(元素所属于树的祖宗) 2、3 合并两个不同集合(合并两棵不同的树&#xff09…

SpringCloud学习笔记 - Nacos集群配置和配置持久化

1. 集群架构 要组成集群Nacos必须要有3个或以上的Nacos服务节点,官网推荐在生产服务中使用集群架构。 官网对Nacos集群架构的说明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 总体来说有三种方式可以实现Nacos集群部署: …