时间复杂度和空间复杂度详解

news2025/7/8 14:18:10

文章目录

引入

一、时间复杂度的详解及例题

1、时间复杂度的概念

2、时间复杂度的例题训练

2.1  实题训练1

2.2  实题训练2

2.3  实题训练3

2.4  实题训练4

2.5   大O符号(Big O notation)的函数绘图

 二、空间复杂度的详解及例题

1、空间复杂的的概念

2、空间复杂度的例题

2.1  实题训练1

2.2  实题训练2


标题:时间复杂度和空间复杂度

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

引入

  随着科技的发展,日益趋显的是我们对效率的要求越来越高了。当然,说到我们的算法也不例外。

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

一、时间复杂度的详解及例题

1、时间复杂度的概念

  时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个西数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。通俗来讲,我们只需要计算出大概的次数,时间复杂度就是在一个算法中执行次数最多的一个循环。

  我们来结合着例题一起看一下,这样更加容易理解。

2、时间复杂度的例题训练

2.1  实题训练1

  我们看下面的一段代码的时间复杂度为多少呢?

  我们先来看一下上面的代码总执行的次数吧。

  我们不难看出,第一个for循环执行的次数为N*N次,第二个for循环执行的次数为2*N次,while循环执行了10次。那么总次数即为F(N)=N*N+2*N+10。我们再看下面的表格:

 
F(N)与N和N*N的变化对比

N   

N*NF(N)
10100130
1001000010210
100010000001002010

  从上面的表格我们不难看出,当N越大时,N*N对F(N)的影响最大,其他项的影响极小,甚至可以忽略不计。于是我们实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。大O符号(Big O notation):是用于描述西数渐进行为的数学符号。我们来看一下推导大O阶方法

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

  使用大O的渐进表示法以后,我们可以计算出Func1的时间复杂度为:

O(N*N)

2.2  实题训练2

  我们再来看一个例题: 

   这里我们使用大O的渐进表示法,很容易可以看出来时间复杂度。当M远大于N时,时间复杂度为O(M),当M和N差不多大时,时间复杂度为O(M)或者O(N)。

2.3  实题训练3

我们再来看一个简单的为常数的:

  同样, 这里我们使用大O的渐进表示法,我们可以看出上面的代码执行了100次,我们通过大O阶方法的第一条规则可以看出,时间复杂度为O(1)。

2.4  实题训练4

  通过上面我们会发现大0的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
  另外有些算法的时间复杂度存在最好、平均和最坏情况:

  • 最坏情况:任意输入规模的最大运行次数(上界)。
  • 平均情况:任意输入规模的期望运行次数。
  • 最好情况:任意输入规模的最小运行次数(下界)。

  例如:在一个长度为N数组中搜索一个数据x

  • 最好情况:1次找到。
  • 最坏情况:N次找到。
  • 平均情况:N/2次找到。

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N) .

  实际的例子有我们常见的:冒泡排序,二分查找等等。这些的时间复杂读我们都要看最坏的情况。

2.5   大O符号(Big O notation)的函数绘图

   需要注意的是,在这里的logN,N为元素的个数。这个在二分查找中很容易解释。假设我们查找了X次,因为每次查找去掉了一般元素,那么实际的元素个数N=2^X,那么X=logN(以2为底)。

   通过上图来看,时间效率从上往下,依次降低。

 二、空间复杂度的详解及例题

1、空间复杂的的概念

  空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没大大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

2、空间复杂度的例题

2.1  实题训练1

  我们先来看一个相对较为简单的例题: 

 

  我们先来看一下总共变量的个数。这里要注意的是malloc动态开辟了一块空间,这里相当于就是开辟了一个动态数组。其中变量的个数为n+1,还有一个n变量,则总共有n+2个变量。使用大O渐进表示法,常数直接去掉。则空间复杂度为O(N)。

2.2  实题训练2

  我们再来看一个相对较难理解的一个例题: 

   其实这里应用了函数的递归。很容易看出调用了N-1次函数,每次调用时都会为函数创建栈帧,每个函数的栈帧中都会有常数个变量(时间复杂度为O(1))。调用了N-1次,那么运用大O渐进法很容易得出该函数的空间复杂度为O(N).

  好了,我们今天就学到这里,希望以上的内容对你的理解有一个很好的帮助。

  感谢您的观看,后续还会一直更新哦ovo!

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

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

相关文章

Java注解与原理分析

使用的太多,被忽略的理所当然; 一、注解基础 注解即标注与解析,在Java的代码工程中,注解的使用几乎是无处不在,甚至多到被忽视; 无论是在JDK源码或者框架组件,都在使用注解能力完成各种识别和…

【Vue】url拼接参数获取解析

前言: 前端在开发的时候有很多情况下需要提供不带参数的链接或者带参数的链接给自己使用或者给第三方系统,如果提供给第三方系统使用的话一般是第三方需要通过iframe/window.open/a标签打开链接进入对应的页面。 情况一:获取当前浏览器地址栏…

【React二】ref与事件处理与生命周期钩子函数

关于react基础及组件化编程的可以参考本篇笔记 文章目录一、 React中的事件处理1-1 例子: 不要过度使用ref1-2 受控组件与非受控组件1-2-1 受控组件1-2-2 非受控组件1-3 高阶函数1-3-1 函数的柯里化1-3-2 不用柯里化的写法二、生命周期2-1 引出生命周期2-2 组件生命…

TiDB 数据库架构概述

