复杂度

博客提供了一个链接 http://bigocheatsheet.com/ ,推测该链接可能与算法复杂度速查表相关,能为信息技术领域人员在算法复杂度查询方面提供便利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<think>我们首先需要明确时间复杂度和空间复杂度的基本概念。根据引用内容: - 时间复杂度:衡量算法执行时间随输入规模增长的变化趋势,通常用大O符号表示。 - 空间复杂度:衡量算法在运行过程中临时占用存储空间的大小随输入规模增长的变化趋势。 接下来,我们将逐步解释如何分析算法的时间复杂度和空间复杂度。 ### 1. 时间复杂度分析 时间复杂度描述算法运行时间与输入规模之间的关系。我们关注的是当输入规模n趋向于无穷大时,算法执行时间的增长趋势(即渐近行为)。分析步骤通常如下: 1. **找出基本操作**:算法中重复执行次数最多的操作(如循环内的操作)。 2. **计算执行次数**:将基本操作的执行次数表示为输入规模n的函数T(n)。 3. **使用大O表示法**:忽略低阶项和常数系数,只保留最高阶项。 #### 常见时间复杂度 - $O(1)$:常数阶,执行次数为常数。 - $O(\log n)$:对数阶,通常出现在二分查找等算法中。 - $O(n)$:线性阶,执行次数与n成正比。 - $O(n \log n)$:线性对数阶,如快速排序、归并排序的平均时间复杂度。 - $O(n^2)$:平方阶,如冒泡排序、插入排序。 - $O(n^3)$:立方阶,如矩阵乘法。 - $O(2^n)$:指数阶,如汉诺塔问题。 - $O(n!)$:阶乘阶,如旅行商问题的暴力解法。 #### 计算示例 **例1:常数阶** ```python def constant_time(n): return n * n ``` 无论n为多少,只执行一次乘法操作,时间复杂度为$O(1)$。 **例2:线性阶** ```python def linear_time(n): total = 0 for i in range(n): # 循环n次 total += i return total ``` 循环执行n次,时间复杂度为$O(n)$。 **例3:平方阶** ```python def quadratic_time(n): count = 0 for i in range(n): # 外层循环n次 for j in range(n): # 内层循环n次 count += 1 return count ``` 内层循环执行n次,外层执行n次,总次数为$n^2$,时间复杂度为$O(n^2)$。 **例4:对数阶** ```python def logarithmic_time(n): i = 1 count = 0 while i < n: i *= 2 count += 1 return count ``` 每次循环i乘以2,直到i>=n。设循环次数为k,则$2^k \geq n$,所以$k \approx \log_2 n$,时间复杂度为$O(\log n)$。 **例5:线性对数阶** ```python def linearithmic_time(n): count = 0 for i in range(n): # 循环n次 j = 1 while j < n: # 内层循环O(log n)次 j *= 2 count += 1 return count ``` 外层循环n次,内层循环$\log n$次,总次数为$n \log n$,时间复杂度为$O(n \log n)$。 ### 2. 空间复杂度分析 空间复杂度描述算法在运行过程中临时占用存储空间的大小(不包括输入/输出占用的空间)。分析步骤: 1. **找出临时变量**:算法运行过程中使用的额外空间(如变量、数组、递归栈等)。 2. **计算空间占用**:将额外空间占用表示为输入规模n的函数S(n)。 3. **使用大O表示法**:忽略常数和低阶项。 #### 常见空间复杂度 - $O(1)$:算法只使用常数个额外空间。 - $O(n)$:算法使用线性个额外空间(如数组)。 - $O(n^2)$:算法使用平方个额外空间(如二维数组)。 - $O(\log n)$:通常出现在递归算法中(递归深度为$\log n$)。 #### 计算示例 **例1:常数空间** ```python def constant_space(n): total = 0 for i in range(n): total += i return total ``` 只使用了固定数量的变量(total, i),空间复杂度为$O(1)$。 **例2:线性空间** ```python def linear_space(n): arr = [0] * n # 创建长度为n的数组 for i in range(n): arr[i] = i return arr ``` 创建了一个长度为n的数组,空间复杂度为$O(n)$。 **例3:递归空间** ```python def factorial(n): if n <= 1: return 1 return n * factorial(n-1) ``` 递归深度为n,每次递归调用使用常数空间,因此空间复杂度为$O(n)$。 **例4:对数空间** ```python def recursive_log(n): if n <= 1: return recursive_log(n//2) ``` 每次递归调用n减半,递归深度为$\log_2 n$,空间复杂度为$O(\log n)$。 ### 3. 时间与空间的权衡 在实际问题中,时间复杂度和空间复杂度往往不可兼得。例如: - **空间换时间**:使用哈希表(空间$O(n)$)将查找时间从$O(n)$降到$O(1)$。 - **时间换空间**:某些压缩算法通过增加计算时间减少存储空间。 ### 4. 分析方法总结 - **时间复杂度**:关注循环结构、递归深度、函数调用次数等。 - **空间复杂度**:关注数据结构大小、递归深度、动态分配的内存等。 通过以上分析,我们可以评估算法的效率并选择合适的算法。 ### 参考文献 [^1]: 我们在写一个算法的时候如何判断这个算法的好坏呢?我们主要从效率来分析,而效率包括时间效率和空间效率 时间效率称为时间复杂度,时间复杂度衡量一个算法的运行速度空间效率称为空间复杂度,空间复杂度衡量一个算法所需要的额外空间。 [^2]: 【数据结构入门】算法的时间复杂度和空间复杂度详解。 [^3]: 【算法】时间复杂度和空间复杂度分析。算法的时间复杂度,就是算法的时间量度,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度,其中f(n)是问题规模n的某个函数。 [^4]: 一文看懂算法的时间复杂度与空间复杂度(详细解析)。主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取一个平衡点。 [^5]: 算法时间复杂度 和 空间复杂度。算法复杂度分为时间复杂度和空间复杂度,一个好的算法应该具体执行时间短,所需空间少的特点。随着计算机硬件和软件的提升,一个算法的执行时间是算不太精确的。只能依据统计方法对算法进行估算。我们抛开硬件和软件的因素,算法的好坏直接影响程序的运行时间。 §§相关问题§§ 1. 如何计算递归算法的时间复杂度? 2. 空间复杂度分析中,递归调用占用的空间如何计算? 3. 常见排序算法的时间复杂度和空间复杂度各是多少? 4. 如何优化算法以降低时间复杂度? 5. 在实际编程中,如何根据问题规模选择合适复杂度的算法?</think>### 算法时间复杂度和空间复杂度分析 #### 一、基本概念 1. **时间复杂度** 衡量算法执行时间随输入规模($n$)增长的变化趋势,用大O符号$O(f(n))$表示。描述算法执行时间的**渐近上界**,关注最高阶项并忽略常数系数[^2][^4]。 - 例如:$T(n) = 3n^2 + 2n + 1$ 的时间复杂度为 $O(n^2)$。 2. **空间复杂度** 衡量算法运行过程中临时占用的**内存空间**随输入规模($n$)增长的变化趋势,同样用$O(f(n))$表示[^1][^4]。 - 例如:创建长度为$n$的数组,空间复杂度为$O(n)$。 #### 二、核心分析方法 ##### 时间复杂度计算步骤: 1. **找出基本操作**:算法中重复执行次数最多的操作(如循环内的核心操作)。 2. **建立执行次数函数$T(n)$**:计算基本操作执行次数与$n$的关系。 3. **简化表达式**: - 保留最高阶项 - 忽略常数系数 - 例如:$T(n) = 4n^2 + 3n + 6 \rightarrow O(n^2)$[^5]。 ##### 空间复杂度计算步骤: 1. **统计额外空间**:不包括输入数据本身占用的空间。 2. **分析变量与数据结构**: - 固定数量变量:$O(1)$ - 动态数组(长度$n$):$O(n)$ - 递归调用栈深度:$O(\text{递归深度})$[^4]。 #### 三、常见复杂度类型 | 类型 | 时间复杂度 | 空间复杂度 | 典型算法 | |----------------|------------|------------|------------------------------| | 常数阶 | $O(1)$ | $O(1)$ | 哈希表查找 | | 对数阶 | $O(\log n)$| $O(1)$ | 二分查找 | | 线性阶 | $O(n)$ | $O(n)$ | 遍历数组 | | 线性对数阶 | $O(n \log n)$ | $O(1)$ | 快速排序、归并排序 | | 平方阶 | $O(n^2)$ | $O(1)$ | 冒泡排序、双重循环 | | 指数阶 | $O(2^n)$ | $O(n)$ | 汉诺塔问题、暴力穷举 | #### 四、经典案例分析 1. **循环嵌套** ```python for i in range(n): # 执行 n 次 for j in range(n): # 每次执行 n 次 print(i, j) # 基本操作:执行 n×n 次 ``` - 时间复杂度:$O(n^2)$ - 空间复杂度:仅用固定变量$i,j$,故$O(1)$[^5]。 2. **递归算法(斐波那契数列)** ```python def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2) ``` - 时间复杂度:$O(2^n)$(递归树有$2^n$节点) - 空间复杂度:$O(n)$(递归栈深度为$n$)[^3]。 3. **动态规划(斐波那契优化)** ```python dp = [0, 1] # 额外空间 O(n) for i in range(2, n+1): # 循环 n 次 dp.append(dp[i-1] + dp[i-2]) ``` - 时间复杂度:$O(n)$ - 空间复杂度:$O(n)$(dp数组长度$n$)[^4]。 #### 五、时间与空间的权衡 - **空间换时间**:如哈希表通过$O(n)$空间将查找时间从$O(n)$降至$O(1)$[^4]。 - **时间换空间**:某些压缩算法通过增加计算减少存储空间。 #### 六、实际应用原则 1. 小规模数据:可选择简单但复杂度高的算法(如$O(n^2)$排序)。 2. 大规模数据:优先$O(n \log n)$或$O(n)$算法。 3. 递归算法需警惕栈溢出风险[^3]。 > 总结:时间复杂度关注**执行效率**,空间复杂度关注**内存占用**,二者常需权衡。分析时抓住核心操作与增长趋势,忽略低阶细节[^1][^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值