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

news2025/1/11 18:50:33


目录

---前言

1.算法效率

1.1 算法的复杂度

2.时间复杂度

2.1 时间复杂度的概念

2.2 大O的渐进表示法

2.3常见时间复杂度计算举例

2.3.1 示例1

2.3.2 示例2

2.3.3 示例3

2.3.4 示例4

2.3.5 示例5

2.3.6 示例6

2.3.7 示例7

2.3.8 示例8

3.空间复杂度

3.1 示例1

3.2 示例2

3.3 示例3

3.4 示例4

4. 复杂度oj练习

4.1 消失的数字

4.1.1 思路

4.1.2 代码

4.2 旋转数组OJ

4.2.1 思路

4.2.2 代码


---前言

本篇文章相对于前面的顺序表和链表而言,比较简单。主要说明算法的时间复杂度和空间复杂度的问题,学习完之后还有一些练习题帮助巩固今天的知识。同时,本篇文章可以帮助大家在以后的刷题过程中择优选择复杂度低的思路,从而提高代码的效率。

1.算法效率

下面,我们就开始本篇的学习:

我们知道,一个题目会有多种算法思路,但是我们怎么判断一个算法的好坏呢?通过代码行数吗?还是通过什么别的方法?


这就引入了复杂度的知识:

1.1 算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是时间空间两个维度来衡量的,即时间复杂度和空间复杂度

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。


2.时间复杂度

2.1 时间复杂度的概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。

一个算法所花费的时间与其中语句的执行次数成正比例算法中的基本操作的执行次数,为算法的时间复杂度。

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。


下面我们举一个例子来看看:

// 请计算一下Func1中++count语句总共执行了多少次?
void Func1(int N)
{
int count = 0;
for (int i = 0; i < N ; ++ i)
{
 for (int j = 0; j < N ; ++ j)
 {
 ++count;
 }
}
 
for (int k = 0; k < 2 * N ; ++ k)
{
 ++count;
}
int M = 10;
while (M--)
{
 ++count;
}
printf("%d\n", count);
}


实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法


2.2 大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

推导大O阶方法:

1、用常数1取代运行时间中的所有加法常数

2、在修改后的运行次数函数中,只保留最高阶项(影响力最大的)

3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项简洁明了的表示出了执行次数。

另外有些算法的时间复杂度存在最好、平均和最坏情况

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数(下界)

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

最好情况:1次找到

最坏情况:N次找到

平均情况:N/2次找到

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


2.3常见时间复杂度计算举例

2.3.1 示例1

// 计算Func2的时间复杂度?
void Func2(int N)
{
 int count = 0;
 for (int k = 0; k < 2 * N ; ++ k)
 {
 ++count;
 }
 int M = 10;
 while (M--)
 {
 ++count;
 }
 printf("%d\n", count);
}


2.3.2 示例2

// 计算Func3的时间复杂度?
void Func3(int N, int M)
{
 int count = 0;
 for (int k = 0; k < M; ++ k)
 {
 ++count;
 }
 for (int k = 0; k < N ; ++ k)
 {
 ++count;
 }
 printf("%d\n", count);
}


2.3.3 示例3

// 计算Func4的时间复杂度?
void Func4(int N)
{
 int count = 0;
 for (int k = 0; k < 100; ++ k)
 {
 ++count;
 }
 printf("%d\n", count);
}


2.3.4 示例4

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );
//strchr---遍历字符串寻找要找的字符


2.3.5 示例5

// 计算BubbleSort的时间复杂度?
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;
 }
}


2.3.6 示例6

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{
 assert(a);
 int begin = 0;
 int end = n-1;
 // [begin, end]:begin和end是左闭右闭区间,因此有=号
 while (begin <= end)
 {
 int mid = begin + ((end-begin)>>1);
 if (a[mid] < x)
 begin = mid+1;
 else if (a[mid] > x)
 end = mid-1;
 else
 return mid;
 }
 return -1;
}


2.3.7 示例7

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

这个比较简单,时间复杂度:O(N)


2.3.8 示例8

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
 if(N < 3)
 return 1;

