【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林

文章目录

  • 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林
    • 一、 什么是算法
        • 1. 算法的定义
          • 1.1 算法的五个特征
          • 1.2 好算法的特质
        • 2. 时间复杂度
        • 3. 空间复杂度


【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林

💬欢迎交流:在学习过程中如果你有任何疑问或想法,欢迎在评论区留言,我们可以共同探讨学习的内容。你的支持是我持续创作的动力!
👍点赞、收藏与推荐:如果你觉得这篇文章对你有所帮助,请不要忘记点赞、收藏,并分享给更多的小伙伴!你们的鼓励是我不断进步的源泉!
🚀推广给更多人:如果你认为这篇文章对你有帮助,欢迎分享给更多对机器学习感兴趣的朋友,让我们一起进步,共同提升!

一、 什么是算法

程序 = 数据结构 + 算法

1. 算法的定义

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。

此外,算法还有五个重要的特征
1. 有穷性
2. 确定性
3. 可行性
4. 输入
5. 输出

接下来我们分别来看这五个特性

1.1 算法的五个特征

1. 有穷性
一个算法必须在有穷步之后结束,且每一步都可在有穷时间内完成。
这里需要注意的是 算法必须是有穷的,而程序可以是无穷的。
2. 确定性
算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出。
3. 可行性
算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
4. 输入
一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合
5. 输出
一个算法有一个或多个输入,这些输出是与输入有着某种特定关系的量

1.2 好算法的特质

1. 正确性
算法应该可以正确地解决求解的问题
2. 可读性
算法应具有良好的可读性,以帮助人们可以理解
3. 健壮性
输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果
4. 高效率与低存储量要求
高效率代表花费的时间少 时间复杂度低
低存储量需求是不费内存 空间复杂度低

  • 总结:
    在这里插入图片描述
2. 时间复杂度

可以事先预估时间开销T(n) 与问题规模n 的关系 (T 表示“time”)
这里我们用一串代码来看下

#include <stdio.h>// 递增形love you!
void loveyou(int n){ // n 为问题规模int i = 1;while(i <= n){printf("love you %d\n", i);i++;}printf("I love you too!\n");
}int main(){loveyou(500);return 0;
}

上述代码结果:
在这里插入图片描述
这里我们问题规模是 500 所以我们的:是T(500) = 1 + 501 + 2*500 + 1

如果把500换成n的话 那么
表达式:T(n) = 3n + 3

但是如果表达式多了怎么办呢 那么
T1(n) = 3n + 3
T2(n) = n2+3n + 1000
T3(n) = n3+ n2 + 9999999

若 n = 3000 ,则 :

3n = 9000 比 T1(n) = 3n + 3 =9003
n2=9,000,000 比T2(n) = n2+3n + 1000 = 9,010,000
n3=27,000,000,000 比 T3(n) = n3+ n2 + 9999999 = 27,018,999,999

这时我们可以发现 我们可以只考虑阶数高的部分 可以简化下:
T1(n) = O(n)
T2(n) = O(n2)
T3(n) = O(n3)

在这里插入图片描述

算法的复杂度:
最坏时间复杂度: 最坏情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间

  • 总结
    在这里插入图片描述
3. 空间复杂度
#include <stdio.h>// 递增形love you!
void loveyou(int n){ // n 为问题规模int i = 1;while(i <= n){printf("love you %d\n", i);i++;}printf("I love you too!\n");
}int main(){loveyou(500);return 0;
}

解释: 当我们编辑好这段代码是 其实需要占多少空间 是已经固定的 这片空间的大小 其实是跟我们问题规模没有关系的
我们在调用这段代码时 其实会传入一个int型的参数
然后我们还定义了一个int型的变量i(int i = 1)

这里需要注意的是 int n (这里的n指的是问题规模)但是不管n的值怎么变化 这个算法执行中 都是一个固定不变的常数值。
无论问题规模怎么变,算法运行所需的内存空间都是固定的常量。
所以这里的算法的空间复杂度
常数阶:S(n) = O(1)

  • 注 S表示的是"Space"

并且还需要注意的是 如果是常数阶的话 那么我们就可以称这种算法可以原地工作
我们来看一段简单的示例代码:

