数据结构与算法 - 时空复杂度分析

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

这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正。

一、为何需要分析算法复杂度

挺多同学本科都学习过数据结构和算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构和算法是要干嘛?

其实,最终的目的只有一个:让我们写的代码在计算机上运行的速度更快,使用的内存更省!,可是如何才能知道我们写的代码使用多少运行时间和内存呢?这就需要分析算法时间复杂度和空间复杂度,只有学会分析这 2 者,才能知道我们设计的算法到底有没有性能的提升,不然你费了很大功夫想了一个算法,却发现运行速度慢如乌龟,得不偿失。

如果能够在运行算法之前就能知道算法大概的执行时间那就好了,而复杂度分析恰好可以解决这个问题!复杂度分析又分为 2 种:

1.1 运行后分析

这种就是写完算法直接放到机器上面跑,统计下到底用了多少时间和内存,但是这种方法有 2 个缺点:

  1. 测试结果依赖运行机器:性能强的机器当然需要的时间少
  2. 测试结果依赖于测试用的数据:比如对无序的数组和有序的数组排序的时间大不相同

1.2 运行前分析

那既然运行后分析有不可避免的缺点,有没有办法在纸上提前计算一下算法大概的执行时间和内存用量呢?当然有,就是今天的主角大 O 复杂度表示法!

二、大 O 复杂度表示法

我用一个例子来一步步解释大 O 复杂度表示法到底是什么意思:

int cal(int n) {
   
   
   int sum = 0;
   int i = 1;
   int j = 1;
   for (; i <= n; ++i) {
   
   
     j = 1;
     for (; j <= n; ++j) {
   
   
       sum = sum +  i * j;
     }
   }
 }

对 CPU 而言执行程序分为以下 3 步:

  1. 读如代码指令和数据
  2. 计算
  3. 输出数据

因为我们只是在运行前粗略地估计算法的运行时间,因此可以假设每行代码在 CPU 上运行的时间都相同,为 cputime,那么我们就可以直接计算出上面函数中所有代码执行的总时间(次数 x 单位时间),n 表示输入数据的规模:

  • 第 2、3、4 行:每行需要 1 个 cpu_time,共 3∗cputime3 * cputime3cputime
  • 第 5、6 行:因为都是循环 n 次,所以需要 2n∗cputime2n * cputime2ncputime
  • 第 7、8 行:因为内外一共有 2 层 n 次的循环,所以需要 2n2∗cputime2n^2 * cputime2n2cputime

那么总的运行时间 T(n) 为:

T(n)=(2n2+2n+3)cputime T(n) = (2n^2 + 2n + 3)cputime T(n)=(2n2+2n+3)cputime

对于每个确定的算法,所有代码的执行次数一定,那么上面的 T(n) 与所有代码的执行次数 2n2+2n+32n^2 + 2n + 32n2+2n+3 成正比关系,比例系数就是 CPU 执行每行代码的时间 cputime,因为可以把上式写成大 O 复杂度表示法

T(n)=O(f(n)) T(n) = O(f(n)) T(n)=O(f(n))

其中:

  • T(n):表示算法执行的总时间
  • f(n):表示算法总的执行次数,就是 2n2+2n+32n^2 + 2n + 32n2+2n+3
  • O():表示 T(n)f(n) 的正比关系,也就是大 O 的由来

所以上面函数的总的执行时间又可以写成:

T(n)=O(2n2+2n+3) T(n) = O(2n^2 + 2n + 3) T(n)=O(2n2+2n+3)

但是要注意:大 O 复杂度表示法并不是计算代码准确的运行时间,而是表示一种代码执行时间随着数据规模 n 增长的变化趋势,记住不是准确的时间,只是一种趋势而已,因为实际工作的算法可能需要接受很大量级的数据,通过分析算法运行时间与输入数据规模的变化趋势就能大概知道一个算法能不能在实际环境中很好的工作。

但是呢,上面的大 O 表示法还是不够简洁,比如当算法代码很多的时候,那我们是不是要在后面(或者前面)加上很多项:

T(n)=O(2n2+2n+3+4n+5n+...) T(n) = O(2n^2 + 2n + 3 + 4n + 5n + ...) T(n)=O(2n2+2n+3+4n+5n+...)

这也不方便,因此大佬们又想了方法:**只需要保留最大量级的运行次数即可!**这是因为当输入数据规模很大,比如 100000, 1000000 等,常数项 3、一阶项 2n 等低阶的运行次数对最高次项 2n22n^22n2 的影响并不大,所有代码的运行次数基本与最高阶 2n22n^22n

