当前位置: 首页 > news >正文

数据结构——时间复杂度和空间复杂度

目录

时间复杂度

什么是时间复杂度

常见时间复杂度类型

如何计算时间复杂度

空间复杂度

什么是空间复杂度

常见的空间复杂度类型

如何计算空间复杂度


时间复杂度和空间复杂度是评估算法性能的两个重要指标。

时间复杂度

什么是时间复杂度

时间复杂度描述了算法执行所需时间随输入规模增长的变化趋势。它通常用大O表示法来描述,表示算法在最坏情况下的时间性能

常见时间复杂度类型

  • 常数时间:O(1)。算法执行时间不随输入规模的变化而变化。
  • 线性时间:O(n)。算法执行时间与输入规模成正比。
  • 平方时间:O(n^2)。算法执行时间与输入规模的平方成正比,通常见于嵌套循环。
  • 对数时间:O(logn)。算法执行时间随输入规模的增长而缓慢增加,常见于分治和二分查找算法。
  • 线性对数时间:O(nlogn)。算法执行时间是输入规模与对数的乘积,常见于快速排序或归并排序。
  • 指数时间:O(2^n)。算法执行时间随输入规模指数增长,常见于暴力搜索。

在大O表示法中,logn一般指的是以2为底的对数,因为绝大部分都只用考虑二分的情况,以其他数为底的情况很少出现。

如何计算时间复杂度

exp.1

//Func1的时间复杂度为O(N)
void Func1(int N)
{int i = 0;int count = 0;for (i = 0; i < N; i++){++count;}int m = 10;while (m){--m;}printf("%d\n",count);
}

该函数的运行时间主要跟输入的N的大小有关,故为O(n)的时间。

至于说下面的执行的m次循环,我们是不用理会的,因为在输入的N很大的情况,m次循环可以被忽略掉。我们算时间复杂度都是关注主要最主要的部分,比如说O(n^2 + 2n), 那么时间复杂度是O(n^2)。

exp.2

//Func2的时间复杂度为O(N)
void Func2(int N)
{int count = 0;int i = 0;for (i = 0; i < N; i++){++count;}for (i = 0; i < N; i++){++count;}printf("%d\n",count);
}

这里咋一看时间复杂度是O(2n),但其实时间复杂度还是O (n)。

计算机运行的时间是非常快的,所以即使n非常大,n的常系数对于整个函数的运行时间是微乎其微的。

所以算时间复杂度也不用算n的常系数。

exp.3

//Func3的时间复杂度为O(1)
void Func3()
{int count = 0;int i = 0;for (i = 0; i < 100; i++){++count;}printf("%d\n",count);
}

时间复杂度为O(1),因为是常数次运行。

exp.4

// BubbleSort的时间复杂度为O(N^2)
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

外层循环执行n次,内层循环执行n-1次、n-2次...等,等差乘等比,最会算出来会有n^2,所以时间复杂度是O(n^2)。

exp.5

// BinarySearch的时间复杂度O(logN)
int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n - 1;while (begin < end){int mid = begin + ((end - begin) >> 1);//使用右移操作符相当于除以2if (a[mid] < x)begin = mid + 1;else if (a[mid] > x)end = mid;elsereturn mid;}return -1;
}

二分查找的时间复杂度是O(logn),就是对n取以二为底的对数。

exp.6

// 阶乘递归Fac的时间复杂度为O(N)
long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}

递归的次数同样也算进时间复杂度,这里递归了n次,所以时间复杂度是O(n)。

这里的空间复杂度也是O(n),因为递归调用函数会在栈上多开n块额外的空间。

exp.7

// 斐波那契递归Fib的时间复杂度为O(2^N)
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

以这种方法算斐波那契数列的递归调用次数,有点类似算完全二叉树的节点个数。

所以时间复杂度是O(2^n)。

总结

时间复杂度只需大概想想执行次数n的表达式,取次数最大的那项,也不用理会n的常系数。

如果涉及递归,要想想递归函数的执行次数。

