衡量算法性能的量级标准:算法复杂度

news2025/1/28 1:05:41

今天开始数据结构的学习!作为一大重点,拿出态度很重要,想要真实掌握,博客笔记自然少不了!重点全部上色!避免疏忽

下面我们从0基础开始学习今天的第一节!不用担心看不懂,拒绝枯燥的理论概念!   

目录

对“算法”的理解

“算法复杂度”概念理解

        一  时间复杂度的表示与计

                       一.1  时间复杂度实例讲解

              一.2  “约会”预期管理类时间复杂度

              一.3  “约会”预期管理类时间复杂度实例讲解

              一.4  时间复杂度的意义

二  空间复杂度的表示与计算 

              二.1  空间复杂度实例讲解


对“算法”的理解

算法简而言之,就是解决问题的步骤跟指令,通过一系列操作,从而达到预期的结果

“算法复杂度”概念理解

哈是算法复杂度?

概念:度量算法性能优劣的一个量级说明

度量算法主要从两个方面来考虑:时间复杂度    空间复杂度

时间复杂度作用:体现执行这个算法所需要的计算工作量(下面是完整概念)

比如:对2个算法进行比较,若算法A较算法B更加快,此时指它的时间复杂度更好 

空间复杂度作用:体现执行这个算法所需要占用的额外的内存空间大小(下面是完整概念)

下面我们分别来进行讲解! 

一  时间复杂度的表示与计算

表示:首先它的表示用大O符号表示(O(n)),这个n(下面参考例题详解!)表示这个问题的             一个工序规模次数 ,O(n)也叫大O表示法

计算规则:

                  1:用常数1来取代运行时间中所有加法常数

                  2:只要高阶项,不要低阶项

                  3:不要高阶项系数

常见的时间复杂度(复杂度由低到高):

                                                                  O(1)             常数阶

                                                                  O(n)             线性阶

                                                                  O(n^2)         平方阶

                                                                  O(logn)        对数阶

                                                                  O(nlogn)      nlogn阶

                                                                  O(n^3)         立方阶

                                                                  O(2^n)         指数阶

画图演示:

一.1  时间复杂度实例讲解

                                                                          实例1

第一步:我们计算出这个工程的工序次数是 2*N+10 次

第二步:根据计算规则进行删除

                                                    只要高阶项,不要低阶项,去除10,首先得到:2*N

                                                    不要高阶项系数,去除2,最后得到:N

第三步:得出最终结果,Func2的时间复杂度为 O(N)

                                                                      实例2

第一步:计算这个工程的执行工序,得到:M+N  次

第二步:根据计算规则进行删除更改:

                                                             因为MN都是未知数,因为最高阶阶数相同,也无常数                                                                   故全部保留

第三步:得出时间复杂度:O(M+N)

                                                                      实例3      

第一步:计算这个工程的总工序,得到100  次

第二步:根据计算规则进行更改与删除:

                                                               用常数1取代所有加法常数100改为1,最终得到1

                                                               注:这个“1”代表常数次,不是代表1次 

第三步:得到时间复杂度:O(1)

一.2  “约会”预期管理类时间复杂度

难道跟“约会”有关吗?没错没错!下面如果是你和你的对象约会,你会选择哪个时间点?                最早:下午17:00

                                                            大概:下午19:00

                                                            最迟:下午20:00

我们来分析一下,因为这只是一个引入,所以无法符合每个人的想法啊!

如果我们把对每件事的期望尽量拉小,那么当这件事不管完没完成,对你的打击也就越小!

如果失败:那么我的期望也没那么高,管的他呢!

如果成功:带给我的期望是不是更多一些!

下面我们针对非直接性(需要分情况考虑)的对时间复杂度的计算:

另外一些时间复杂度存在几种考虑情况:比如计算:什么时候可以从一堆字符串找到一个对应字符

有以下几种情况:

                            直接一次找到,这属于最好情况(下界)

                            找到末尾才找到,这属于最坏情况(上界)

                            最坏与最好平均下来,就是平均情况

那么我们假设一个长为N的字符串,对应几种情况分别是:1次

                                                                                             N次

                                                                                             N/2次

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

一.3  “约会”预期管理类时间复杂度实例讲解

                                                                       实例1

第一步:得到这个问题的最坏工序次数为 7

第二步:根据计算规则进行删除与更改:

                                                                   用常数1取代所有加法常数7改为1

