数据结构之“算法的时间复杂度和空间复杂度”

                                                 🌹个人主页🌹:喜欢草莓熊的bear

                                                         🌹专栏🌹:数据结构


目录

前言

一、算法效率

1.1算法的复杂度概念

1.2复杂度的重要性

二、时间复杂度

2.1时间复杂度的概念

2.2大O的渐进表示法

2.3常见的时间复杂度例题计算

例题1

例题2

例题3

三、空间复杂度

3.1空间复杂度的概念

3.2大O的渐进表示法

3.3常见的空间复杂度例题计算

例题1

例题2

例题3

总结


前言

宝宝们,跟上bear的节奏继续进步!

今天我们学习的目标:

1.算法复杂度的理解

2.知道时间、空间复杂度的概念

3.学会使用大O表示法

4.计算常见复杂度例题

一、算法效率

1.1算法的复杂度概念

算法在编写成可执行程序后,运行时需要耗费时间资源和空间 ( 内存 ) 资源 。因此 衡量一个算法的好坏,一般
是从时间和空间两个维度来衡量的 ,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间 。在计算
机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计
算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

1.2复杂度的重要性

出现在面试题就大抵可以知道复杂度在这里的重要性了。

最容易想到的思路:先给数组排序,然后判断前一个数+1是否等于后一个值。不等于则返回前一个数+1。排序的复杂度是qsort  O(N*logN) 显然不符合。

 解决思路1:我们通过等差数列的求和公式得到总值,然后依次减去数组中的每个值。就可以找到消失的数字。但是有风险,N的值可能过大导致溢出

//f法1   Nt太大可能会溢出
int missingNumber(int* nums, int numsSize)
{
int N=numsSize;
int sum=(0+N)*(N+1)/2;
for(int i=0;i<N;i++)
{sum-=nums[i];
}
return sum;
}

 解决思路2:这题和我们做的单身狗问题很像,那我们应该怎么转换成单身狗问题呢?

单身狗是找只出现一次的数,所以我们就可以添加一组没有缺失数字的数组。然后就变成和单身狗一样的问题了。这里不需要考虑顺序异或的问题,排不排序结果都一样。

帮大家回顾一下异或:相同数字的异或为0,不同的为1。还有任何二进制数与0异或为二进制数本身,A ^ 0 = A 。

//法2     转成单身狗来做 
int missingNumber(int* nums, int numsSize)
{
int N=numsSize;
int ret=0;
for(int i=0;i<N;i++)
{ret^=nums[i];
}
for(int j=0;j<=N;j++)
{ret^=j;
}
return ret;
}

二、时间复杂度

2.1时间复杂度的概念

时间复杂度的定义:在计算机科学中, 算法的时间复杂度是一个函数 ,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个 分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。
即:找到某条基本语句与问题规模 N 之间的数学表达式,就是算出了该算法的时间复杂度。

2.2大O的渐进表示法

O 符号( Big O notation ):是用于描述函数渐进行为的数学符号。
推导大 O 阶方法:
1 、用常数 1 取代运行时间中的所有加法常数。
2 、在修改后的运行次数函数中,只保留最高阶项。
3 、如果最高阶项存在且不是 1 ,则去除与这个项目相乘的常数。得到的结果就是大 O 阶。

 解释一下为什么只保留最高项呢,我们假设时间复杂度的函数是Fun(N)=N^2+3N+1,当N=1000时,Fun=1000000+3000+1=1003001几乎可以看作1000000。那就会有人说了,N的值很小时,那这样每个算法的执行时间都差不多的。所以我们只考虑N为很大的值时。

2.3常见的时间复杂度例题计算

例题1

看来前面时间复杂度的概念就知道了,其实就是看循环次数。第一个for循环里面应该是2 * N次

(因为是[0,2 * N - 1]这里用闭区间表示),再来数while循环里面的次数(M--)M次。

O(2 * N + 10)最后时间复杂度化简为O(2 * N)。

// 计算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

这里是冒泡排序的时间复杂度计算,冒泡排序本质就是相邻的两个数比较谁大谁放后面(这里默认是升序)。我们这里分两种情况讨论,最好和最坏情况。

最好情况:当数组已经排好序了,就只需要走一遍最外面的循环。所以时间复杂度为O(N)。

最坏情况:数组没有顺序时,第二层for循环也要走,一共N个数两两比较。最多要比较N-1次。

