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

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

下面我们从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一般等于变量个数+额外开辟次数(不是字节数)

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

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

下面我们来进行例题操练!

二.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.mzph.cn/web/66928.shtml

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

相关文章

Spring Boot Starter介绍

前言 大概10来年以前,当时springboot刚刚出现并没有流行,当时的Java开发者们开发Web应用主要是使用spring整合springmvc或者struts、iBatis、hibernate等开发框架来进行开发。项目里一般有许多xml文件配置,其中配置了很多项目中需要用到的Be…

Java面试题2025-Spring

讲师:邓澎波 Spring面试专题 1.Spring应该很熟悉吧?来介绍下你的Spring的理解 1.1 Spring的发展历程 先介绍Spring是怎么来的,发展中有哪些核心的节点,当前的最新版本是什么等 通过上图可以比较清晰的看到Spring的各个时间版本对…

Linux 切换到 Root 用户的方式及差异详解

在 Linux 系统中,切换到 root 用户进行管理和操作是常见需求。不同的切换方法会影响环境变量、工作目录以及加载的配置文件。本文将介绍几种常用的切换方式及它们的特点。 切换到 Root 用户的主要方式 1. sudo su 这是通过 sudo 提权后调用 su 切换到 root 用户的…

虹科分享 | 汽车NVH小课堂之听音辨故障

随着车主开始关注汽车抖动异响问题,如何根据故障现象快速诊断异响来源,成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天,虹科Pico也整理了几个不同类型的异响声音,一起来听听看你能答对几个吧 汽…

浅谈Redis

2007 年,一位程序员和朋友一起创建了一个网站。为了解决这个网站的负载问题,他自己定制了一个数据库。于2009 年开发,称之为Redis。这位意大利程序员是萨尔瓦托勒桑菲利波(Salvatore Sanfilippo),他被称为Redis之父,更…

element tbas增加下拉框

使用Tabs 标签页的label插槽,嵌入Dropdown 下拉菜单,实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"(这个事件当中到拥有下拉框的tab里时,可以存一下Dropdown 第一个菜单的id,实现点击到拥有…

SQL-leetcode—1179. 重新格式化部门表

1179. 重新格式化部门表 表 Department: ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中,(id, month) 是表的联合主键。 这个表格有关…

【Address Overfitting】解决过拟合的三种方法

目录 1. 收集更多数据实践方法:适用场景:优缺点: 2. 特征选择方法介绍:实践示例:适用场景:优缺点: 3. 正则化(Regularization)正则化类型:实践示例&#xff1…

面向通感一体化的非均匀感知信号设计

文章目录 1 非均匀信号设计的背景分析1.1 基于OFDM波形的感知信号1.2 非均匀信号设计的必要性和可行性1.2 非均匀信号设计的必要性和可行性 3 通感一体化系统中的非均匀信号设计方法3.1 非均匀信号的设计流程(1)均匀感知信号设计(2&#xff0…

【深度学习】搭建PyTorch神经网络进行气温预测

第一步 数据加载与观察 ①导包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline ②加载数据 features pd.read_csv(…

ESP8266 NodeMCU与WS2812灯带:实现多种花样变换

在现代电子创意项目中,LED灯带的应用已经变得极为广泛。通过结合ESP8266 NodeMCU的强大处理能力和FastLED库的高效功能,我们可以轻松实现多达100种灯带变换效果。本文将详细介绍如何使用Arduino IDE编程,实现从基础到高级的灯光效果&#xff…

pycharm踩坑(1)

由于我重装系统,导致我的pycharm需要进行重装,因此我觉得需要记录一下,pycharm的正确使用方法 汉化 汉化很重要,除非你从小就双语教学,不然你看着那些英文就是会消耗大量的精力 我使用的pycharm版本是pycharm-commun…

#HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依赖引入

oh-package.json5 用于描述包名、版本、入口文件和依赖项等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…

OpenCV2D 特征框架 (11)特征检测与描述用于检测二值图像中连通区域(即“斑点”或“blob”)的类cv::SimpleBlobDetector的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::SimpleBlobDetector 是 OpenCV 中用于检测二值图像中连通区域(即“斑点”或“blob”)的类。这些连通区域可以是白色前…

关于deepin上运行Qt开发的程序

国产化替代是将来各单位的主流趋势,探索自行开发应用程序在国产操作系统上正常运行是将来的主要工作之一。本文浅尝gui程序在统信社区版——deepin上遇到的小问题。 使用Qt在deepin上做了一个类似gif的帧动画弹窗,在编译运行时,程序可以正常…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤📝 AI基础与敌人行为🥊 AI导航理论知识(基础)开始实践 🎃 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 🤗 总结归纳 Unity学习之旅⑤ 📝 AI基础与敌…

我想通过python语言,学习数据结构和算法该如何入手?

学习数据结构和算法是编程中的重要基础,Python 是一个非常适合入门的语言。以下是学习数据结构和算法的步骤和建议: 1. 掌握 Python 基础 确保你对 Python 的基本语法、数据类型、控制结构(如循环、条件语句)、函数等有扎实的理…

浅谈Unity中Canvas的三种渲染模式

Overview UGUI通过 Canvas 组件渲染和管理UI元素。Canvas 是 UI 元素的容器,它决定了 UI 元素的渲染方式以及它们在屏幕上的显示效果。Canvas 有三种主要的渲染模式,每种模式有不同的用途和特点。本文将介绍这三种渲染模式 1. Screen Space - Overlay 模…

Unity中在UI上画线

在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…

2024.1.22 安全周报

政策/标准/指南最新动态 01 工信部印发《关于加强互联网数据中心客户数据安全保护的通知》 原文: https://www.secrss.com/articles/74673 互联网数据中心作为新一代信息基础设施,承载着千行百业的海量客户数据,是关系国民经济命脉的重要战略资源。…