第三步:得到Srchr的时间复杂度为 O(1)

                                                                     实例2

第一步:计算这个问题的最坏情况下执行次数,为N^2(也就是N的平方)

第二步:根据计算规则进行删除与更改:

                                                                与三条规则不冲突,不用更改

第三步:得到它的时间复杂度为 O(N^2)

 

                                                                   实例3

二分查找涉及数学逻辑,下面配有演示!

 第一步:计算这个问题最坏情况工序为 logN(也就是log以2为底的N的对数)

第二步:根据计算规则删除与更改:

                                                         与三条规则不冲突,直接保留

第三步:得出时间复杂度为 O(logN)

我们看数学演示计算过程:假设N是数组个数,x表示最坏查找数

查询次数记录
1N/2
2N/2/2
3N/2/2/2
xN/2^x

我们发现:每查询一次,就需要除一次2

                  那么查询x次,就表示N/2^x

                  有2^x=N(注意:查一次有一个2,那么查了x次,就是2^x,数组有N个元素,那么最                      坏情况就是N=2^x

                  那么最坏查找数  x=log2N

由于:log以2为底的N的对数不好写这个底数,所以规定:凡是以2为底的对数可以直接写为logN

注:只适用于以2为底的对数 可以写为  logN(底数2可以不写)

                                                                     实例4

(斐波那契数的计算,下图配有数学解析) 

 第一步:计算这个问题的最坏工序次数:

第二步: 根据计算规则进行删除与更改:

                                                              去除高阶项系数2^(N-1)=2^N * 2^(-1),最终得2^N

第三步:得到时间复杂度 O(2^N

一.4  时间复杂度的意义

学会时间复杂度的计算,可以更理解题目的要求,以及比较平时代码的性能,比如:

我们可以看到上面有时间复杂度的限制,那么我们在写题目时,需要先大概计算一下时间复杂度! 

二  空间复杂度的表示与计算

空间复杂度我们之前已经大概了解了一下:   运行算法过程中额外占用存储空间大小的量度

表示:与时间复杂度类似,还是用大O表示法:O(n),其中n表示变量个数,n一般等于变量个数+额外开辟次数(不是字节数)

计算:依然遵循时间复杂度的三条原则

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

 投机取巧:一般空间复杂度大多是O(1)O(n)两种情况,遇到其它的概率很小!

下面我们来进行实例讲解!

二.1  空间复杂度实例讲解

                                                                        实例1

第一步:计算图中的变量个数以及看是否额外占用空间

               发现创建了3个变量,并没有额外开创空间(带 的循环是在n里面的,所以 用的是n开                 辟的那个空间,没有重新开辟)

第二步:按照三条规则重新删除与更改:常数项改为1

                                                                O(3)也就变成了O(1)

第三步:得出空间复杂度为O(1)

      

                                                                           实例2

第一步:分析变量个数与额外开辟空间大小 (变量个数+额外开辟空间)

第二步:计算 额外占用存储空间大小为O(n+1+1)

              按照三个规则进行删除与更改:只要高阶项,不要低阶项,改为O(n) 

第三步:得出空间复杂度 O(n)

                                                                      实例3

第一步:计算变量个数以及额外占用的空间 

每次调用函数都需要开辟空间,一共调用了N+1次 (这个空间的开辟是计算开辟次数,不是字节)

 第二步:根据三条规则进行删除与更改:不要地阶项,只保留高阶项

                                                                  O(N+1)更变为 O(N)

第三步:空间复杂度为 O(N)

                                                                 

以上就是   算法复杂度  的全部讲解了!写的好的话记得一键三连哦!希望每天都是阳光明媚!

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

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

相关文章

IDE提示:因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170

问题情况 不知道为什么我的IDE终端运行命令的时候总提示以下内容: Import-Module : 无法加载文件 D:\Anaconda3\shell\condabin\Conda.psm1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID1351…

DRF开发避坑指南01

在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器,因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数,不管是STM32的芯片还是GD32,AT32的芯片,delay函数都可以这么写,只要它是cortex-M…

LabVIEW项目中的工控机与普通电脑选择

工控机(Industrial PC)与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异,并为LabVIEW项目中的选择提供指导。 ​ 硬件设…

python如何导出数据到excel文件

python导出数据到excel文件的方法: 1、调用Workbook()对象中的add_sheet()方法 wb xlwt.Workbook() ws wb.add_sheet(A Test Sheet) 2、通过add_sheet()方法中的write()函数将数据写入到excel中,然后使用save()函数保存excel文件 ws.write(0, 0, 1234…

Yocto项目 - 解读CROss PlatformS (CROPS)

一、概述 Yocto项目是一个用于创建自定义Linux发布版本的工具集成项目,在应对复杂应用场景时能提供高度可自定义性。但是在多端机应用中,如何在不同的平台上可靠地完成构建工作?CROss PlatformS (CROPS)即展示了其重要作用。 CROPS是Yocto项…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库(Monorepo)搭建指南:从零开始 单体仓库(Monorepo)是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置,并简化依赖管理。本文将通过实际代码示例&#xff0…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一:libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台,旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据(如文本、图像、音频、视频等)以及复杂的标注任务(如分类、命名实体…

OS Copilot功能测评:智能助手的炫彩魔法

简介: OS Copilot 是一款融合了人工智能技术的智能助手,专为Linux系统设计,旨在提升系统管理和运维效率。本文详细介绍了在阿里云ECS实例上安装和体验OS Copilot的过程,重点评测了其三个核心参数:-t(模式…

【豆包MarsCode 蛇年编程大作战】蛇形烟花

项目体验地址:项目体验地址 官方活动地址:活动地址 目录 【豆包MarsCode 蛇年编程大作战】蛇形烟花演示 引言 豆包 MarsCode介绍 项目准备 第一步:安装插件 第二步:点击豆包图标来进行使用豆包 使用豆包 MarsCodeAI助手实…

2013年蓝桥杯第四届CC++大学B组真题及代码

目录 1A:高斯日记(日期计算) 2B:马虎的算式(暴力模拟) 3C:第39级台阶(dfs或dp) 4D:黄金连分数(递推大数运算) 5E:前缀…

14.杂谈:领域知识库与知识图谱:概念、关系与重要性

文章目录 1. 领域知识库的概念2. 知识图谱的概念3. 领域知识库与知识图谱的关系与差异3.1 关系3.2 差异 4. 为什么要构建领域知识库?4.1 知识的集中管理与共享4.2 知识的标准化与规范化4.3 促进知识创新与应用 5. 为什么要进行知识融合?5.1 异构数据的整…

【GoLang】利用validator包实现服务端参数校验时自定义错误信息

在C/S架构下,服务端在校验请求参数时,若出现参数错误,要响应给客户端一个错误消息,通常我们会统一响应“参数错误”。 但是,如果只是一味的提示参数错误,我并不知道具体是哪个参数错了呀!能不能…

c#实现重启Explorer.exe并且启动某个命令

由于经常需要重启Explorer.exe 然后接着又需要马上启动一个命令行,于是干脆写一个程序,实现了此功能。 可以直接在运行中,或者在资源管理器中新建任务。 注意,下方的设置为应用程序,可以避免启动时出现黑框。 直接上代…

C语言自定义数据类型详解(一)——结构体类型(上)

什么是自定义数据类型呢?顾名思义,就是我们用户自己定义和设置的类型。 在C语言中,我们的自定义数据类型一共有三种,它们分别是:结构体(struct),枚举(enum),联合(union)。接下来,我…

绘制决策树尝试2 内含添加环境变量步骤

目录 step1 ai码 ai改 step2 下面就是环境配置问题 “ExecutableNotFound: failed to execute WindowsPath(‘dot’), make sure the Graphviz executables are on your systems’ PATH” dot -v愣是没有​编辑 graphviz安装指导 对于Windows用户: 对于Lin…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务(DDoS)攻击,而OpenAI尚未承认这一漏洞。 本月,德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章,解释了如何通过向ChatGPT API发送单个HTTP请求…

【优选算法】10----无重复字符的最长子串

---------------------------------------begin--------------------------------------- 题目解析: 看到这一类题目,有没有那种一眼就感觉时要用到滑动窗口的感觉,铁子们? 讲解算法原理: 方法一: 暴力解法&#xff…

【模型】RNN模型详解

1. 模型架构 RNN(Recurrent Neural Network)是一种具有循环结构的神经网络,它能够处理序列数据。与传统的前馈神经网络不同,RNN通过将当前时刻的输出与前一时刻的状态(或隐藏层)作为输入传递到下一个时刻&…