数据结构与算法基础:时间复杂度与空间复杂度
本文介绍了算法的基本特征、设计原则和评价指标。算法应具备有穷性、确定性、可行性、有输入和有输出等特征。设计时需遵循正确性、可读性、健壮性及高效低存储原则。评价算法主要看时间复杂度和空间复杂度,前者衡量运行效率(理想为O(1)),后者衡量内存消耗。常见时间复杂度类型包括常数O(1)、对数O(log n)、线性O(n)等,优化目标是降低复杂度。空间复杂度分析主要关注内存对象和变量占用。最后强调现代AI
·
一、算法的基本特征
一个算法应具备以下五个基本特征:
- 有穷性:算法必须在
有限步骤内结束。 - 确定性:每一步操作都
有明确含义。 - 可行性:每一步操作可在
有限时间内完成。 - 有输入:算法有
零个或多个输入。 - 有输出:算法
至少产生一个输出。
示例:
while(true) { 0; } // 无穷循环,不满足有穷性
二、算法设计原则
在设计和实现算法时,应遵循以下原则:
- 正确性:算法结果必须正确。算法再好结果不正确都是乱搞。
- 可读性:代码易于理解和维护。便于团队写作。
- 健壮性:系统稳定,能处理异常情况。
- 高效率与低存储:尽量减少内存占用和 CPU 使用。
内存和 CPU 优化示例:
- 堆内存:避免 OOM(Out of Memory)。
- CPU 占用:减少运算时间,提高速度。
三、算法评价指标
评价算法主要关注两个指标:
-
时间复杂度(Time Complexity)
- 定义:运行一个程序所需的时间。
- 表示方法:通常用大 O 表示法(O())。
- 目的:衡量算法效率,越低越好。
-
空间复杂度(Space Complexity)
- 定义:运行程序所需的内存。
- 目的:衡量内存消耗,减少内存使用可以降低 OOM 风险。
四、时间复杂度分析
1. 计算意义
时间复杂度用于衡量算法在处理大数据量时的效率,帮助我们优化代码。
2. 常见复杂度类型
| 类型 | 表示 | 示例 | 特点 |
|---|---|---|---|
| 常数 | O(1) | 哈希表(HashMap)插入、查找、删除平均是 O(1) | 固定时间执行,不随数据增长 |
| 对数 | O(log n) | 二分查找 | 数据量翻倍,时间增加小。每次砍一半,数据翻倍也就多几刀,长得很慢 |
| 线性 | O(n) | 遍历数组 | 时间随数据量线性增长。一个个数数,数据多一倍,时间也多一倍 |
| 线性对数 | O(n log n) | 快速排序、归并排序 | 每个元素都要参与“砍半”,数据量大时常见的高效排序 |
| 平方 | O(n²) | 冒泡排序、选择排序 | 双重循环,一个个比,数据稍多就很慢 |
| 指数 | O(n^n) | 全排列问题 | 数据量稍大就不可行 |
注:
HashMap发生哈希冲突时会退化为链表 O(n) 或红黑树 O(log n)
3. 如何计算时间复杂度
-
找循环:分析
for、while、递归等循环结构。 -
找复杂操作:如网络请求、数据库查询等IO。
-
同级循环计算:
- 嵌套循环:乘法计算,循环阅读理论上越复杂
4. 优化目标
算法优化的目标是尽量让复杂度降低,靠近 O(1):
O(1) > O(log n) > O(n) > O(n log n) > O(n²) > O(n^x)
示例:
- 列表排序:从 O(n²) 冒泡排序优化到 O(n log n) 快速排序
- O(n log n) 在教材里更常见,空格表示 log 的自变量是 n,而程序员写文档时常省略空格写成 O(n logn)。
log₂(8) = 3,因为 2³ = 8;log₂(1024) = 10,因为 2¹⁰ = 1024。大白话来说,log 就是问一个数能被 2 翻多少次倍得到,所以像二分查找的 O(log n),就是每次把数据砍一半,大概砍几次就能找到目标。
五、空间复杂度分析
1. 计算意义
分析程序消耗的内存,避免浪费和 OOM。
2. 如何分析空间复杂度
- 找占用内存的对象,如数组、链表、缓存对象。
- 统计变量和递归调用占用的栈空间。
3. 常用优化方法
- 减少不必要的临时变量。
- 尽量复用已有内存对象。
六、总结
- 时间复杂度关注 速度,空间复杂度关注 内存。
- 优化算法的目标:降低复杂度,提高效率和系统稳定性。
- 现在可借助ai去编写算法,快速的降低了算法的门槛,我们可以了解下,避免ai出现幻觉,同时要多场景测试下。
更多推荐


所有评论(0)