算法的复杂度分析

算法复杂度分析-集大成篇 复杂度分析总是迷迷糊糊,来看看这篇吧!! 阅读详情

1 算法效率的度量

1.1 算法效率度量的方法

思考:如果两个算法都满足功能性需求,那工程中最关心的其它特性是什么?如何比较评判呢?

注意:性价比(比率)是工程中最关注的算法附件特性!

算法效率度量的方法主要分为两种:事后统计法和事前分析估算法。

1.2 事后统计法

比较不同算法对同一组输入数据的运行处理时间。

缺陷:

  • 为了获得不同算法的运行时间必须编写相应程序。
  • 运行时间严重依赖硬件以及运行时的环境因素。
  • 算法的测试数据的选取相当困难。

事后统计法不容易准确度量算法的效率。

1.3 事前分析估算法

依据统计的方法对算法效率进行估算。

影响算法效率的主要因素:

  1. 算法采用的策略和方法。
  2. 问题的输入规模。
  3. 编译器所产生的代码。
  4. 计算机执行速度。

事前分析估算法通过操作数量度量算法效率。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
判断一个算法效率时只需要关注最高阶项就能得出结论。某个算法,随着问题规模n的增大,它会越来越优于另一个算法,或者越来越差于另一个算法。

结论:判断一个算法的效率时,操作数量中的常数项和其他次要项常常可以忽略,只需要关注最高阶项就能得出结论。


2 算法的复杂度

2.1 算法的复杂度

问题:如何用符号定性的判断算法的效率?

算法的复杂度:

  • 时间复杂度:算法运行后对事件需求量的定性描述。
  • 空间复杂度:算法运行后对空间需求量的定性描述。

注意:

  • 数据结构课程重点关注的是算法的效率问题,因此,整个课程会集中于讨论算法的时间复杂度;但其使用的方法完全可以用于空间复杂度的判断!

2.2 算法的时间复杂度

时间复杂度是算法运行时对于时间的需求量,大O表示法用于描述算法的时间复杂度,大O表示法只关注操作数量的最高次项。

大O表示法:

  • 算法效率严重依赖于操作(Operation)数量。
  • 操作数量的估算可以作为时间复杂度的估算。
  • 在判断时首先关注操作数量的最高次项。
    在这里插入图片描述
    常见的时间复杂度如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    常见的时间复杂度列出如下:
    在这里插入图片描述
    常见的时间复杂度的比较:
    在这里插入图片描述
    一般而言,工程中使用的算法,时间复杂度不超过O(n^3)。

算法分析示例:
在这里插入图片描述

算法的最好与最坏情况:

  • 当算法在最坏情况下仍然能满足需求时,可以推断,算法的最好情况和平均情况都满足需求。
  • 一般情况下,如果没有特殊说明,我们所分析算法的时间复杂度都是指最坏时间复杂度。

2.3 算法的空间复杂度

算法的空间复杂度(Space Complexity):

  • 定义:S(n) = S(f(n))
    • n为算法的问题规模。
    • f(n)为空间使用函数,与n相关。

推到时间复杂度的方法同样适用于空间复杂度,例如:当算法所需要的空间是常数时,空间复杂度为S(1)。

空间复杂度计算示例:
在这里插入图片描述
空间与时间的策略:

  • 多数情况下,算法的时间复杂度更令人关注。
  • 如果有必要,可以通过增加额外空间降低时间复杂度。
  • 同理,也可以通过增加算法的耗时降低空间复杂度。

实例分析:空间换时间

/*
    问题: 
    在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
    设计一个算法,找出出现次数最多的数字。
*/

#include <iostream>

using namespace std;

void search(int a[], int len)     // O(n)
{
    int sp[1000] = {0};
    int max = 0;
    
    for(int i=0; i<len; i++)
    {
        sp[a[i] - 1]++;
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max < sp[i] )
        {
            max = sp[i];
        }
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max == sp[i] )
        {
            cout << i + 1 << endl;
        }
    }
}

int main(int argc, char* argv[])
{
    int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
    
    search(a, sizeof(a)/sizeof(*a));

    return 0;
}

面试题:当两个算法的大O表示法相同时,是否意味着两个算法的效率完全相同?

  • 不相同,只是在一个数量级上。

参考资料:

  1. 数据结构实战开发教程
【数据结构与算法】时间复杂度和空间复杂度计算 目录 前言 一、时间复杂度和空间复杂度是什么? 1.算法效率 2.时间复杂度 3.空间复杂度的概念 4.大O的渐进表示法 二、如何计算 1.计算常见的时间复杂度 1.例1 2.例2 3.例3 4.例4 5.例5 6.例6 7.例7 8.例8 9.复杂度大小对比表 2.计算常见的空间复杂度 1.例1 2.例2 3.例3 总结 前言 在做leetcode的相关题目时看到了时间复杂度和空间复杂度的要求,经了解这是数据结构中的内容,于是决定边用空余时间学下数据结构 阅读详情

相关推荐

算法和算法分析

算法和算法分析