return Fib(N-1) + Fib(N-2);
}


3.空间复杂度

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

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定


3.1 示例1

// 计算BubbleSort的空间复杂度?
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;
 }
}


3.2 示例2

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{
 if(n==0)
 return NULL;
 
long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i<=n;++i)
{
 fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
 return fibArray;
}


3.3 示例3

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}


3.4 示例4

// 计算斐波那契递归Fib的空间复杂度?
long long Fib(size_t N)
{
 if(N < 3)
 return 1;

return Fib(N-1) + Fib(N-2);
}

递归空间复杂度计算,也是空间累加,但是不同的是空间可以重复利用


对空间可以重复利用的解释:

返回的时候会释放空间,释放空间意味着将空间的使用权还给系统,系统可以把空间的使用权赋给别人​​​​​​​​​​​​​​

就像出去住酒店,定了一间房间,酒店将使用权被赋予给你,等你退房的时候,酒店将你的使用权收回,酒店之后可以赋予给别人,也就是下一个定这个房间的人



4. 复杂度oj练习

4.1 消失的数字

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


4.1.1 思路


4.1.2 代码



4.2 旋转数组OJ

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


4.2.1 思路


4.2.2 代码

(可能超过时间限制)



​​​​​​​


本次的分享到这里就结束了!!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕


​​​​​​​

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

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

相关文章

安装软件时msvcp140.dll丢失的解决方法,快速解决dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。msvcp140.dll是微软Visual C 2015运行库中的一个组件&#xff0c;它包含了许多用于支持C编程语言的函数和类。当我们在使用某些需要依赖这个运行库的程序时&#xff0…

打卡系统有什么用?如何通过日常管理系统提高企业员工的效率?

在当今快速发展的时代&#xff0c;职工的行动管理已成为机构单位工作中至关重要的一环。如何更好地了解和掌握职工的日程安排和行动轨迹&#xff0c;成为了一个值得探讨的问题。为了解决这一难题&#xff0c;“的修”打卡系统应运而生&#xff0c;它为我们提供了一个全面而高效…

跨境卖家必备的自养号测评技巧:提升商品评论数量和销量

无论是亚马逊还是拼多多Temu、shopee、Lazada、wish、速卖通、煤炉、敦煌、独立站、雅虎、eBay、TikTok、Newegg、Allegro、乐天、美客多、阿里国际、沃尔玛、OZON、Joom、Facebook、daraz、Cdiscount、Kaufland、DARTY、MANO、Shein、Jumia、eMAG、Fnac、Onbuy、Fruugo、等跨境…

在线判断代理是否生效

在线网站 http://www.zhizhi365.com/ 数据

日料西餐厅餐品预约小程序的作用是什么

日料店西餐厅客源也不少&#xff0c;对经营者来说&#xff0c;高市场需求度的同时也面临一些痛点&#xff1a; 1、品牌宣传拓客难 日料/西餐厅虽然已经存在多年&#xff0c;但依然有大量用户并没有消费过&#xff0c;因此这需要商家不断拓展品牌实力及餐品呈现吸引客户前往&a…

微信管理系统:让企业更轻松地管理客户和员工资源

在日常工作中&#xff0c;我们经常遇到以下问题&#xff1a; ①由于微信号众多&#xff0c;需要频繁地在不同设备之间切换&#xff0c;这严重影响了工作效率。 ②尽管我一直努力回复客户的消息&#xff0c;但有时还是无法做到即时回复&#xff0c;这给客户带来了一些不便。 …

浙大软院2024届推免录取名单及分析

名单 分析 浙大软院共录取电子信息专业推免生219人&#xff0c;机械专业推免生20人 小Tips&#xff1a;浙大软院夏令营考核时间比较长&#xff0c;并且不发offer&#xff0c;但是如果夏令营能拿到优营能够直入预推免哦&#xff0c;以浙大为梦校并且背景不是特别好的同学可以多…

C# OpenCvSharp 环形文字处理 直角坐标与极坐标转换

效果1 效果2 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.*…

K8S篇之K8S详解