因为第二层的比较次数会随着第一层改变而改变。也就是N-1+N-2+.........+1根据最坏情况可知一共有N-1项,所以就可以使用等差数列求和公式来计算。(N -1)* (N-1+1)/2时间复杂度为O(N^2)

// 计算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

这里是递归的时间复杂度计算,先给上结论递归的时间复杂度计算是把每次递归里面循环次数相加。因为里面没有任何其他的循环语句所以就是一次,一共递归N次所以就是N个1相加。时间复杂度为O(N)。

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

三、空间复杂度

3.1空间复杂度的概念

空间复杂度也是一个数学表达式,是对一个算法在运行过程中 临时占用存储空间大小的量度
空间复杂度不是程序占用了多少 bytes 的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用 O 渐进表示法
注意: 函数运行时所需要的栈空间 ( 存储参数、局部变量、一些寄存器信息等 ) 在编译期间已经确定好了,因
此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

3.2大O的渐进表示法

与时间复杂度的大O表示法大致一样。

3.3常见的空间复杂度例题计算

其实空间复杂度就是额外开辟空间的大小。

例题1

我们在函数里面找额外开辟的变量,发现有end、i、exchange三个额外变量。所以我们这里的空间复杂度是常数个,所以为O(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;}
}

例题2

这里我们发下先他新创建了一个指针(等价于数组),我们默认新创建的数组复杂度为N,还有一共变量i,O(N+1)空间复杂度化简为O(N)。

// 计算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

这里是递归的空间复杂度计算,还是和时间复杂度计算一样的。把每次调用相加起来,我们调用函数都会开辟一个新的栈帧,我们一共要调用N次所以空间复杂度为O(N)。

long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

总结

学习复杂度是为了让我们在解决一些问题会有多种想法,通过计算复杂度来选择最优的思路。复杂度分析对于设计和评估算法的效率非常重要。通常我们希望设计出时间复杂度和空间复杂度都尽可能低的算法,以提高算法的性能和适用性。复杂度分析是算法设计和分析的核心内容之一。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人机交互 复习】第1章 人机交互概述

人机交互的知识点碎&#xff0c;而且都是文字&#xff0c;过一遍脑子里什么都留不下&#xff0c;但是背时间已经来不及了&#xff0c;最好还是找题要题感吧&#xff0c;加深印象才是做对文科的关键 一、概念 1.人机交互&#xff08;Human-Computer Interaction,HCI)&#xff1…

Blazor的SSR服务端渲染是不是交互式的

从.NET8开始&#xff0c;Blazor引入了SSR服务端渲染&#xff0c;归功于MVC和RazePage的沉淀&#xff0c;虽然来得晚&#xff0c;但一经发布&#xff0c;就将Blazor推向了新的高度。从今年开始&#xff0c;Youtube上关于Blazor的优质教学视频&#xff0c;以肉眼可见的速度在增加…

【机器学习】机器的登神长阶——AIGC

目录 什么是AIGC 普通用户接触AIGC网站推荐 通义千问 白马 普通用户如何用好AIGC 关键提示词的作用 AIGC的影响 就业市场&#xff1a; 教育领域&#xff1a; 创意产业&#xff1a; 经济活动&#xff1a; 社交媒体与信息传播&#xff1a; AIGC面临的挑战 什么是AIGC…

python离线安装第三方库、及其依赖库(单个安装,非批量移植)

文章目录 1.外网下载第三方库、依赖库2.内网安装第三方库3.补充附录内网中离线安装python第三方库,这时候只能去外网手动下载第三方库,再传回内网进行安装。 问题是python第三方库往往有其前置依赖包,你很难清楚某个第三方库依赖的是哪些依赖包,更难受的是依赖包可能还有其…

从零开始:使用ChatGPT快速创作引人入胜的博客内容

随着科技的飞速发展&#xff0c;人工智能逐渐渗透到我们生活的各个领域。无论是商业、教育还是娱乐&#xff0c;AI技术都在以惊人的速度改变着我们。特别是在内容创作领域&#xff0c;人工智能正发挥着越来越重要的作用。今天&#xff0c;我将和大家分享如何从零开始&#xff0…

【漏洞复现】极限OA video_file.php 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

2024年快手短视频带货教程,操作简单易上手

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89389478 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-为什么做快手短视频带货 11-0粉丝开通小黄车 12-怎么挂小黄车&#xff0c;小黄车掉了怎么办 13-如何选品?好的选品成功率60% …

Github生成Personal access tokens及在git中使用