【Python】算法基础知识 第一章:算法的度量衡 —— 时空复杂度分析Python性能陷阱在踏上算法探索的征途之前,我们必须先锻造好我们的度量工具。没有度量,就无法比较;没有比较,就无法选择;没有选择,就无法优化。在算法的世界里,这个度量衡就是“时空复杂度”。1.1 为何需要复杂度分析?—— “跑一下代码看看”的局限性一个初学者在比较两个算法(例如,两种不同的排序方法)的优劣时,最直观的想法可能是:“我把这两个算法都实现出来,然后用同一个大列表去跑一下,看看哪个花的时间短。”这是一种基于经验的测试方法,它在某些情况下有用,但作为一种 阅读详情

相关推荐

算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度

qq_16628695的博客 2778

数据结构——算法的时间复杂度

如何衡量一个算法的好坏呢?斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好坏呢?

CptGhost的博客 2920

高光谱目标检测论文学习(1)—— Hyperspectral Target Detection:Hypothesis Testing,SNR and SA Theories

前言 从这篇开始,将会学习一些高光谱目标检测的论文,我仍然把这篇文章放到了读论文专栏里,但是不对其进行顺序编号了,因为这个方向是比较小众的。今天来学习这篇TGRS2021的最新论文,讲的比较详细,相对比较适合初学者入门。我之前也写过一些有关目标检测的论文,但是高光谱目标检测(HTD)和之前的我们学的目标检测是不同的,因为其检测的对象不是普通摄像头得来的数字图像,而是高光谱遥感图像。其包含了很多光谱信息,而光谱信息本身经过处理后就可以作为特征,因此很多情况下就无需使用广义的目标检测问题中的卷积神经网络等方式去

MrBamboo2000的博客 7420

算法的时间空间复杂度(一看就懂)

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡量不同算法之间的优劣呢? 主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空...

weixin_43731005的博客 1094

数据结构算法--概述

Java数据结构算法一、数据结构算法概述1.1 什么是数据结构?1.2 数据结构分类1.3 什么是算法?1.4 算法初体验2. 算法分析1.1 算法的时间复杂度分析1.1.1 函数渐近增长1.1.2 算法时间复杂度1.1.2.1 大O记法1.1.2.2 常见的大O阶 一、数据结构算法概述 1.1 什么是数据结构? 官方解释 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话 数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据

placid2的博客 475

算法(一):算法复杂度之时间复杂度和空间复杂度

目录 概念 复杂度分析 时间复杂度分析 空间复杂度分析 总结 概念 算法复杂度:是指算法在编写成可执行程序后,运行时所需要的资源,包括时间资源(运行算法耗费的时间)和内存资源(程序运行占用的内存大小)。它是一个衡量算法优劣的重要指标,按照所需资源的又细分为时间复杂度和空间复杂度。 时间复杂度:运行算法所需的时间随着数据量变化关系,记做T(n),n为算法的规模。 空间复杂度:一个算...

huangggf的博客 7486

数据结构算法分析c++第四版_数据结构算法 - 时空复杂度分析

这周主要总结了时间复杂度的学习,跟小伙伴们分享下,欢迎指正。一、为何需要分析算法复杂度挺多同学本科都学习过数据结构算法这门课,但是有没有想过这门课到底是解决什么问题?科学家设计这些数据结构算法是要干嘛?其实,最终的目的只有一个:让我们写的代码在计算机上运行的速度更快,使用的内存更省!,可是如何才能知道我们写的代码使用多少运行时间和内存呢?这就需要分析算法时间复杂度和空间复杂度,只有学会分析这 ...

weixin_39914975的博客 492

算法模板ACW(更新中)

总目录:基础算法数据结构搜索图论数学知识动态规划贪心时空复杂度分析 基础算法 点我: link. 数据结构 点我: link. 搜索图论 点我: link. 数学知识 点我: link. 动态规划 点我: link. 贪心 点我: link. 时空复杂度分析 点我: link. ...

MoRan0_0的博客 221

数据结构】时间复杂度空间复杂度的介绍

虽然在很多情况下,程序的时空特性是相互制约的,就像鱼熊掌不可兼得,但我们可以根据程序实际解决问题的侧重点,去平衡时间和空间的对性能的消耗。一段程序的性能指标,既要运行快速,又要节省内存,而通常这两者又是相互制约的,很难兼得。各个元素之间是一种一对一的关系,比如图书馆中的书架的书,除了首尾两本书之外,其余的任意一本书的编号假设是N,都有且仅有一个直接前驱节。上述线性关系的表述不同,如果各个元素之间不是严格一对一的关系,则被称为非线性关系,比如家族中的各个成员、不同城市间的交通道路等,对。