m0_62670778的博客 924

算法复杂度分析

复杂度分析用来做什么?   当我们设计一个算法的时候,我们希望让设计的代码运行的更快,更省内存。但是如何考量以上两个指标呢?我们需要通过时间、空间复杂度分析的方式来进行考量。复杂度分析对算法来说非常的重要,也是整个算法学习的精髓。 为什么要做复杂度分析?   当然,我们写完之后把代码跑一遍,也能得到算法损耗的时间以及存储空间(像力扣刷题一样)。 我们做数据分析真的能比把代码跑一遍准确吗?   首先,把代码跑一遍的评估方法是正确的,一些书籍将其称作事后统计法。但是,这些方法拥有局限性。局限性体现在以下方面。

修炼之路 8094

如何进行算法的复杂度分析?

前言 本篇文章收录于专辑:http://dwz.win/HjK 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。 大家都知道,数据结构与算法解决的主要问题就是“快”和“省”的问题,即如何让代码运行得更快, 如何让代码更节省存储空间。 所以,“快”和“省”是衡量一个算法非常重要的两项指标,也就是我们经常听到的时间复杂度和空间复杂度分析。 那么,为什么需要复杂度分析呢?复杂度分析的方法论是什么呢? 这就是我们本节要解决的问题。 好了,进入今天的学习吧。 为什么需要复杂度分析? 首先,我们来思考.

彤哥读源码 1622

算法复杂度分析看这一篇就够了

2023年也慢慢的步入了年末,光阴易逝,前段时间在学习算法的时候谈到了复杂度,所以今天就来总结一下算法的复杂度是衡量算法执行效率的度量标准。它描述了随着输入规模的增加,算法所需执行的基本操作的数量或运行时间的增长程度。一般来说,算法的复杂度可以分为时间复杂度和空间复杂度。时间复杂度衡量的是执行算法所需的时间,通常以大O符号(O)来表示。例如,O(1)表示常数时间复杂度,即算法的执行时间与输入规模无关;O(n)表示线性时间复杂度,算法的执行时间与输入规模呈线性关系;

程序员小刘 2253

【算法】复杂度分析

我们知道,数据结构和算法解决的是“快”和“省”的问题,也就是如何让代码运行得更快,一级如何让代码更节省计算机的存储空间。因此,执行效率是评价算法好坏的一个非常重要的指标。那么,如何衡量算法的执行效率尼?这里就要用到我们本节要讲的内容:时间复杂度分析和空间复杂度分析。

Fddadd的博客 887

GB/T 27930-2023协议升级与CANoe仿真测试实践

本文深入解析GB/T 27930-2023协议的核心升级,包括A/B类系统分类与EVIN码引入,并详细指导如何使用CANoe搭建仿真测试环境、编写CAPL脚本及利用DLL库进行一致性验证与故障注入测试,助力开发人员确保电动汽车充电通信的合规性与稳定性。

y7z8a的博客 541

算法复杂度分析,一篇就够了

这篇文章你能得到哪些知识: 1.复杂度分析方法大O表示法介绍 2.常见的几种复杂度实例和拟合曲线 3.详细分析Leetcode第一题的相关复杂度 通过以上几点,让你对复杂度分析有一个全面的认知。 文章目录为什么要进行复杂度分析?什么是大O表示法?几种常见的时间复杂度实例和拟合曲线:最好、最坏和平均情况下的复杂度分析LeetCode第一题实战分析:小结 为什么要进行复杂度分析? 讨论数据结构和算法,...

不能如期而至的专栏 3万+

PyFluent进阶实战:自动化密闭几何(Watertight)网格生成

本文深入探讨了如何利用PyFluent实现自动化密闭几何(Watertight)网格生成。通过Python脚本控制Fluent Meshing工作流,工程师可以高效、一致地完成从几何导入、局部尺寸定义、面网格生成到边界层设置和体网格输出的全过程,从而将复杂的CFD前处理工作转化为可重复、可集成的自动化流程,极大提升仿真效率和知识复用性。

t8u9v0w1x的博客 578

C++算法复杂度分析

