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

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

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

下面我们从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)

                                                                 

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

相关文章:

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

今天开始数据结构的学习!作为一大重点,拿出态度很重要,想要真实掌握,博客笔记自然少不了!重点全部上色!避免疏忽 下面我们从0基础开始学习今天的第一节!不用担心看不懂,拒绝枯燥的理…...

PHP校园助手系统小程序

🔑 校园助手系统 —— 智慧校园生活 📱一款基于ThinkPHPUniapp框架深度定制的校园助手系统,犹如一把智慧之钥,专为校园团队精心打造,解锁智慧校园生活的无限精彩。它独家适配微信小程序,无需繁琐的下载与安…...

如何在Spring Boot项目中高效集成Spring Security

1 Spring Security 介绍 Spring Security 是一个功能强大且高度可定制的安全框架,专为保护基于Java的应用程序而设计。它不仅提供了认证(Authentication)和授权(Authorization)的功能,还支持防止各种常见的安全攻击模式。本文将详细介绍Spring Security的主要特点、功能…...

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊…...

PAT甲级-1020 Tree Traversals

题目 题目大意 给出一棵树的后序遍历和中序遍历,要求输出该树的层序遍历。 思路 非常典型的树的构建与遍历问题。后序遍历和中序遍历可以得出一个树的结构,用递归锁定根节点,然后再遍历左右子树,我之前发过类似题目的博客&…...

LVGL+FreeRTOS实战项目:智能健康助手(Max30102篇)

MAX30102 心率血氧模块简介 功能:用于检测心率和血氧饱和度,集成了红外和红光 LED 以及光电二极管。 接口:支持 I2C 通信,默认 I2C 地址为 0x57。 应用:广泛用于健康监测设备中,如智能手环、手表等。 硬…...

人脸识别【python-基于OpenCV】

1. 导入并显示图片 #导入模块 import cv2 as cv#读取图片 imgcv.imread(img/wx(1).jpg) #路径名为全英文,出现中文 图片加载失败,"D:\picture\wx.jpg" #显示图片 (显示标题,显示图片对象) cv.imshow(read_picture,im…...

redis常用命令和内部编码

文章目录 redis 为什么快redis中的Stringsetsetnxsetex getmsetmget计数操作incr、incrby、decr、decrby、incrbyfloatincrincrbyincrbyfloat 拼接(append)、获取(getrange)、修改字符串(setrange)、获取字符串长度(strlen)操作appendgetrangesetrangest…...

UI操作总结

该类 SolarWebx 继承自 Webx 和 IUixLikeMixin,主要用于扩展 giraffe.EasyUILibrary 的功能,提供了一系列与网页操作、元素定位、截图、图片处理等相关的方法。以下是对该类中每个方法的简要总结: __init__ 方法 作用:初始化 Sola…...

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…...

力扣hot100-->滑动窗口、贪心

你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…...

Linux 内核中的高效并发处理:深入理解 hlist_add_head_rcu 与 NAPI 接口

在 Linux 内核的开发中,高效处理并发任务和数据结构的管理是提升系统性能的关键。特别是在网络子系统中,处理大量数据包的任务对性能和并发性提出了极高的要求。本文将深入探讨 Linux 内核中的 hlist_add_head_rcu 函数及其在 NAPI(网络接收处理接口)中的应用,揭示这些机制…...

centos哪个版本建站好?centos最稳定好用的版本

在信息化飞速发展的今天,服务器操作系统作为构建网络架构的基石,其稳定性和易用性成为企业和个人用户关注的重点。CentOS作为一款广受欢迎的开源服务器操作系统,凭借其强大的性能、出色的稳定性和丰富的软件包资源,成为众多用户建…...

软件越跑越慢的原因分析

如果是qt软件,可以用Qt Creator Profiler 作性能监控如果是通过web请求,可以用JMeter监控。 软件运行过程中逐渐变慢的现象,通常是因为系统资源(如 CPU、内存、磁盘 I/O 等)逐渐被消耗或软件中存在性能瓶颈。这个问题…...

LeetCode 力扣热题100 二叉树的直径

class Solution { public:// 定义一个变量 maxd,用于存储当前二叉树的最大直径。int maxd 0; // 主函数,计算二叉树的直径。int diameterOfBinaryTree(TreeNode* root) {// 调用 maxDepth 函数进行递归计算,并更新 maxd。maxDepth(root);// …...

【图文详解】lnmp架构搭建Discuz论坛

安装部署LNMP 系统及软件版本信息 软件名称版本nginx1.24.0mysql5.7.41php5.6.27安装nginx 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 关闭防火墙 systemctl stop firewalld &&a…...

小哆啦解题记:整数转罗马数字

小哆啦解题记:整数转罗马数字 小哆啦开始力扣每日一题的第十四天 https://leetcode.cn/problems/integer-to-roman/submissions/595220508/ 第一章:神秘的任务 一天,哆啦A梦接到了一项任务——将一个整数转换为罗马数字。他心想:…...

【Java数据结构】排序

【Java数据结构】排序 一、排序1.1 排序的概念1.2 排序的稳定性1.3 内部排序和外部排序1.3.1 内部排序1.3.2 外部排序 二、插入排序2.1 直接插入排序2.2 希尔排序 三、选择排序3.1 选择排序3.2 堆排序 四、交换排序4.1 冒泡排序4.2 快速排序Hoare法:挖坑法&#xff…...

我的求职之路合集

我把我秋招和春招的一些笔面试经验在这里发一下,网友们也可以参考一下。 我的求职之路:(1)如何谈自己的缺点 我的求职之路:(2)找工作时看重的点 我的求职之路:(3&…...

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...