qq_62917398的博客 787

Java算法时空复杂度

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/2301_80350265/article/details/143754547

2301_80166152的博客 132

第一、二章 绪论线性结构

提示:以下是本篇文章正文内容,下面案例可供参考1.算法最坏情况下的时间复杂度是指算法求解输入规模为n的问题实例所需最多的基本运算次数2.求时间复杂度O(n) i以2为公比等比数列递增,等比数列求和次数小于ni<n;i*=2)j<i;j++) sum++;3.汉诺塔算法中,移动n个盘子到指定位置需要2^n-1次,其中最小的盘子移动2^(n-1)次。4.位运算中,n&1=1表示n为奇数(2进制最后一位是1)

m0_72303194的博客 686

数据结构算法简介

数据结构是计算机存储和组织数据的一种方式。数据结构就是把数据组织起来,为了更方便地使用数据我们为了解决问题,需要将数据保存下来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理。我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构

2302_81238902的博客 598

数据结构排序算法系列】数据结构八大排序算法

排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将对数据结构中常见的八大排序算法进行详细的讲解。写在前面的话:首先要明白在学习同类型的排序算法时,一定要明白任何相同领域存在的东西一定是竞争之后的结果,所以对于相同类型的排序之所以能够存在多种被人熟...

weixin_33697898的博客 1003

算法空间时间复杂度分析

算法的空间复杂度(Space Complexity)是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)空间复杂度依然使用大O来表示 , 利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计 , 避免超出内存限制空间复杂度是看程序运行时占用内存的大小,而不是可执行文件的大小从用户使用体验上看,更看重的程序执行的速度(时间复杂度 ), 一些缓存产品 (redis, memcache)和算法(基数排序)本质就是用空间换时间。

欢迎阅读我的博客 912

什么是算法的时间复杂度和空间复杂度?

空间复杂度描述的是算法在最坏情况下所需的额外内存空间,包括算法中使用的辅助数据结构和临时变量等。算法的时间复杂度和空间复杂度都是用来衡量算法的效率和资源消耗的。时间复杂度描述的是算法在最坏情况下执行所需的时间,即算法的最大运行时间。需要注意的是,时间复杂度和空间复杂度只是对算法的一种理论分析,实际执行时间和空间占用也受到计算机硬件、编程语言和优化等方面的影响。因此,在选择和评估算法时,需要综合考虑时间复杂度、空间复杂度以及实际环境等因素。算法的时间复杂度和空间复杂度是衡量算法效率的两个重要指标。

wzxue1984的博客 740

时间复杂度和空间复杂度

时间复杂度和空间复杂度算法效率时间复杂度时间复杂度的概念空间复杂度 算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。 时间复杂度 时间复杂度的概念 时间复杂度的

qq_57563254的博客 862

详细讲解算法时空复杂度

而这里的函数栈帧并不会因为新的函数栈帧的开辟而销毁上一次开辟的,因为每一次递归,两个函数栈帧之间是有联系的,如果将某层栈帧销毁后,那么下面的函数将无法完成“归”的操作。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但其实右侧的递归调用所开辟的函数栈帧是左侧的函数栈帧是相同的,也就是说两侧所用的空间是相同的。在数据结构的时间复杂度计算中,只有以2为底的,可以忽略底数。衡量一个算法的好坏,看的不是代码的简洁程度,而是算法的效率,即算法的复杂度。

Fahaxiki_lyt的博客 2029

【OpenClaw从入门到精通】第04篇:Web/TUI/钉钉全打通!OpenClaw多端交互实测指南(2026避坑版)

本文详解OpenClaw三大交互方式(Web控制台、TUI终端、钉钉集成),解决新手多端操作难题。Web控制台适合可视化深度配置,TUI终端满足服务器高效运维,钉钉集成实现移动办公协同。提供2026实测配置步骤、代码示例及避坑指南,涵盖设备配对、终端命令优化、聊天机器人回调验证等核心场景,助用户快速掌握"随时召唤AI助理"的全链路方案。 关键词 OpenClaw、多端交互、Web控制台、TUI终端、钉钉集成、AI助理、实操指南 核心亮点 全链路打通:覆盖Web/TIM/IM三端配置

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3409

人工智能训练师(4级)理论知识复习题参考答案.pdf

人工智能训练师操作技能考核培训资料

上一篇: ROS 机器人技术 - 静态 TF 坐标帧
下一篇: 从 0 开始机器学习 - 机器学习算法诊断
登龙
博客等级 码龄8年 127粉丝 103原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值