【算法设计与分析】(一)介绍算法与复杂度分析
【算法设计与分析】(一)介绍算法与复杂度分析
- 前言
- 一、什么是算法?
- 二、算法的抽象机制
- 三、描述算法
- 四、复杂度分析
- 4.1 时间复杂度
- 4.2 空间复杂度
前言
- 从搜索引擎的高效检索,到推荐系统的个性化推荐,再到人工智能领域的复杂决策过程,算法都扮演着至关重要的角色。
于每一个从事计算机相关工作或对编程有浓厚兴趣的人来说,深入理解算法设计与分析的原理和方法,不仅是提升编程技能的关键,更是解决实际问题、推动技术创新的必备能力。
- 这篇博客将作为一个起点,带领大家逐步探索算法设计与分析的奇妙世界。我们将从基础的概念入手,为后续深入的学习和实践打下坚实的基础。

一、什么是算法?
-
算法,简单来说,就是为解决特定问题而设计的一系列明确且有限的步骤。
-
例如,我们要计算两个数的和,设计一个算法可能包括输入两个数、执行加法运算、输出结果这几个步骤。
-
而程序则是算法在特定编程语言中的具体实现。以 C 语言为例,实现上述计算两数之和的程序如下:
#include <stdio.h>int main() {float a, b, result;printf("请输入第一个数: ");scanf("%f", &a);printf("请输入第二个数: ");scanf("%f", &b);result = a + b;printf("两数之和为: %.2f\n", result);return 0;
}
在这段 C 语言代码中,我们首先包含了标准输入输出头文件stdio.h,以便使用printf和scanf函数进行输入输出操作。然后在main函数中,定义了三个变量a、b和result,分别用于存储输入的两个数和计算得到的和。通过scanf函数获取用户输入的两个数,执行加法运算后,使用printf函数将结果以保留两位小数的形式输出。
- 可以看出,算法是程序的灵魂,程序是算法的载体。算法关注的是解决问题的逻辑和步骤,而程序则侧重于如何用具体的代码将算法实现出来。

二、算法的抽象机制
- 算法的抽象机制是一种强大的工具,它允许我们将复杂的问题简化,提取出核心的逻辑和操作。
通过抽象,我们可以忽略问题中不必要的细节,专注于关键的步骤和关系。
- 比如,在排序算法中,无论是冒泡排序、插入排序还是快速排序,它们都可以被抽象为对一组数据进行重新排列的过程。
我们可以将数据的比较和交换操作抽象出来,形成一个通用的排序框架。这种抽象不仅有助于我们理解不同排序算法的本质,还能方便我们在不同的场景中选择合适的算法。
以冒泡排序为例,以下是 C 语言冒泡排序算法:
#include <stdio.h>// 交换两个整数的值
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}// 冒泡排序函数
void bubbleSort(int arr[], int n) {int i, j;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {swap(&arr[j], &arr[j + 1]);}}}
}int main() {int arr[] = { 64, 34, 25, 12, 22, 11, 90 };int n = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, n);printf("排序后的数组: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
在上述代码中,swap函数用于交换两个整数的值,bubbleSort函数实现了冒泡排序的逻辑。通过多次比较相邻元素并交换顺序,最终将数组中的元素按照从小到大的顺序排列。
- 抽象机制还可以帮助我们复用算法。
- 当我们设计出一个有效的算法解决某个问题后,通过抽象,我们可以将其应用到类似的问题中,提高开发效率。

三、描述算法
- 为了清晰地表达算法,我们需要选择合适的描述方式。常见的描述算法的方式有自然语言、流程图、伪代码等。
- 自然语言是最容易理解的描述方式,它使用我们日常的语言来描述算法的步骤。
-
例如,描述一个计算阶乘的算法:“首先输入一个整数 n,然后从 1 开始,依次乘以 2、3 直到 n,最后输出得到的结果。” 但自然语言描述可能存在歧义,不够精确。
- 流程图则通过图形化的方式展示算法的流程。它使用各种图形符号(如矩形表示操作、菱形表示判断等)和箭头来表示算法的执行顺序。流程图直观易懂,有助于我们理清算法的逻辑结构。

- 伪代码是一种介于自然语言和编程语言之间的描述方式。它使用类似编程语言的语法结构,但更侧重于表达算法的逻辑,而不涉及具体的编程语言细节。例如,计算阶乘的伪代码可以写成:
input n
factorial = 1
for i from 1 to nfactorial = factorial * i
end for
output factorial
以下是用 C 语言实现计算阶乘的代码:
#include <stdio.h>int main() {int n, i;long long factorial = 1; // 使用long long类型以处理较大的阶乘结果printf("请输入一个整数: ");scanf("%d", &n);for (i = 1; i <= n; i++) {factorial *= i;}printf("%d 的阶乘为: %lld\n", n, factorial);return 0;
}
在这段 C 语言代码中,我们通过for循环从 1 到输入的整数n进行累乘,最终得到n的阶乘结果,并将其输出。
不同的描述方式各有优缺点,在实际应用中,我们可以根据具体情况选择合适的方式来描述算法。
四、复杂度分析
- 复杂度分析是算法设计与分析中非常重要的一个环节。它主要用于评估算法的效率,包括时间复杂度和空间复杂度。在深入探讨复杂度之前,我们先引入一个重要的概念:f(n)正函数。

