[数据结构]算法复杂度详解

文章目录

  • 一、引言
    • 1、想象数据结构与算法的奇妙世界
    • 2、算法复杂度的轻松解读
    • 3、数据结构与算法的温馨寄语
  • 二、轻松掌握复杂度基础
    • 1、时间复杂度:算法速度的衡量尺
    • 2、空间复杂度:算法占地的衡量尺
    • 3、常见的复杂度
  • 三、复杂度的计算
    • 1、时间复杂度计算
    • 2、空间复杂度计算
    • 3、最好、最坏、平均复杂度
  • 四、C语言中的复杂度分析实例
    • 1、求和函数
    • 2、冒泡排序
    • 3、矩阵乘法
  • 五、扩展阅读

一、引言

1、想象数据结构与算法的奇妙世界

想象一下,数据结构就像书架,让数据变得有序。算法则是聪明的管理员,能快速找到你需要的数据。简单来说,算法就是帮我们把数据变成有用信息的聪明方法。

2、算法复杂度的轻松解读

算法复杂度就像问管理员找书快不快,需要多大地方放书。时间复杂度是找书速度,空间复杂度是书架大小。在编程中,这就像优化工作流程,让代码更快,占用资源更少。

3、数据结构与算法的温馨寄语

无论你是编程新手还是资深程序员,数据结构和算法都是你的好朋友。它们是计算机科学的基础,也是你写出高效、可靠代码的秘密武器。掌握它们,就像给编程加速,让代码更流畅、更高效。它们也是你展现才华的舞台,在笔试和面试中证明你的能力。


二、轻松掌握复杂度基础

1、时间复杂度:算法速度的衡量尺

时间复杂度,就是估算算法跑多快的一个工具。它不看具体时间,而是看算法里基本操作做了多少次,和数据量有啥关系。就像看厨师做菜,不看具体几分钟,而是看食材多少来估时间。

2、空间复杂度:算法占地的衡量尺

空间复杂度,是看算法运行时占多少地方的一个工具。它不算具体的bytes,而是算用了多少变量,就像看房间里放了多少箱子。主要关注的是算法临时申请的空间,编译时定好的栈空间不算。

3、常见的复杂度

  • 常数复杂度 O(1):算法执行时间恒定,不受数据量大小影响,效率极高。
  • 对数复杂度 O(logN):随着数据量翻倍,算法执行时间仅轻微增加,效率下降不明显。
  • 线性复杂度 O(N):算法执行时间与数据量成正比,数据量增大时,效率线性下降。
  • 线性对数复杂度 O(NlogN):效率略低于线性复杂度,但优于平方复杂度。数据量翻倍时,效率下降速度介于线性与平方之间。
  • 平方复杂度 O(N^2):算法执行时间随数据量平方增长,数据量翻倍时,效率显著下降。
  • 立方复杂度 O(N^3):比平方复杂度更慢,数据量翻倍时,效率下降速度更快。
  • 指数复杂度 O(2^N):数据量增加时,算法执行时间呈爆炸性增长,数据量翻倍导致效率急剧下降,对于大数据集几乎不可行。

文章配图


三、复杂度的计算

1、时间复杂度计算

时间复杂度就是计算算法完成任务时,基本操作执行的次数如何随数据量变化。比如,遍历一个列表的算法,其基本操作(如访问元素)执行次数与列表长度N成正比,所以时间复杂度是O(N)。

2、空间复杂度计算

空间复杂度衡量的是算法运行时需要占用的存储空间大小。简单说,就是算法运行时 “用了多少地方” 。比如,使用一个固定大小的变量,空间复杂度为O(1);若使用了一个与数据量N相等的数组,则空间复杂度为O(N)。

3、最好、最坏、平均复杂度

  • 最好复杂度:算法在 “最顺利” 时的运行时间。
  • 最坏复杂度:算法在 “最糟糕” 时的运行时间。
  • 平均复杂度:算法在不同输入下运行时间的 “平均值” 。

四、C语言中的复杂度分析实例

1、求和函数

int sum(int arr[], int n) 
{int res = 0;for (int i = 0; i < n; i++) {res += arr[i];}return res;
}