算法复杂度分析是评估算法效率的关键工具,它帮助我们理解算法在不同规模输入下的性能表现。答:数学家有一个定义,只要一个算法找到答案所需要的时间,能做到n^k可以了。n^k 是n的多项式,因此满足这个条件的算法,叫做多项式时间算法。多项式时间算法是一个好算法。通过了解算法复杂度分析,可以预测算法性能,做出更合理的算法选择,优化现有代码的效率。(大数据来了,有些算法抵不住啊,必须要更新自己的知识库了)🐍🐍🐍🐍🐍🐍。(题外话:算法的改进需要人,人也需要反过来“驯服”算法,大家加油!:好算法和坏算法的关键

wsys_yysn的博客 1348

【知识点总结】电机学——原理部分

大家好,由于院校地区存在疫情没法返校,再结合当下形式,去各地旅游放松可能不是一个好的决定,o(╥﹏╥)o,期待已久的旅行就先放一边吧,但也不能闲着,既然无事,那不如继续我的总结,本次总结的内容是电机学,自九推以后我越来越明白电机学的重要性……呜呜呜~~实在太重要了,几乎所有与专业复试有关的题目都会涉及电机学,而它又比较抽象,容易使人浅尝辄止,只能理解一些表面的东西。为此自九推之后,我深刻领悟自身不足,决定对电机学发起依次猛攻,势必要将其彻底拿下,这这只是我的粗略总结,若有空闲,我将不断完善它。

weixin_51130221的博客 1万+

《信息化项目文档模板十二——业务需求新增/变更审批确认表 》

系列文章目录 《信息化项目文档模板一——项目需求说明书》 《信息化项目文档模板二——项目启动会文档模板》 《信息化项目文档模板三——会议纪要模板》 《信息化项目文档模板四——系统项目蓝图设计模板》 《信息化项目文档模板五——系统详细设计模板》 《信息化项目文档模板六——系统详细设计模板》 《信息化项目文档模板七——系统开发计划模板》 《信息化项目文档模板八——系统功能测试模板》 《信息化项目文档模板九——系统压力测试模板》 《信息化项目文档模板十——系统推广上线计划模板》 《信息化项目文档模板十一——系统用

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1712

怎样分析算法的复杂度

当我们在利用算法实现解决某一个问题时,如果这个算法是正确的,那么通常要去思考这个算法需要的时间和空间资源是多少的问题,如果一个算法需要的时间很长,那么这种算法实际上就很难有用处,同样的如果一个需要很大内存的算法在实际中也是不能使用的。一、什么是好的算法?这里我们要明确一点:好的算法 和 更优的算法 不能混为一谈;一个更优的算法消耗更少的时间、更少的空间,而我们作为初学者,应该更多的去考虑怎么写出一个好的算法,而所谓好的算法要满足这两个性质:不过事实上我们并没有那么多的数据量,并且用大量数据去测试是一个很烧钱

ZER00000001的博客 1890

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1451

算法——复杂度分析

我们需要对算法效率分析,而大多数方法都无法抛弃环境因素且设备要求多而杂,复杂度分析可以避免以上问题。它有以下优点:不需要复杂的设备,节省计算资源。不同机器复杂度分析的方法相同,不会受到环境因素干扰。适用于所有软件,不会受到编程平台的限制。

AZaLEan__的博客 529

某AI推荐系统项目管理复盘:架构师总结的6大方法论与调优策略

我是张三,某大厂资深AI架构师,主导过5个千万级用户的推荐系统项目(覆盖电商、内容、视频、音乐、外卖等场景)。我的公众号“AI架构师笔记”会分享更多AI项目管理和技术实战经验,欢迎关注。最后的话:推荐系统不是“一锤子买卖”,而是“持续优化的过程”。希望这篇文章能帮你少踩坑,多做对——毕竟,把复杂的事做成,才是架构师的核心能力。

2501_92132293的博客 362

【GlobalMapper精品教程】027:路径剖面和和视线工具的使用

路径剖面视线工具允许您使用加载的高程数据集沿用户指定的路径获取垂直剖面。要定义生成3D路径剖面所遵循的路径,只需单击鼠标左键选择路径的点,然后石键单击以结束路径。出现一个带有剖面的对话框,允许您设置视线分析或优化端点。

智慧空间实验室 2049

算法通识——复杂度分析

复杂度分析 一、分类 分为时间复杂度和空间复杂度 写在前面: 数据规模:个人理解:指运行该代码块运算出的数据的数量级 如果要想在1s之内解决问题: O(n^2)的算法可以处理大约10^4级别的数据 O(n)的算法可以处理大约10^8级别的数据 O(n*log*n)的算法可以处理大约10^7级别的数据 //log10^7~7 log210^7~20 1.大O复杂度分析法:(时间) 定义:忽略常数,低阶和系数的复杂度分析法, 代码每行运行的时间用unit-time..

qq_60584136的博客 2078

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 910

13、【算法】算法复杂度分析

一、算法的时间复杂度分析 1、时间复杂度的定义     在进行算法分析时,算法中基本操作语句重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),它称为算法的渐进时间复杂度,简称为时间复杂度。     T (n) = Ο(f (n)) 表...

阿牧路泽 608

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

算法的复杂度分析到底是什么?

数组 它可以说是最基础、最简单的数据结构了 数组用一块连续的内存空间,来存储相同类型的一组数据 最大的特点就是支持随机访问,时间复杂度为 O(1) 但插入、删除操作也因此变得比较低效,平均情况时间复杂度为 O(n) 在平时的业务开发中,我们可以直接使用编程语言提供的容器类, 但是,如果是特别底层的开发,直接使用数组可能会更合适,因为容器类无法存储基本类型,对包装类的装箱拆箱会有一定的性能损耗 为什...

binaryshao 863

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: 双任务时间片运行原理
下一篇: 双任务延时原理与空闲任务
SlowIsFastLemon
博客等级 码龄8年 265粉丝 790原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值