4.1 时间复杂度
时间复杂度衡量的是算法执行所需的时间随着输入规模的增长而变化的趋势。我们通常使用大O符号( O O O)来表示时间复杂度。
- 大O符号的定义:设 f ( n ) f(n) f(n)和 g ( n ) g(n) g(n)是定义在正整数集上的正函数,如果存在正常数 c c c和 n 0 n_0 n0,使得当 n ≥ n 0 n \geq n_0 n≥n0时,有 f ( n ) ≤ c ⋅ g ( n ) f(n) \leq c \cdot g(n) f(n)≤c⋅g(n),则称 f ( n ) f(n) f(n)在渐近意义下小于等于 g ( n ) g(n) g(n),记作 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))。
例如,对于一个算法,如果它的执行时间 T ( n ) T(n) T(n)可以表示为 T ( n ) = 3 n 2 + 2 n + 1 T(n) = 3n^2 + 2n + 1 T(n)=3n2+2n+1,我们可以找到 c = 4 c = 4 c=4, n 0 = 1 n_0 = 1 n0=1,当 n ≥ 1 n \geq 1 n≥1时, 3 n 2 + 2 n + 1 ≤ 4 n 2 3n^2 + 2n + 1 \leq 4n^2 3n2+2n+1≤4n2,所以 T ( n ) = O ( n 2 ) T(n) = O(n^2) T(n)=O(n2)。这意味着随着输入规模 n n n的增大, n 2 n^2 n2这一项起主导作用,其他低阶项(如 2 n 2n 2n和 1 1 1)对整体时间的影响越来越小,可以忽略不计。
常见的时间复杂度有:
- O ( 1 ) O(1) O(1)(常数时间):算法的执行时间不随输入规模 n n n的变化而变化,例如访问数组中的一个固定位置的元素。
- O ( log n ) O(\log n) O(logn)(对数时间):常见于二分查找等算法,随着输入规模 n n n的增大,执行时间增长缓慢。
- O ( n ) O(n) O(n)(线性时间):如顺序查找算法,执行时间与输入规模 n n n成正比。
- O ( n log n ) O(n \log n) O(nlogn):许多高效的排序算法(如归并排序、快速排序的平均情况)具有这种时间复杂度。
- O ( n 2 ) O(n^2) O(n2)(平方时间):像冒泡排序、插入排序等简单排序算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),当输入规模较大时,算法的执行时间会显著增加。
4.2 空间复杂度
空间复杂度则关注算法在执行过程中所需的额外空间。同样使用大O符号来表示,即分析随着输入规模 n n n的增加,算法所需额外空间的变化趋势。
例如,一个算法在执行过程中,除了输入数据本身占用的空间外,只使用了固定数量的额外变量,无论输入规模 n n n如何变化,额外空间都不改变,那么该算法的空间复杂度就是 O ( 1 ) O(1) O(1)。
如果一个算法需要创建一个大小与输入规模 n n n成正比的数组来存储中间结果,那么它的空间复杂度就是 O ( n ) O(n) O(n)。
以之前的冒泡排序算法为例,其时间复杂度为 O ( n 2 ) O(n^2) O(n2),因为它有两层嵌套的循环,对于长度为 n n n的数组,总的比较和交换操作次数大约为 n ∗ ( n − 1 ) / 2 n * (n - 1) / 2 n∗(n−1)/2,随着 n n n的增大,时间增长的趋势与 n n n的平方成正比。而其空间复杂度为 O ( 1 ) O(1) O(1),因为在排序过程中,除了输入的数组本身外,只使用了有限的额外变量(如循环变量 i i i、 j j j和用于交换的临时变量),额外空间的使用不随输入规模 n n n的变化而变化。
通过复杂度分析,我们可以在设计算法时选择更高效的方案,避免在实际应用中出现性能瓶颈。
| 非常感谢您的阅读,喜欢的话记得三连哦 |

