本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~
一.时间复杂度
定义
时间复杂度是用来衡量算法执行时间与数据规模之间增长关系的一个指标,它表示随着数据规模的增大,算法执行时间的增长趋势。通常用大O符号表示法来表示,即T( 𝑛 ) = 𝑂( 𝑓( 𝑛 ) ),其中T( n )表示算法的执行时间,f( n )表示一个关于数据规模n的函数。
常见的时间复杂度
- 常数阶O(1):表示算法的执行时间与数据规模无关,无论数据规模多大,算法的执行时间都是一个常量。例如,访问数组中的一个元素,无论数组的大小如何,访问操作的时间复杂度都是O(1)。
- 对数阶O(logn):当数据规模增大时,算法的执行时间增长缓慢。例如,二分查找算法在有序数组中查找一个元素的时间复杂度就是O(logn),因为每次查找都能将搜索范围缩小一半。
- 线性阶O(n):表示算法的执行时间与数据规模成正比,数据规模增大几倍,算法的执行时间也增大几倍。例如,遍历一个长度为n的数组,时间复杂度就是O(n)。
- 线性对数阶O(nlogn):这种时间复杂度通常出现在一些高效的排序算法中,如快速排序、归并排序等。这些算法在平均情况下的时间复杂度为O(nlogn)。
- 平方阶O(n²):表示算法的执行时间与数据规模的平方成正比。例如,冒泡排序、插入排序等简单排序算法在最坏情况下的时间复杂度就是O(n²)。
- 立方阶O(n³):表示算法的执行时间与数据规模的立方成正比。例如,矩阵乘法的简单实现算法的时间复杂度就是O(n³)。
- 指数阶O(2ⁿ):表示算法的执行时间随着数据规模的增大呈指数增长,这种算法的效率非常低,通常在实际应用中会尽量避免使用。
时间复杂度的计算方法
- 确定基本操作:找出算法中执行次数最多的基本操作,例如,在一个循环中,循环体的执行次数就是基本操作的执行次数。
- 分析基本操作的执行次数与数据规模的关系:根据算法的逻辑结构,确定基本操作的执行次数与数据规模n之间的函数关系。
- 忽略低阶项和常数项:在大O表示法中,只关注函数的最高阶项,忽略低阶项和常数项,因为当数据规模足够大时,这些项对时间复杂度的影响可以忽略不计。
时间复杂度的作用
- 评估算法效率:通过分析算法的时间复杂度,可以比较不同算法在处理相同问题时的效率,从而选择最优的算法。
- 预测算法性能:在实际应用中,可以根据数据规模的大小,预测算法的执行时间,从而合理安排计算资源和优化算法。
- 指导算法设计:在设计算法时,通过分析时间复杂度,可以优化算法的逻辑结构,降低算法的时间复杂度,提高算法的效率。
二.空间复杂度
定义
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记做𝑆( 𝑛 ) = 𝑂( 𝑓( 𝑛 ) ),其中 𝑛 为问题的规模,𝑓 ( 𝑛 ) 表示一个关于数据规模 𝑛 的函数,它反映的是算法的存储空间与数据规模之间的增长关系。
常见的空间复杂度
- 常数阶(O(1)):表示算法的执行空间与数据规模无关,无论数据规模多大,算法的执行空间都是一个常量。例如,访问数组中的一个元素,无论数组的大小如何,访问操作的空间复杂度都是(O(1))。
- 线性阶(O(n)):表示算法的执行空间与数据规模成正比,数据规模增大几倍,算法的执行空间也增大几倍。例如,创建一个长度为(n)的一维数组,其空间复杂度就是(O(n))。
- 平方阶(O(n²)):表示算法的执行空间与数据规模的平方成正比。例如,创建一个(n×n)的二维矩阵,其空间复杂度就是(O(n²))。
- 对数阶(O(logn)):当数据规模增大时,算法的执行空间增长缓慢。例如,二分查找算法在有序数组中查找一个元素的空间复杂度就是(O(logn)),因为每次查找都能将搜索范围缩小一半。
- 线性对数阶(O(nlogn)):这种空间复杂度通常出现在一些高效的排序算法中,如快速排序、归并排序等。这些算法在平均情况下的空间复杂度为(O(nlogn))。
- 指数阶(O(2ⁿ)):表示算法的执行空间随着数据规模的增大呈指数增长,这种算法的效率非常低,通常在实际应用中会尽量避免使用。
空间复杂度的计算方法
- 确定算法中使用的变量和数据结构:找出算法中使用的所有变量、数组、对象等数据结构,这些数据结构所占用的空间就是算法的存储空间。
- 分析数据结构的大小与数据规模的关系:根据算法的逻辑结构,确定每个数据结构的大小与数据规模(n)之间的函数关系。
- 忽略低阶项和常数项:在大(O)表示法中,只关注函数的最高阶项,忽略低阶项和常数项,因为当数据规模足够大时,这些项对空间复杂度的影响可以忽略不计。
空间复杂度的作用
- 评估算法效率:通过分析算法的空间复杂度,可以比较不同算法在处理相同问题时的空间效率,从而选择最优的算法。
- 预测算法性能:在实际应用中,可以根据数据规模的大小,预测算法的执行空间,从而合理安排内存资源和优化算法。
- 指导算法设计:在设计算法时,通过分析空间复杂度,可以优化算法的逻辑结构,降低算法的空间复杂度,提高算法的空间效率。