空间复杂度

什么是空间复杂度

空间复杂度描述了算法执行过程中所需的额外存储空间量,也用大O表示法来描述。

常见的空间复杂度类型

  • 常数空间:O(1)。算法使用固定数量的额外空间,与输入规模无关。
  • 线性空间:O(n)。算法使用的额外空间与输入规模成正比。
  • 平方空间:O(n^2)。算法使用的额外空间与输入规模的平方成正比。
  • 对数空间:O(logn)。算法使用的额外空间随输入规模的增长而缓慢增加。
  • 线性对数空间:O(nlogn)。算法使用的额外空间是输入规模与对数的乘积。

如何计算空间复杂度

exp.1

//sum的空间复杂度是O(1)
int sum(int n) {int sum = 0;for (int i = 0; i < n; i++) {sum += i;}return sum;
}

sum只额外开辟变量sum,额外开辟的空间跟输入的n无关,所以空间复杂度是O(1)

exp.2

//Func的空间复杂度是O(n)
void Func(int n)
{int* arr = (int*)malloc(sizeof(int) * n);//....}

Func使用的空间复杂度是O(n),因为额外开辟的空间与n成正比。

总结

计算空间复杂度只需看使用的额外存储空间与输入数据规模大小的关系,比如,跟规模无关就是O(1),跟规模成正比就是O(n),其他O(n^2)等同理。


拜拜,下期再见😏

摸鱼ing😴✨🎞

相关文章:

数据结构——时间复杂度和空间复杂度

目录 时间复杂度 什么是时间复杂度 常见时间复杂度类型 如何计算时间复杂度 空间复杂度 什么是空间复杂度 常见的空间复杂度类型 如何计算空间复杂度 时间复杂度和空间复杂度是评估算法性能的两个重要指标。 时间复杂度 什么是时间复杂度 时间复杂度描述了算法执行所需…...

(echarts) 饼图设置滚动图例

(echarts) 饼图设置滚动图例 效果&#xff1a; 代码&#xff1a; // 图例 legend: {type: scroll,orient: vertical,right: 10,top: 20,bottom: 20,data: data.legendData},参考&#xff1a;官网-可滚动的图例 https://echarts.apache.org/examples/zh/editor.html?cpie-leg…...

Java spring SSM框架--mybatis

一、介绍 Spring 框架是一个资源整合的框架&#xff0c;可以整合一切可以整合的资源&#xff08;Spring 自身和第三方&#xff09;&#xff0c;是一个庞大的生态&#xff0c;包含很多子框架&#xff1a;Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…...

Python知识点:如何使用Arduino与Python进行物联网项目

Arduino和Python是物联网(IoT)项目中常用的两种技术。Arduino是一个开源的硬件平台&#xff0c;而Python是一种高级编程语言&#xff0c;它们可以结合使用来创建各种智能设备和系统。以下是使用Arduino和Python进行物联网项目的一般步骤&#xff1a; 确定项目需求&#xff1a; …...

论文复现_从 CONAN 中收集 TPL 数据集

1. 概述 CONAN&#xff1a;Conan是一个用于C项目的开源包管理工具。 它的主要目标是简化C项目的依赖关系管理过程&#xff0c;使开发人员能够更轻松地集成、构建和分享C库。 其中有一些比较独特的功能&#xff0c;例如&#xff1a;版本管理、第三方库管理等。 TPL 数据集&…...

使用Docker将Java项目打包并部署到CentOS服务器的详细教程。

当然&#xff0c;让我们将上述步骤进一步细化&#xff0c;以便更好地理解整个过程。 前提条件 一个Java项目CentOS服务器&#xff0c;并且已安装DockerJava项目可以正常在本地运行具有服务器访问权限 ———————————————————————————————————…...

嘉立创eda布线宽度

https://prodocs.lceda.cn/cn/pcb/route-routing-width/#%E5%B8%83%E7%BA%BF%E5%AE%BD%E5%BA%A6...

硬件面试经典 100 题(31~50 题)

31、多级放大电路的级间耦合方式有哪几种&#xff1f;哪种耦合方式的电路零点偏移最严重&#xff1f;哪种耦合方式可以实现阻抗变换&#xff1f; 有三种耦合方式&#xff1a;直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重&#xff0c;变压器耦合的电路可以实现…...

5G:下一代无线通信技术的全面解析

随着科技的不断进步&#xff0c;移动通信技术也在飞速发展。从2G到4G&#xff0c;我们见证了无线网络的巨大变革&#xff0c;而现在&#xff0c;5G已经悄然来临。作为下一代无线通信技术&#xff0c;5G不仅将带来更快的速度和更低的延迟&#xff0c;还将开启全新的应用场景和商…...

关于refresh_token

前文介绍过jwt的一般使用场景&#xff0c;用户登录成功后获得jwt&#xff0c;其中包含用户相关信息&#xff0c;主要是在前端要用到的属性&#xff08;比如姓名、应用角色[这个前端后都用得着]等&#xff09;、在后端要用到的属性&#xff08;比如登录IP、终端唯一标识&#xf…...

Linux网络:基于OS的网络架构

Linux网络&#xff1a;OS视角下的网络架构 网络分层模型OSI 七层模型TCP/IP 五层模型 协议操作系统与网络网络相关命令ifconfigpingnetstat 本博客将基于操作系统&#xff0c;讲解计算机网络的设计理念&#xff0c;帮助大家理解操作系统与网络之间的关系。 网络分层模型 网络…...

UEC++学习(十六)变量添加中文注释、ui设置中文文本

&#xff08;一&#xff09;变量添加中文注释 在C 项目中创建变量&#xff0c;并在蓝图中显示变量的英文名同时附带中文注释&#xff0c;可以使用UPROPERTY 的 ToolTip 元数据属性来实现 UPROPERTY(EditAnywhere, meta (ToolTip "弹夹最大容量"))int32 MagCapacit…...

Redis延迟双删

1、何为延时双删 Redis延迟双删是一种在数据更新操作中确保缓存与数据库数据一致性的策略&#xff0c;通过两次缓存删除操作间隔一段延时来减少数据不一致的问题。 在并发环境下&#xff0c;多个请求同时对同一数据进行读写时&#xff0c;如果没有妥善处理&#xff0c;很容易…...

WO Mic 手机变身免费麦克风

目录 一、主要特点 1.支持多种连接方式 2.应用广泛 3.低延迟 4.简易配置 5.自动连接 6.音频格式 二、软件下载 三、软件安装 四、系统连接 五、测试 直播的时候,上课的时候,会议的时候……突然发现没有麦克风或者电脑麦克风有故障,这可怎么办呢?今天给大家介绍一…...

MQ死信对列

面试题&#xff1a;你们是如何保证消息不丢失的&#xff1f; 1、什么是死信 死信就是消息在特定场景下的一种表现形式&#xff0c;这些场景包括&#xff1a; 1. 消息被拒绝访问&#xff0c;即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常&#xff0…...

springboot乡镇小区管理系统-计算机毕业设计源码73685

摘 要 过去使用手工的管理方式对乡镇小区进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用计算机对停车场停车的各项基本信息进行管理&#xff0c;比起手工管理来说既方便又简单&#xff0c;而且具有易于管理、搜索速度快、存储量大等多个优点。将其使…...

基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展&#xff0c;4S店作…...

小米开放式耳机值得买吗?南卡、小米、漫步者一周横评

​大家好&#xff0c;最近对开放式耳机比较感兴趣&#xff0c;作为一名数码博主以及多年的耳机发烧友&#xff0c;今天想给大家测评一下开放式耳机&#xff0c;这类耳机目前在数码圈非常火热&#xff01;很多喜欢运动的小伙伴都选择了这款耳机&#xff0c;搭配运动场景听歌&…...

解决oracel锁表问题;SQL 错误 [54] [61000]: ORA-00054: 资源正忙

问题描述&#xff1b; SQL 错误 [54] [61000]: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 select session_id from v$locked_object;查看这些 session_id 对应的会话的详细信息&#xff0c;包括用户名、机器名、程序等&#xff0c;9596等是select se…...

Jfinal与hibernate-validator实现后台表单

一. pom.xml配置 jfianl maven项目基础上增加 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency…...

如何快速掌握思源宋体:从新手到高手的7天实战计划

如何快速掌握思源宋体&#xff1a;从新手到高手的7天实战计划 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否曾经在设计中文内容时&#xff0c;为寻找一款既美观又免费的字体而…...

Phi-4-mini-reasoning vLLM参数详解:context_length=131072配置与性能调优

Phi-4-mini-reasoning vLLM参数详解&#xff1a;context_length131072配置与性能调优 1. 模型概述 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它特别针对数学推理…...

利用trl库实现DeepSeek-R1的GRPO训练:从数据处理到模型验证全流程解析

1. 理解GRPO训练与trl库的核心价值 GRPO&#xff08;Generalized Reinforcement Policy Optimization&#xff09;是近年来在强化学习领域兴起的一种训练方法&#xff0c;它通过多维度奖励机制来优化大语言模型的输出质量。我在实际项目中发现&#xff0c;相比传统的PPO&#x…...

PlugY:重塑暗黑破坏神2单机体验的技术突破

PlugY&#xff1a;重塑暗黑破坏神2单机体验的技术突破 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 一、问题篇&#xff1a;暗黑破坏神2单机模式的技术痛点 作为一…...

ESP8266上玩转MicroPython:四角按钮控制LED的3种接线方案对比

ESP8266上玩转MicroPython&#xff1a;四角按钮控制LED的3种接线方案对比 在物联网和智能硬件开发中&#xff0c;ESP8266凭借其出色的性价比和丰富的功能接口&#xff0c;成为了创客和开发者的首选。而MicroPython的出现&#xff0c;更是让Python开发者能够轻松上手硬件编程。本…...

基于NLP-StructBERT的智能客服语义匹配实战:Java微服务集成

基于NLP-StructBERT的智能客服语义匹配实战&#xff1a;Java微服务集成 你有没有遇到过这种情况&#xff1f;用户问“我的订单怎么还没发货”&#xff0c;而你的知识库里只有“订单发货状态查询”这样的标准问题。传统的关键词匹配&#xff0c;比如搜索“订单”和“发货”&…...

JeecgBoot中AutoPoi模板导出的实战技巧与优化方案

1. JeecgBoot中AutoPoi模板导出的基础实现 第一次接触JeecgBoot的AutoPoi模板导出功能时&#xff0c;我被它的便捷性惊艳到了。相比传统的POI操作&#xff0c;AutoPoi通过模板化的方式让Excel导出变得异常简单。这里先分享下最基本的实现步骤&#xff0c;这也是我项目中最常用的…...

Win10自带应用太多?3分钟教你用PowerShell精准卸载(附常用应用命令大全)

Win10系统精简指南&#xff1a;PowerShell精准卸载内置应用全攻略 每次打开开始菜单&#xff0c;那些从未使用过的内置应用图标是否让您感到烦躁&#xff1f;作为技术从业者&#xff0c;我们更希望拥有一个干净高效的工作环境。本文将带您深入探索PowerShell在Windows系统管理中…...

工业现场直通车:用C#和雷赛DMC3000库,从零搭建一个真实的运动控制上位机

工业现场直通车&#xff1a;用C#和雷赛DMC3000库构建高可靠运动控制上位机 在工业自动化领域&#xff0c;运动控制系统的稳定性和实时性直接决定了生产效率和产品质量。许多开发者从教学Demo过渡到实际工业应用时&#xff0c;常常面临理论与实践的断层——教材中的理想化代码无…...

开源硬件监控新选择:LibreHardwareMonitor全方位解析与应用指南

开源硬件监控新选择&#xff1a;LibreHardwareMonitor全方位解析与应用指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项…...