相关文章:
【算法设计与分析】(一)介绍算法与复杂度分析
【算法设计与分析】(一)介绍算法与复杂度分析 前言一、什么是算法?二、算法的抽象机制三、描述算法四、复杂度分析4.1 时间复杂度4.2 空间复杂度 前言 从搜索引擎的高效检索,到推荐系统的个性化推荐,再到人工智能领域…...
SurfaceFlinger代码笔记
drawLayers是做client合成,合成完以后的buffer会放在RenderSurface里 FrameBufferSurface里的buffer是通过setClientTarget给到HWC的(HWC应该给client合成的buffer留了一个slot) Output.cpp这个文件非常关键,代表着具体一个Display的操作 d…...
2025 PHP授权系统网站源码
2025 PHP授权系统网站源码 安装教程: PHP7.0以上 先上传源码到服务器,然后再配置伪静态, 访问域名根据操作完成安装, 然后配置伪静态规则。 Ngix伪静态规则: location / { if (!-e $request_filename) { rewrite …...
Fisher散度:从信息几何到机器学习的隐藏利器
Fisher散度:从信息几何到机器学习的隐藏利器 在机器学习和统计学中,比较两个概率分布的差异是常见任务,比如评估真实分布与模型预测分布的差距。KL散度(Kullback-Leibler Divergence)可能是大家熟悉的选择,…...
深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )
🍨 本文为🔗365天深度学习训练营 中的学习记录博客Y1中的内容 🍖 原作者:K同学啊 | 接辅导、项目定制 ** 注意该训练营出现故意不退押金,恶意揣测偷懒用假的结果冒充真实打卡记录,在提出能够拿到视频录像…...
实体机器人在gazebo中的映射
这一部分目的是将真实的机器人映射到gazebo中,使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。 真实机器人的型号的wheeltec旗下的mini_mec。 一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip 找到对应的包 拷贝到工作空间下 在原有…...
【学习笔记】Kubernetes
一、 概览 Kubernetes 提供了一个抽象层,是用户可以在屋里或虚拟环境中部署容器化应用,提供以容器为中心的基础架构。 Kubernetes的控制平面和工作节点都有什么组建? 分别有什么作用? 1.1 Kubernetes控制平面和工作节点的组件及…...
【网络编程】几个常用命令:ping / netstat / xargs / pidof / watch
ping:检测网络联通 1. ping 的基本功能2. ping 的工作原理3. ping 的常见用法4. ping 的输出解释5. ping 的应用场景6. 注意事项 netstat:查看网络状态 1. netstat 的基本功能2. 常见用法3. 示例4. 输出字段解释5. netstat 的替代工具6. 注意事项 xargs&…...
上海创智学院(测试)算法笔试(ACM赛制)部分例题
1.第一个题,大概题目意思是求n句话中最长的单词和最短的单词 这个题目做的有点磕巴,好几年没有写过c/c了,连string的复制都不会写了,哈哈哈,太笨了 后面一点点捡起来,还是写出来了,本身没啥&…...
【学术投稿-第四届材料工程与应用力学国际学术会议(ICMEAAE 2025】材料工程与应用力学的探讨
重要信息 官网:www.icmeaae.com 时间:2025年3月7-9日 地点:中国西安 简介 第四届材料工程与应用力学(ICMEAAE 2025)将于2025年3月7日至9日在中国西安召开。本次会议将重点讨论材料科学、应用力学等领域的最新研究进…...
2025吐槽季第一弹---腾讯云EO边缘安全加速平台服务
前言: 关于EO边缘安全加速平台服务 参照:产品概述,具体如下: 边缘安全加速平台 EO(Tencent Cloud EdgeOne,下文简称为 EdgeOne)是国内首款基于全新架构的真正一体化的边缘安全加速平台。提供全面的安全防…...
力扣-动态规划-70 爬楼梯
思路 dp数组定义:爬到第i个台阶有多少种爬法递推公式: 当前台阶可能是从前一个或者前两个来的dp数组初始化:遍历顺序:顺序遍历时间复杂度: 代码 class Solution { public:int climbStairs(int n) {if(n 1) ret…...
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片 根据您的需求,目前需要了解以下几个关键点及分步解决方案: --- 一、现状分析 1. Ollama 的限制: - 目前Ollama主要面向文本大模型,原生不支持直接上传/处理图片 …...
使用 pytest-mock 进行 Python 高级单元测试与模拟
一、单元测试与模拟的意义 在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致: 测试速度变慢测试结果不可控产生副作用(如真实发送邮件)模拟(Mocking) 技术通过创建虚拟对象替代真…...
lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并等。
入口类:exportPdf package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowa…...
《Linux 指令集:开启极客世界的钥匙_01》
一、命令行基础 (一)命令行提示符解析 当前用户:显示当前登录的用户名。例如,当前用户为 “ubuntu_user”,则在命令行提示符中会显示该用户名。 连接符:通常是 “”,用于分隔用户名和计算机名…...
【Android】用 chrome://inspect/#devices 调试H5页面
通常做Android开发的过程中,不可避免的需要遇到去与H5交互,甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息: 直接在浏览器地址栏输入 : chrome://inspect/#devices 直接连接手机usb,打开开发者模式…...
Deepseek 实战全攻略,领航科技应用的深度探索之旅
想玩转 Deepseek?这攻略别错过!先带你了解它的基本原理,教你搭建运行环境。接着给出自然语言处理、智能客服等应用场景的实操方法与代码。还分享模型微调、优化技巧,结合案例加深理解,让你全面掌握,探索科技…...
《论区块链技术及应用》审题技巧 - 系统架构设计师
区块链技术及应用论题写作框架 一、考点概述 本论题“区块链技术及应用”主要考察软件测试工程师对区块链技术的理解及其在软件项目中的实际应用能力。论题涵盖了多个关键方面,首先要求考生对区块链技术有全面的认识,包括但不限于其作为分布式记账技术…...
ROS2 强化学习:案例与代码实战
一、引言 在机器人技术不断发展的今天,强化学习(RL)作为一种强大的机器学习范式,为机器人的智能决策和自主控制提供了新的途径。ROS2(Robot Operating System 2)作为新一代机器人操作系统,具有…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...