TiDB 数据库架构概述 TiDB体系架构 水平扩容或者缩容金融级高可用实时HTAP云原生的分布式数据兼容MYSQL5.7 Region:存储单位,96~144MB之间,分布式存储在TiKV中 TiKV:默认三副本,将分布式数据存储,并进行存储副本。…

【ARM微型电脑/IoT设备/嵌入式】树莓派安装失败sysstat,成功后还是无法使用sar,并报错:-bash:sar:command not found

1. 安装sysstat报错 安装: sudo apt-get install sysstat错误如下: dpkg: error processing package sysstat (–configure): installed sysstat package post-installation script subprocess returned error exit status 10 Errors were encountered…

1737C - Ela and Crickets

原题链接: Problem - 1737C - Codeforces 题目描述: The problem, which involves a non-standard chess pieces type that is described below, reads: given 33 white crickets on a n⋅nn⋅n board, arranged in an "L" shape next to ea…

详细讲解磁盘及文件系统管理(图例解析)

磁盘及文件系统管理详解 目前市场上主流的磁盘是机械式硬盘 u盘,光盘,软盘,硬盘,磁带 机械式硬盘 【硬盘内部由一个个同心圆组成】如下图: 硬盘内部所有盘片都固定在一根“轴”上,所以:所有…

Vant的List组件列表 滑动后不触底也发送请求的Bug

📃目录跳转📚简介:🎉页面效果:💭使用Float:🧐 问题:🔭div 转为行内块 (解决)🏆总结:📚简介: Vant的…

docke入门基础知识

一、Docker 架构 Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 容…

html前端跨域问题的解决方案

前言: 在前端发出Ajax请求的时候,有时候会产生跨域问题,报错如下: Access to XMLHttpRequest at ‘http://127.0.0.1/api/post’ from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is pre…

WINSOFT ComPort轻松连接到各种串行端口和连接设备

WINSOFT ComPort轻松连接到各种串行端口和连接设备 WINSOFT ComPort是一个Delphi库和CBuilder,通过USB端口连接到输入设备。该库提供CP210x、CP2130、CDC、FTDI、PL2303和CH34x设备。这些标准包括广泛的设备和电气从设备。例如,除了标准输入设备之外&…

Android App开发之利用Glide实现图片的三级缓存Cache讲解及实战(附源码 超详细必看 简单易懂)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、利用Glide实现图片的三级缓存 图片加载框架之所以高效,是因为它不但封装了访问网络的步骤,而且引入了三级缓存的机制。具体来说,是先到内存中查找图片,找到了就直接显示内存图…

国内访问Github超级慢?那是你没有用我这个脚本。直接起飞。

导语 之前很多朋友咨询过国内访问Github较慢的问题,然后我一般让他们自己去知乎上找攻略,但今天我才发现网上竟然没有一个一键配置的脚本,一般都需要我们跟着教程一步步地去做才行。这也太麻烦了,于是自己动手写了个脚本&#xf…

2-1 C++类的转换函数与禁止隐士转换(explicit)

1. 转换函数与explicit关键字 1.1 转换函数 下述代码的第5行operator double()即是一个转换函数,通过这个函数,编译器可以在需要的情况下,直接将Fraction类型的对象转换为double类型。这个函数有两个特点:首先因为转换函数的返回…

FFplay文档解读-50-多媒体过滤器四

32.21 showspectrumpic 将输入音频转换为单个视频帧,表示音频频谱。 过滤器接受以下选项: size,s指定输出的视频大小。 有关此选项的语法,请查阅(ffmpeg-utils)视频大小语法。 默认值为4096x2048。 mod…

Spring Boot入门必会(基本介绍+依赖管理+自动装配)

目录 一.基础入门 1.Spring Boot 是什么? 2.SpringBoot 快速入门 2.1完成步骤 2.2快速入门小结 3.Spring SpringMVC SpringBoot 的关系 3.1梳理关系 3.2如何理解 -约定优于配置 二.依赖管理和自动配置 1.依赖管理 1.1 什么是依赖管理 1.2 修改自动仲裁/默认版本号 …

论文阅读-Federated Social Recommendation with Graph NeuralNetwork

基于图神经网络的联邦社交推荐 1. 引言 因此,针对社交推荐任务,我们设计了一个联邦学习推荐系统,该系统具有异构性、个性化和隐私保护要求,具有一定的挑战性。为此,设计了一个基于图神经网络(FeSoG)的联邦社交推荐框…

【RHCE】ansible的简单配置

目录 使用静态清单文件指定受管主机 定义主机清单 定义方式 使用静态主机清单指定受管主机(默认) 验证清单 第一种方式 第二种方式(图表形式显示) 选择主机和组: 1>匹配所有主机 2>匹配指定的主机或者主…

二叉树与树、森林之间的转换

关于树的概念 树可以称为特殊的森林 , 其中二叉树是树中一些节点度数最大为2 ,并且分左右孩子的树 ● 二叉树很重要 • 结构简单 • 存储效率高 • 运算算法相对简单 • 任何森林、树都可以转换成二叉树 ● 讨论 • 二叉树 度为2 的树 ? 答: 树的度就是…

官方盘点 .NET 7 新功能

.NET 7 为C# 11/F# 7、.NET MAUI、ASP.NET Core/Blazor、Web API、WinForms、WPF 等应用程序带来了更高的性能和新功能。使用 .NET 7,您还可以轻松地将 .NET 7 项目容器化,在 GitHub 操作中设置 CI/CD 工作流,并实现云原生可观察性。欢迎下载…