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

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

下面我们从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.rhkb.cn/news/7044.html

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

相关文章

【知识图谱(2)】电影知识图谱构建

本文的主线思路 一共六个板块: #mermaid-svg-fekG4TP2IHz9vlmg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fekG4TP2IHz9vlmg .error-icon{fill:#552222;}#mermaid-svg-fekG4TP2IHz9vlmg .error-tex…

单值二叉树(C语言详解版)

一、摘要 今天要讲的是leetcode单值二叉树,这里用到的C语言,主要提供的是思路,大家看了我的思路之后可以点击链接自己试一下。 二、题目简介 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单…

在Spring Boot中使用SeeEmitter类实现EventStream流式编程将实时事件推送至客户端

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

基于本地事务表+MQ实现分布式事务

基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、本地启动rocketmq4、代码实现及验证4.1、核心代码4.2、代码执行流程4.3、项目结构4.4、项目源码 引言 本地消息表的方案最初由ebay的工程师提出,核心思想是将分布式事务拆分成本地事务进行处理。…

Chrome插件:图片缩放为头像(128*128)

前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.使用小程序 8.拖拽成功后会自动保存到下载 代码&#xf…

idea maven本地有jar包,但还要从远程下载

idea 中,java 工程执行 maven reimport,报jar报无法下载。 我奇了个怪,我明明在本地仓库有啊,你非得从远程下载? 我从供应商那里拿来的,远程当然没有了。 这太奇葩了吧,折腾好久不行。 后来…

HTML<label>标签

例子 三个带标签的单选按钮&#xff1a; <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…

【数据结构】_不带头非循环单向链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 单链表的实现 3.1 SList.h头文件 3.2 SList.c源文件 3.3 Test_SList.c测试文件 关于线性表&#xff0c;已介绍顺序表&#xff0c;详见下文&#xff1a; 【数据结构】_顺序表-CSDN博客 本文介绍链表&#xff1b; 基于顺序表…

算法刷题笔记——图论篇

这里写目录标题 理论基础图的基本概念图的种类度 连通性连通图强连通图连通分量强连通分量 图的构造邻接矩阵邻接表 图的遍历方式 深度优先搜索理论基础dfs 与 bfs 区别dfs 搜索过程深搜三部曲所有可达路径广度优先搜索理论基础广搜的使用场景广搜的过程 岛屿数量孤岛的总面积沉…

“AI视觉贴装系统:智能贴装,精准无忧

嘿&#xff0c;朋友们&#xff01;今天我要跟你们聊聊一个特别厉害的技术——AI视觉贴装系统。这可不是普通的贴装设备&#xff0c;它可是融合了人工智能、计算机视觉和自动化控制等前沿科技的“智能贴装大师”。有了它&#xff0c;那些繁琐、复杂的贴装工作变得轻松又精准。来…

vim如何设置显示空白符

:set list 显示空白符 示例&#xff1a; :set nolist 不显示空白符 示例&#xff1a; &#xff08;vim如何使设置显示空白符永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

Flutter android debug 编译报错问题。插件编译报错

下面相关内容 都以 Mac 电脑为例子。 一、问题 起因&#xff1a;&#xff08;更新 Android studio 2024.2.2.13、 Flutter SDK 3.27.2&#xff09; 最近 2025年 1 月 左右&#xff0c;我更新了 Android studio 和 Flutter SDK 再运行就会出现下面的问题。当然 下面的提示只是其…

AI导航工具我开源了利用node爬取了几百条数据

序言 别因今天的懒惰&#xff0c;让明天的您后悔。输出文章的本意并不是为了得到赞美&#xff0c;而是为了让自己能够学会总结思考&#xff1b;当然&#xff0c;如果有幸能够给到你一点点灵感或者思考&#xff0c;那么我这篇文章的意义将无限放大。 背景 随着AI的发展市面上…

Android Studio打包APK

1.导出APK安装包 如果是首次打包&#xff0c;Create new 单击蓝色对话框右边文件夹&#x1f4c2;图标 &#xff0c;选择密钥保存路径&#xff0c;然后在下方File name对话框中填写您想要名称&#xff0c;再点击OK回到密钥创建对话框。 在此对话框中填写密码&#xff08;Passwo…

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”

起因 环境&#xff1a;Windows10 背景&#xff1a;之前就是按照官方说明创建个rsa密钥&#xff0c;在git后台添加上&#xff0c;就行了&#xff0c;近期怎么添加怎么失败&#xff0c;总是“Error: Permission denied (publickey)”的提示&#xff01; 尝试 各种尝试&#xf…

【玩转全栈】----Django连接MySQL

阅前先赞&#xff0c;养好习惯&#xff01; 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings&#xff0c;连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改&#xff08;更新&#xff09;数据&#xff1a; 获取数据 1、OR…

软件质量与测试报告5-压力测试 JMeter 与 Badboy

A&#xff0e;百度搜索引擎压力测试 通过在Badboy下执行如下的测试场景来生成压力测试的脚本&#xff1a; a) 在Badboy的地址栏里面输入www.baidu.com&#xff0c;回车&#xff1b; b) 在右下区域打开的百度的主页上输入搜索关键字JMeter&#xff0c;回车&#xff1b; c) 在…

vim如何显示行号

:set nu 显示行号 :set nonu 不显示行号 &#xff08;vim如何使设置显示行号永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

Python Typing: 实战应用指南

文章目录 1. 什么是 Python Typing&#xff1f;2. 实战案例&#xff1a;构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具&#xff1a;MyPy4. 常见的 typing 用法5. 总结 在 Python 中&#xff0c;静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…

Linux的基本指令(上)

1.ls指令 语法&#xff1a;ls [选项] [目录或文件] 功能&#xff1a;对于⽬录&#xff0c;该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件&#xff0c;将列出⽂件名以及其他信息。 常用选项&#xff1a; -a 列出⽬录下的所有⽂件&#xff0c;包括以 . 开头的隐含⽂件。 -d 将…