目录 生成Token 使用Token-手工修改 使用Token-自动 生成Token 登录GitHub&#xff0c;在GitHub右上角点击个人资料头像&#xff0c;点击Settings → Developer Settings → Personal access tokens (classic)。 在界面上选择点击【Generate new token】&#xff0c;填写如…

腾讯云API安全保障措施?有哪些调用限制?

腾讯云API的调用效率如何优化&#xff1f;怎么使用API接口发信&#xff1f; 腾讯云API作为腾讯云提供的核心服务之一&#xff0c;广泛应用于各行各业。然而&#xff0c;随着API应用的普及&#xff0c;API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…

HarmonyOS之自选股App

支持在 鸿蒙、安卓、苹果设备上运行。 1.界面效果展示 2.数据存储 数据存储采用的是官方的 ohos.data.relationalStore.relationalStore stock_code表用来存储A股市场5000多家公司的股票代码和名称等信息 const TAB_STOCK_CODE "stock_code" const CREATE_TABL…

Flutter-无限循环滚动标签

1. 序章 在现代移动应用开发中&#xff0c;滑动视图是常见的交互模式之一。特别是当你需要展示大量内容时&#xff0c;使用自动滚动的滑动视图可以显著提升用户体验。在这篇文章中&#xff0c;我们将讨论如何使用 Flutter 实现一个自动滚动的列表视图。 2. 效果 3. 实现思路 …

C语言 | Leetcode C语言题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; int titleToNumber(char* columnTitle) {int number 0;long multiple 1;for (int i strlen(columnTitle) - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return number; }

HTML静态网页成品作业(HTML+CSS)——手机电子商城网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

【面试干货】抽象类与接口的区别

【面试干货】抽象类与接口的区别 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程中&#xff0c;抽象类和接口是两个非常重要的概念&#xff0c;它们都为代码的可扩展性和复用性提供了基础。但是&#xff0c;它们之间也有一些明显…

linux精通 4.1

2.1.3 http服务器实现 目的 reactor应用——webserver webclient 每次上课前 看大纲down code 复习&#xff1a; 不行啊 编译给的代码报错啊 给的最新的不是0430那一版就不行啊 reactor.c:(.text0x254): relocation truncated to fit: R_X86_64_PC32 against symbol begin de…

基于微信共享充电桩小程序毕业设计作品成品(3)开发技术文档_充电桩小程序前端技术栈

后台管理系统文件 所在路径&#xff1a;后台源码ht目录是后台 绿色显示的是系统框架&#xff0c;不要动 位置程序名说明源码根目录login.php后台登录页面源码根目录check_u_login.php后台登录处理程序ht 后台根目录index.php后台首页left.php后台左侧菜单u_logout.php退出登…

【数据分析】用Python做事件抽取任务-快速上手方案

目录 方法一&#xff1a;使用OmniEvent库安装OmniEvent使用OmniEvent进行事件抽取OmniEvent优点缺点 方法二&#xff1a;使用大模型使用GPT网页版进行事件抽取事件类型列表 大模型优点缺点 总结 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;事件抽取是一项关键任…

工程施工安全检测嵌入式解决方案

工程施工安全检测嵌入式解决方案 1 范围1.1 引言1.2 系统概述1.3 文档概述 2 工程施工安全检测系统应用场景2.1 作业操作安全检查2.2 受限空间作业安全检测2.3 应急设备操作行为检测2.4 动火作业安全检测 3 工程施工安全检测系统设计方案概述3.1 AI识别系统3.2 AI关键技术介绍3…

武汉工程大学24计算机考研数据,有学硕招收调剂,而专硕不招收调剂!

武汉工程大学是一所以工为主&#xff0c;覆盖工、理、管、经、文、法、艺术、医学、教育学等九大学科门类的多科性教学研究型大学&#xff0c;是湖北省重点建设高校、湖北省国内一流学科建设高校&#xff0c;入选卓越工程师教育培养计划、中西部高校基础能力建设工程、“新工科…

【计算机网络篇】数据链路层(11)在数据链路层扩展以太网

文章目录 &#x1f354;使用网桥在数据链路层扩展以太网&#x1f95a;网桥的主要结构和基本工作原理&#x1f388;网桥的主要结构&#x1f50e;网桥转发帧的例子&#x1f50e;网桥丢弃帧的例子&#x1f50e;网桥转发广播帧的例子 &#x1f95a;透明网桥&#x1f50e;透明网桥的…