时间复杂度O(N),因为循环n次,每次循环执行一次加法操作
空间复杂度O(1),因为额外的变量只有res和i

2、冒泡排序

void bubbleSort(int arr[], int n) 
{for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {//交换arr[j]和arr[j+1]int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}

时间复杂度O(N^2),因为有两层嵌套的循环,每层循环最多执行n次
空间复杂度O(1),因为额外的变量只有i, j和temp

3、矩阵乘法

void matrixMultiplication(int A[][2], int B[][2], int C[][2], int n) 
{for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {C[i][j] = 0;for (int k = 0; k < n; k++) {C[i][j] += A[i][k] * B[k][j];}}}
}

时间复杂度O(N^3),因为有三层嵌套的循环,每层循环最多执行n次
空间复杂度O(N^2),因为需要存储结果矩阵C


五、扩展阅读

  • 学好算法对一个程序员来说是必须的吗?如果是,至少应该学到哪种程度?
  • 学数据结构和算法一定要多刷题,多练习
  • 维基百科 - 数据结构
  • 维基百科 - 算法

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

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

相关文章

加密与安全_优雅存储二要素(AES-256-GCM )

文章目录 什么是二要素如何保护二要素&#xff08;姓名和身份证&#xff09;加密算法分类场景选择算法选择AES - ECB 模式 (不推荐)AES - CBC 模式 (推荐)GCM&#xff08;Galois/Counter Mode&#xff09;AES-256-GCM简介AES-256-GCM工作原理安全优势 应用场景其他模式 和 敏感…

【CSS】选择器(基础选择器、复合选择器、属性匹配选择器、结构伪类选择器、伪元素选择器)

选择器 引入方式基础选择器复合选择器属性匹配选择器结构伪类选择器伪元素选择器 引入方式 1&#xff1a;外联 <!-- css引入方式1&#xff1a;外联 外联与内嵌优先级相同&#xff0c;取决于加载顺序 --><link rel"stylesheet" type"text/css" h…

echarts 自定义标注样式自定义tooltip弹窗样式

文章目录 1. 实现根据经纬度自定义标注图片样式2. 实现鼠标悬浮标注自定义弹窗样式内容 1. 实现根据经纬度自定义标注图片样式 设置 symbol 属性为 image://${require("/assets/img/dataView/point.png")} 图片地址即可&#xff0c;注意前面跟 image:// 特有的写法b…

【数一线性代数】007入门

Index 本文稍后补全&#xff0c;推荐阅读&#xff1a;https://blog.csdn.net/weixin_60702024/article/details/140939599分析实现总结 本文稍后补全&#xff0c;推荐阅读&#xff1a;https://blog.csdn.net/weixin_60702024/article/details/140939599 用两个栈来实现一个队列…

Redis学习以及SpringBoot集成使用Redis

目录 一、Redis概述 二、Linux下使用Docker安装Redis 三、SpringBoot集成使用Redis 3.1 添加redis依赖 3.2 配置连接redis 3.3 实现序列化 3.4 注入RedisTemplate 3.5 测试 四、Redis数据结构 一、Redis概述 什么是redis&#xff1f; redis 是一个高性能的&#xf…

数据库恢复技术详解【从基础冗余数据到故障恢复的全过程】

在数据库系统中&#xff0c;数据的安全性和一致性至关重要。无论是面对事务故障、系统故障还是介质故障&#xff0c;数据库都需要具备强大的恢复机制来应对这些潜在风险。本文将带领大家详细了解数据库恢复的实现技术&#xff0c;重点介绍如何利用冗余数据、转储和日志文件来实…

Cpp快速入门语法(下)(2)

文章目录 前言一、函数重载概念与使用C为何支持函数重载&#xff1f; 二、引用概念语法特性权限(常引用)使用场景与指针的区别 三、内联函数四、auto关键字(C11)五、基于范围的for循环(C11)六、指针空值nullptr(C11)总结 前言 承前启后&#xff0c;正文开始&#xff01; 一、函…

【BFS专题】— 解决拓扑排序问题

拓扑排序介绍&#xff1a; 1、课程表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 通过Map<Integer, List<Integer>> 来创建邻接图&#xff0c;数组来表示入度然后遍历课程数组&#xff0c;建图然后再拓扑排序&#xff0c;bfs最后在遍历入度数组&…

14届蓝桥杯嵌入式国赛

目录 前言&#xff1a; 1.使用CUbeMX进行基础初始化配置 &#xff08;1&#xff09;选则芯片与基本初始化 &#xff08;2&#xff09;LED配置 &#xff08;3&#xff09;按键配置 &#xff08;4&#xff09;定时器和PWM以及频率 &#xff08;5&#xff09;ADC电压检测 …

计算机网络 --- 初识协议

序言 上一篇文章中 &#xff08;&#x1f449;点击查看&#xff09;&#xff0c;我们简单的了解了怎么寻找目标计算机&#xff0c;需要通过交换机&#xff0c;路由器等设备跨越多个网络来不断的转发我们需要传输的数据&#xff0c;直至到达目标计算机。  那我们设备之间数据是…

JMeter 中使用 Gson 操作请求中的Boby参数

背景 使用org.json.JSONObject 转换&#xff0c;与原Body参数顺序发生变化&#xff0c;原因&#xff1a;JSONObject内部是用Hashmap来存储的&#xff0c;本质上是一个无序的键值对集合&#xff0c;不应依赖字段的添加顺序。 为解决org.json.JSONObject 输出顺序问题&#xff…

鸿蒙读书笔记2:《鸿蒙操作系统设计原理与架构》

2. OS基础平台部件化 &#xff08;1&#xff09;内核层 内核层包括内核部件和HDF驱动框架部件。当前已提供LiteOS-M、 LiteOS-A、Linux和UniProton这4种内核部件&#xff0c;未来还可增加更多类 型的内核部件。LiteOS、Linux内核部件可以按需部署在不同设备之 上&#xff0c;内…

echarts X轴文本太长 formatter自定义文本的显示方式

如果ECharts中X轴的文本太长&#xff0c;可以通过设置axisLabel的rotate属性来旋转标签&#xff0c;或者使用formatter函数来自定义文本的显示方式。另外&#xff0c;可以开启axisLabel的interval属性来控制显示的标签的间隔。 option {tooltip: {},xAxis: {type: category,d…

p14 使用阿里云服务器的docker部署NGINX

拉取NGINX的镜像 这里因为之前已经配置过从阿里云的镜像仓库里面拿镜像所以这里直接就执行docker pull nginx拉取NGINX镜像就OK了 运行NGINX镜像 这里执行docker run -d --name nginx01 -p 3344:80 nginx这里3344是服务器访问的端口80是容器内部的端口&#xff0c;可以看到…

【C++ Primer Plus习题】16.5

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <list> using namespace…

硬件工程师笔试面试——集成电路

目录 17、集成电路 17.1 基础 集成电路实物图 17.1.1 概念 17.1.2 集成电路的发展历程 17.1.3 集成电路的分类 17.1.4 集成电路的制造工艺 17.1.5 集成电路的应用 17.2 相关问题 17.2.1 集成电路的制造工艺中,光刻技术是如何实现的? 17.2.2 在集成电路设计中,如何…

微信电脑版聊天图片DAT格式文件转为普通JPG图片

1-7 本文章主要教你如何恢复微信聊天中的聊天图片&#xff0c;主要应用场景是&#xff0c;当你的微信被封号了&#xff0c;或者无法登录了&#xff0c;会导致微信聊天中的聊天图片没办法再打开&#xff0c;如果是重要的图片&#xff0c;那就有损失了&#xff0c;所以有了本文的…

【无人机设计与控制】四旋翼无人机轨迹跟踪及避障Matlab代码

摘要 本文主要研究了四旋翼无人机在复杂环境中的轨迹跟踪与避障控制策略。通过Matlab/Simulink对四旋翼无人机进行了建模与仿真。系统集成了避障算法&#xff0c;使得无人机在执行任务时能够有效避开障碍物&#xff0c;保证飞行的安全性与稳定性。 理论 无人机飞行控制通常涉…

leetcode-枚举算法

1.两数之和 题目一&#xff1a;两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素…