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

news2025/5/18 14:47:13

文章目录

  • 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林
    • 一、 什么是算法
        • 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.coloradmin.cn/o/2328037.html

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

相关文章

新增帧能耗指标|UWA Gears V1.0.9

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 本次版本更新主要新增帧能耗指标&#xff0c;帮助大家对每一帧的能耗进行精准监控&#xff0c;快速…

蓝桥杯嵌入式16届———LCD模块

LCD有官方给我们提供的库&#xff0c;我们使用其非常简单&#xff0c;唯一要注意的就是LCD和LED的引脚冲突。 引脚状况 STM32CubeMX 端口配置 使能 比赛给的选手 资源数据包中有以下三个文件&#xff0c;&#xff08;除去led相关的&#xff09;&#xff0c;将他们复制到自己…

CMake在Windows环境下Visual Studio Code的使用

1&#xff0c;安装下载 地址&#xff1a;Visual Studio Code - Code Editing. Redefined 双击安装 选择安装路径 可勾选微软的AI工具 2&#xff0c;环境介绍 2.1 &#xff0c;界面介绍 2.2中文包的安装 下载中文简体 汉化后的界面 2.3 配置C/C环境 VSCode安装好之后&#xf…

注意力机制在大语言模型中的原理与实现总结

注意力机制在大语言模型中的原理与实现总结 1. 章节介绍 在大语言模型的学习中&#xff0c;理解注意力机制至关重要。本章节旨在深入剖析注意力机制的原理及其在大语言模型中的应用&#xff0c;为构建和优化大语言模型提供理论与实践基础。通过回顾神经网络基础及传统架构的局…

大模型学习三:DeepSeek R1蒸馏模型组ollama调用流程

一、说明 目前DeepSeek R1及其蒸馏模型均支持使用ollama进行调用&#xff0c;可以在模型主页查看调用情况 deepseek-r1https://ollama.com/library/deepseek-r1 显存需求 &#xff0c;我们显存是16G&#xff0c;可以玩好几个 二、以14B模型演示 1、安装ollama curl -fsSL htt…

RAGFlow部署与使用介绍-深度文档理解和检索增强生成

ragflow部署与使用教程-智能文档处理与知识管理的创新引擎 1. ragflow简介 ​ RAGFlow作为新一代智能文档处理平台&#xff0c;深度融合检索增强生成&#xff08;RAG&#xff09;技术与自动化工作流引擎&#xff0c;为企业级知识管理提供全栈解决方案。通过结合多模态解析、语…

【AI赋能:58招聘数据的深度剖析之旅】

影刀出鞘&#xff0c;抓取数据 在当今数字化时代&#xff0c;数据分析已成为企业决策和发展的关键驱动力。而获取高质量的数据则是数据分析的首要任务。在这个信息爆炸的时代&#xff0c;网络上蕴含着海量的数据&#xff0c;其中招聘网站的数据对于人力资源分析、市场趋势研究…

几何法证明卡特兰数_栈混洗

模型&#xff1a; 考虑从坐标原点 (0, 0) 到点 (n, n) 的路径&#xff0c;要求路径只能向右&#xff08;x 方向&#xff09;或向上&#xff08;y 方向&#xff09;移动&#xff0c;并且路径不能越过直线 y x&#xff08;即始终满足 y< x &#xff09;。这样的路径数量就是…

Kafka的安装与使用(windows下python使用等)

一、下载 可以去官网下载&#xff1a;https://kafka.apache.org/downloads 版本可选择&#xff0c;建议下载比较新的&#xff0c;新版本里面自带zookeeper 二、安装 创建一个目录&#xff0c;此处是D:\kafka&#xff0c;将文件放进去解压 如果文件后缀是gz&#xff0c;解压…

数据结构初阶: 顺序表的增删查改

顺序表 概念 顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;⼀般情况下采⽤数组存储。如图1&#xff1a; 顺序表和数组有什么区别&#xff1f; 顺序表的底层是用数组实现的&#xff0c;是对数组的封装&#xff0c;实现了增删查改等接口。 分…

详解AI采集框架Crawl4AI,打造智能网络爬虫

大家好&#xff0c;Crawl4AI作为开源Python库&#xff0c;专门用来简化网页爬取和数据提取的工作。它不仅功能强大、灵活&#xff0c;而且全异步的设计让处理速度更快&#xff0c;稳定性更好。无论是构建AI项目还是提升语言模型的性能&#xff0c;Crawl4AI都能帮您简化工作流程…

【爬虫开发】爬虫开发从0到1全知识教程第14篇:scrapy爬虫框架,介绍【附代码文档】

本教程的知识点为&#xff1a;爬虫概要 爬虫基础 爬虫概述 知识点&#xff1a; 1. 爬虫的概念 requests模块 requests模块 知识点&#xff1a; 1. requests模块介绍 1.1 requests模块的作用&#xff1a; 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点&#xff1a…

SQLark:一款国产免费数据库开发和管理工具

SQLark&#xff08;百灵连接&#xff09;是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;目前可以支持达梦数据库、Oracle 以及 MySQL。 对象管理 SQLark 支持丰富的数据库对象管理功能&#xff0c;包括…

防爆对讲机VS非防爆对讲机,如何选择?

在通信设备的广阔市场中&#xff0c;对讲机以其高效、便捷的特点&#xff0c;成为众多行业不可或缺的沟通工具。而面对防爆对讲机与非防爆对讲机&#xff0c;许多用户常常陷入选择困境。究竟该如何抉择&#xff0c;且听我为您细细道来。 防爆对讲机&#xff0c;专为危险作业场…

微信小程序开发:开发实践

微信小程序开发实践研究 摘要 随着移动互联网的迅猛发展&#xff0c;微信小程序作为一种轻量化、无需安装的应用形式&#xff0c;逐渐成为开发者和用户的首选。本文以“个人名片”小程序为例&#xff0c;详细阐述了微信小程序的开发流程&#xff0c;包括需求分析、项目规划、…

操作 Office Excel 文档类库Excelize

Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库&#xff0c;基于 ECMA-376 OOXML 技术标准。可以使用它来读取、写入 XLSX 文件&#xff0c;相比较其他的开源类库&#xff0c;Excelize 支持操作带有数据透视表、切片器、图表与图片的 Excel 并支持向 Excel 中插…

青铜与信隼的史诗——TCP与UDP的千年博弈

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 第一章 契约之匣与自由之羽 熔岩尚未冷却的铸造台上&#xff0c;初代信使长欧诺弥亚将液态秘银倒入双生模具。左侧模具刻着交握的青铜手掌&#xff0c;右侧则是展开的隼翼纹章。当星辰…

「青牛科技」GC5849 12V三相无感正弦波电机驱动芯片

芯片描述&#xff1a; • 4 &#xff5e; 20V 工作电压&#xff0c; 30V 最大耐压 • 驱动峰值电流 2.0A &#xff0c;连续电流 800mA 以内 • 芯片内阻&#xff1a; 900mΩ &#xff08;上桥 下桥&#xff09; • eSOP-8 封装&#xff0c;底部 ePAD 散热&#xff0c;引…

Java基础之反射的基本使用

简介 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射让Java成为了一门动…

大语言模型中的嵌入模型

本教程将拆解什么是嵌入模型、为什么它们在NLP中如此重要,并提供一个简单的Python实战示例。 分词器将原始文本转换为token和ID,而嵌入模型则将这些ID映射为密集向量表示。二者合力为LLMs的语义理解提供动力。图片来源:[https://tzamtzis.gr/2024/coding/tokenization-by-an…