void test(int n){int flag[0];//声明长度为n的数组int i;//.....此处省略很多代码

在这里插入图片描述
我们经过上一个例子可以看出 和问题规模是没有关系的 那么这里我们假设int型变量占的是4个字节(4B)
则所需内存空间 = 4+ 4n + 4 = 4n + 8
那我们就可以写成 S(n) = O(4n + 8) 他的阶数为n 那么
空间复杂度其实是 S(n) = O(n)

我们其实可以看出 如果在函数当中我们定义了某种变量,但是这个变量所占的空间和问题规模n没有关系的话 这个类型的变量 最多也就是在我们的表达式当中 给我们增添一个常数项 但我们最终要转换成大O表示法 也就是关心阶数的 所以这种常数项 对我们最终结果不会产生任何结果
因此:我们只需要关注存储空间的大小与问题规模相关的变量就可以了

在这里插入图片描述


你好,我是意疏。我们一起进步。

在这里插入图片描述

意气风发,漫卷疏狂
学习是成长的阶梯,每一次`的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中

如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝点赞、评论和收藏,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会增加自己的运气,希望您每一天都能充满活力!

愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
logo
我是意疏 下次见!

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

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

相关文章

Logo语言的系统监控

Logo语言的系统监控 引言 在信息技术飞速发展的时代&#xff0c;系统监控成为了确保计算机系统和网络平稳运行的重要手段。系统监控不仅可以实时跟踪系统的性能、资源使用情况和安全风险等&#xff0c;还能够在出现问题时及时发出警报&#xff0c;从而避免潜在的故障和损失。…

STP学习

{所有内容均来自于西安欧鹏的陈俊老师} STP生成树 当二层交换机意外成环路的时候会发生&#xff1a; 1.广播风暴&#xff1a;当广播帧进入环路时&#xff0c;会被不断复制并传输&#xff0c;导致网络中的广播流量急剧增加&#xff0c;消耗大量的网络带宽&#xff0c;降低网络…

使用RKNN进行yolo11-cls部署

文章目录 概要制作数据集模型训练onnx导出rknn导出概要 YOLO(You Only Look Once)是一系列高效的目标检测算法,其核心思想是将目标检测任务转化为一个回归问题,通过单个神经网络直接在图像上预测边界框和类别概率。当将其用于分类任务时,会去除目标检测相关的边界框预测部…

【MySQL】01.MySQL环境安装

注意&#xff1a;在MYSQL的安装与卸载中&#xff0c;需要使用root用户进行。 一、卸载不必要的环境 • 查看是否有运行的服务 [rootVM-24-10-centos etc]# ps axj |grep mysql1 22030 22029 22029 ? -1 Sl 27 0:00 /usr/sbin/mysqld --daemonize --pid-fi…

程序化广告行业(59/89):广告验证与反作弊实战技巧

程序化广告行业&#xff08;59/89&#xff09;&#xff1a;广告验证与反作弊实战技巧 大家好&#xff01;在程序化广告领域&#xff0c;想要做好投放&#xff0c;除了了解基本的架构和原理&#xff0c;还得掌握一些关键的技能&#xff0c;比如广告验证和反作弊。今天就和大家一…

矢量瓦片切片工具

1.geoserver 可以生成geojson mvt(pbf) tojson 三种格式矢量瓦片 2.mapbox的tippecanoe 可以生成pbf矢量瓦片&#xff0c;文件夹形式和mbtiles两种 3.TileStache python工具&#xff0c;可以生成geojson瓦片 4.PostGis mapbox插件可以生成pbf瓦片&#xff0c;据说是动态切片…

Windows 系统 Git 2.15.0 (64位) 下载与安装教程

1. 下载 Git 2.15.0 (64位) 安装包 下载地址&#xff1a;https://pan.quark.cn/s/f817ab9285dc 2. 运行安装程序 双击下载的 Git-2.15.0-64-bit.exe。 如果系统提示安全警告&#xff0c;选择 “运行”&#xff08;确认来源可信&#xff09;。 3. 安装向导设置 按以下步骤配…

MCP服务器:AI与外部工具交互的桥梁——Python和代理AI工具集成指南

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

AIGC8——大模型生态与开源协作:技术竞逐与普惠化浪潮

引言&#xff1a;大模型发展的分水岭时刻 2024年成为AI大模型发展的关键转折点&#xff1a;OpenAI的GPT-4o实现多模态实时交互&#xff0c;中国DeepSeek-MoE-16b模型以1/8成本达到同类90%性能&#xff0c;而开源社区如Mistral、LLama 3持续降低技术门槛。这场"闭源商业巨…

Muduo网络库实现 [十五] - HttpContext模块

目录 设计思路 类的设计 解码过程 模块的实现 私有接口 请求函数 解析函数 公有接口 疑惑点 设计思路 记录每一次请求处理的进度&#xff0c;便于下一次处理。 上下文模块是Http协议模块中最重要的一个模块&#xff0c;他需要记录每一次请求处理的进度&#xff0c;需…

解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution

目录 问题描述解决方案为什么需要这样配置&#xff1f; 问题描述 在你的项目中&#xff0c;如果你遇到了以下错误信息&#xff1a; [ERROR] Failed to execute goal org.graalvm.buildtools:native-maven-plugin:0.10.5:test (native-test) on project DIctSystemInJavaUsing…

java 代码错误分析

错误代码 class Test {private static String name; // 声明一个私有静态变量 namename "World"; // 静态初始化块&#xff0c;给 name 赋值为 "World"System.out.print(name); // 打印 name 的值public static void main(String[] args) {System.out.p…

企业供应链管理

企业供应链管理 企业供应链管理 企业供应链管理企业信息化信息化的作用信息化的发展阶段信息化建设的挑战 SRM&#xff08;供应商关系管理&#xff09;SRM架构参考图企业内部系统协作&#xff1a; ERP (企业资源计划)OA (办公自动化)业务功能模块&#xff1a;企业日常办公 EMS …

Pascal语言的系统监控

Pascal语言的系统监控 引言 在现代计算机系统中&#xff0c;系统监控是确保计算机平稳运行的重要组成部分。无论是个人计算机还是大型服务器&#xff0c;监控系统的性能、资源使用及状态&#xff0c;都是提高系统效率、及时发现问题的关键。Pascal语言作为一种结构化编程语言…

出现次数超过一半的数(信息学奥赛一本通-1186)

【题目描述】 给出一个含有n&#xff08;0 < n < 1000&#xff09;个整数的数组&#xff0c;请找出其中出现次数超过一半的数。数组中的数大于-50且小于50。 【输入】 第一行包含一个整数n&#xff0c;表示数组大小&#xff1b; 第二行包含n个整数&#xff0c;分别是数组…

解决 CANoe 多测试用例下固定 IP 地址冲突问题的分析与方案

问题描述&#xff1a; CANoe的测试环境如下&#xff1a; 在Ethernet1总线上&#xff0c;通过VN5620连接了PCU&#xff08;实物&#xff09;&#xff1b; 使用VtestStudio&#xff08;VTS&#xff09;开发&#xff0c;并且生成了三个测试脚本(vtt文件)&#xff0c;分别为&#…

React 项目使用 pdf.js 及 Elasticpdf 教程

摘要&#xff1a;本文章介绍如何在 React 中使用 pdf.js 及基于 pdf.js 的批注开发包 Elasticpdf。简单 5 步可完成集成部署&#xff0c;包括数据的云端同步&#xff0c;示例代码完善且简单&#xff0c;文末有集成代码分享。 1. 工具库介绍与 Demo 1.1 代码包结构 ElasticP…

python爬虫:小程序逆向(需要的工具前期准备)

前置知识点 1. wxapkg文件 如何查看小程序包文件 打开wechat的设置&#xff1a; .wxapkg概述 .wxapkg是小程序的包文件格式&#xff0c;且其具有独特的结构和加密方式。它不仅包含了小程序的源代码&#xff0c;还包括了图像和其他资源文件&#xff0c;这些内容在普通的文件…

Prolog语言的强化学习

Prolog语言的强化学习 引言 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个重要分支&#xff0c;它通过与环境交互来学习最优策略&#xff0c;以最大化累积奖励。在强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过试错方式与环…

开源且完全没有审核限制的大型语言模型的概述

开源且完全没有审核限制的大型语言模型的概述 关键要点 研究表明&#xff0c;存在多个开源的大型语言模型&#xff08;LLM&#xff09;完全没有审核限制&#xff0c;适合开放对话。包括基于 Llama、Mixtral、Phi-2 和 StableLM 的模型&#xff0c;参数范围从 2.78 亿到 4050 亿…