一、K8S简介 k8s全称kubernetes&#xff0c;是为容器服务而生的一个可移植容器的编排管理工具。k8s目前已经主导了云业务流程&#xff0c;推动了微服务架构等热门技术的普及和落地。 k8s是自动化容器操作的开源平台。这些容器操作包括&#xff1a;部署、调度和节点集群间扩展。…

深入OpenCV Android应用开发

前言 OpenCV是Open Source Computer Vision library(开源的计算机视觉库)的缩写。它是使用最广泛的计算机视觉库。Opencv是计算机视觉领域常用的操作函数的集合&#xff0c;其自身由C/C编写而成&#xff0c;同时也提供了对Python、Java以及任意JVM语言的封装。考虑到大部分And…

你在React项目中是如何使用Redux的? 项目结构是如何划分的?

一、背景 在前面文章了解中&#xff0c;我们了解到redux是用于数据状态管理&#xff0c;而react是一个视图层面的库 如果将两者连接在一起&#xff0c;可以使用官方推荐react-redux库&#xff0c;其具有高效且灵活的特性 react-redux将组件分成&#xff1a; 容器组件&#…

【带头学C++】----- 三、指针章 ---- 3.11 补充重要指针知识(二,拓展基础知识)

1.指针与函数 1.1指针变量作为函数的参数 如果想在函数内部修改外部变量的值&#xff0c;可以将外部变量的地址传递给函数。 在C/C中&#xff0c;函数的参数传递方式有值传递&#xff08;传递变量的副本&#xff09;和引用传递&#xff08;传递变量的地址&#xff09;。如果希…

最新整理【剑侠情缘龙雀修复BGU版】linux服务端带授权后台+详细教程+包进游戏

搭建资源下载地址&#xff1a;最新整理【剑侠情缘龙雀修复BGU版】linux服务端带授权后台详细教程包进游戏 - 海盗空间

Flutter笔记:关于Flutter中的大文件上传(上)

Flutter笔记 关于Flutter中的大文件上传&#xff08;上&#xff09; 大文件上传背景与 Flutter 端实现文件分片传输 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#…

企业办理CCRC需要多少费用?

近几年&#xff0c;很多企业都在咨询了解CCRC认证&#xff0c;各企业对于办理CCRC资质认证最在意的一个环节就是办理的费用&#xff0c;也有不少企业都在咨询同邦信息科技的小编费用的问题&#xff0c;那今天同邦信息科技的小编就给大家说一下 先来给大家科普一下CCRC认证&…

浅谈数据中心机房末端配电技术与产品监控选型-安科瑞黄安南

摘要 数据中心机房末端配电的可靠性、稳定性和可维护性直接关系到IT设备的安全供电。数据中心的末端配电技术主要有两种&#xff0c;一种采用列头柜加电缆配电&#xff0c;另一种是智能小母线配电。分别对两种配电技术进行了介绍和探讨&#xff0c;最后对两种配电方式进行了对…

搜款网VVIC商品详情API接口

搜款网VVIC商品详情接口提供了全面的API接口&#xff0c;通过该接口&#xff0c;开发者可以使用商品ID等参数请求API&#xff0c;获取商品的详细信息&#xff0c;如商品标题、描述、价格、库存状态、销售量等。 要使用VVIC商品详情接口&#xff0c;您需要先注册开发者账号并申…

Yarn安装成功但提示 command not found 解决方案

文章目录 查看yarn配置卸载yarn删除注册表清除yarn缓存npm安装yarn安装完成后yarn -v提示command not found&#xff0c;故选择使用命令重新安装命令安装yarn然后打开.bash_profile文件&#xff1a;参考&#xff1a;https://www.python100.com/html/119013.html 最近遇到项目使…

【23-24 秋学期】NNDL 作业7 基于CNN的XO识别

一、用自己的语言解释以下概念 局部感知、权值共享池化&#xff08;子采样、降采样、汇聚&#xff09;。会带来那些好处和坏处&#xff1f;全卷积网络&#xff08;课上讲的这个概念不准确&#xff0c;同学们查资料纠正一下&#xff09;低级特征、中级特征、高级特征多通道。N输…