Bootstrap

[算法] 苏醒!20种时间复杂度和空间复杂度

算法的空间复杂度和时间复杂度往往是相互影响的。追求较好的时间复杂度可能会使空间复杂度变差,反之亦然。

时间复杂度

时间复杂度定义

时间复杂度‌是指算法执行所需的时间与输入数据规模之间的关系,通常表示为T(n)=O(f(n)),其中n是问题的规模,f(n)是问题规模n的某个函数。T为“time”的意思。随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同(正相关)。

**

时间复杂度重要概念

**

  1. 最坏时间复杂度‌:在最坏情况下算法的时间复杂度。它表示算法在输入数据规模最大或最不利的情况下所需的执行时间。
  2. ‌平均时间复杂度‌:在所有输入示例等概率出现的情况下,算法的期望运行时间。它表示算法在输入数据规模随机分布时所需的平均执行时间。
  3. ‌最好时间复杂度‌:在最好情况下算法的时间复杂度。它表示算法在输入数据规模最小或最有利的情况下所需的执行时间。

**

时间复杂度从小到大排序及例子

**

| O(1) | 常数时间 (最优)
^
| O(log n) | 对数时间(如二分查找)
^
| O(sqrt(n)) | 平方根时间(例如:求素数的算法)
^
| O(n) | 线性时间(如遍历数组)
^
| O(n log n) | 线性对数时间(如归并排序,快速排序)
^
| O(n^2) | 平方时间(如冒泡排序,选择排序)
^
| O(n^3) | 立方时间(如矩阵乘法的暴力算法)
^
| O(2^n) | 指数时间(如递归解法的背包问题)
^
| O(n!) | 阶乘时间(如旅行商问题,排列问题)
^
| O(2^n / n!) | 超指数复杂度(例如:某些特殊的递归算法)
^
| O(n^n) | 多项式时间(非常稀有,通常仅出现在极为复杂的递归问题中)
^
| O(n^k) | 多项式时间(如快速傅里叶变换的最坏情况)
^
| O(log² n) | 对数的平方时间(某些复杂的树操作)
^
| O(n log log n) | 线性对数对数时间(某些优化算法,如某些素数筛选算法)
^
| O(n^2 log n) | 平方对数时间(例如,一些高级排序算法)
^
| O(n^3 log n) | 立方对数时间(某些复杂的矩阵算法)
^
| O(2(2n)) | 双指数时间(通常出现在一些特殊的递归问题中)
^
| O(2^n / n^k) | 指数除以多项式时间(某些优化算法,较为罕见)
^
| O(n^(log n)) | 指数多项式时间(例如某些特定的数论算法)
^
| O(n!) / n^k | 阶乘除以多项式时间(极其少见,出现在特殊问题中)

**

时间复杂度解释

:**

  1. O(1):常数时间复杂度,表示算法的运行时间与输入规模无关。无论输入大小如何,操作所需时间是固定的。

  2. O(log n):对数时间复杂度,表示算法的运行时间随着输入规模的增大而增加,但增加的速度比较慢。常见的如二分查找。

  3. O(sqrt(n)):平方根时间,通常出现在某些特殊的算法中,如一些数论算法或者处理某些数据结构时。

  4. O(n):线性时间复杂度,表示算法的运行时间与输入规模成正比。例如,遍历数组的每一个元素。

  5. O(n log n):线性对数时间复杂度,通常出现在高效的排序算法中,比如快速排序、归并排序。

  6. O(n²):平方时间复杂度,表示算法的运行时间与输入规模的平方成正比。常见的如冒泡排序、选择排序。

  7. O(n³):立方时间,出现在矩阵乘法等多重循环算法中。

  8. O(2^n):指数时间,表示算法的时间复杂度随输入规模的增加迅速爆炸。常见于递归算法,如背包问题、汉诺塔问题。

  9. O(n!):阶乘时间,通常出现在排列组合问题或者暴力解法的递归问题中,运行时间非常长。

  10. O(2^n / n!):超指数复杂度,极少见,出现在某些特殊的递归算法中

  11. O(n^n):多项式时间,极其复杂,通常仅在某些极为复杂的递归问题中出现。

  12. O(n^k):多项式时间复杂度的特殊情况,k 是常数。多项式时间相对于其他复杂度增长较慢,但随着 k 的增加,时间复杂度也会显著增长

  13. O(log² n):对数的平方,较为少见,可能出现在一些带有双层对数操作的算法中。

  14. O(n log log n):虽然很少见,但某些算法的复杂度属于这种类型。通常出现在一些高级算法优化中,例如某些素数筛选算法。

  15. O(n² log n):平方对数时间,可能出现在一些高效排序算法(如某些改进版的归并排序)或者计算几何问题中的某些高级算法。

  16. O(n³ log n):立方对数时间,某些高级矩阵计算算法(例如更复杂的矩阵分解)可能会达到这种复杂度。

  17. O(2(2n)):双指数时间,通常出现在一些非常复杂的递归算法中。比如,某些极其复杂的暴力解法会导致这种级别的时间复杂度。

  18. O(2^n / n^k):这是一种指数时间除以多项式的复杂度,出现在某些优化问题中,尤其是在算法中结合了递归和动态规划的策略时。

  19. O(n^(log n)):指数量级的时间复杂度,某些特定的数论问题或者复杂的树结构问题可能会导致这种复杂度

  20. O(n!) / n^k:非常罕见,阶乘时间除以多项式时间,这种复杂度一般出现在一些极为特殊的递归问题或者大规模排列问题的优化解法中

空间复杂度

空间复杂度定义

空间复杂度记做S(n)=O(f(n)),其中n为问题规模,f(n)为语句关于n所占存储空间的函数。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,同样反映的是一个趋势,通常用大写字母O来表示。

空间复杂度从小到大排序及例子

| O(1) | 常数空间复杂度 (最优)
^
| O(log n) | 对数空间复杂度 (递归栈空间,树的深度)
^
| O(sqrt(n)) | 平方根空间复杂度(例如:分治法中的递归空间)
^
| O(n) | 线性空间复杂度(如存储输入数据、数组、链表)
^
| O(n log n) | 线性对数空间复杂度(例如:归并排序,某些图算法)
^
| O(n²) | 平方空间复杂度(例如:二维数组,矩阵存储)
^
| O(n³) | 立方空间复杂度(例如:某些高维数据存储)
^
| O(2^n) | 指数空间复杂度(例如:递归问题的记忆化,子集生成)
^
| O(n!) | 阶乘空间复杂度(如排列组合问题的存储)
^
| O(2^n / n!) | 超指数空间复杂度(某些特定递归问题的优化)
^
| O(n^n) | 多项式空间复杂度(极为稀有的递归问题)
^
| O(n^k) | 多项式空间复杂度(例如:多维数组存储)
^
| O(log² n) | 对数平方空间复杂度(某些特定树结构的操作)
^
| O(n log log n) | 线性对数对数空间复杂度(某些优化算法,素数筛选)
^
| O(n^2 log n) | 平方对数空间复杂度(例如:某些排序算法的额外空间)
^
| O(n^3 log n) | 立方对数空间复杂度(矩阵计算等复杂问题)
^
| O(2(2n)) | 双指数空间复杂度(某些特殊递归问题)
^
| O(2^n / n^k) | 指数除以多项式空间复杂度(稀有,某些特殊算法)
^
| O(n^(log n)) | 指数多项式空间复杂度(某些特定算法,较为罕见)
^
| O(n!) / n^k | 阶乘除以多项式空间复杂度(极为稀有的递归算法)

时间复杂度解释

  1. O(1):常数空间复杂度。无论输入数据规模如何,所需的内存空间保持不变。比如简单的变量存储,或常量大小的数据结构。
  2. O(logn):对数空间复杂度。常见于递归算法,特别是递归树的深度。例如,二分查找的递归实现,树形数据结构的遍历(如平衡二叉树的递归操作)。
  3. O(sqrt(n)):平方根空间复杂度。常见于一些分治算法或动态规划算法中,空间复杂度随着输入规模的平方根增长。例如,某些筛选素数的算法。
  4. O(n):线性空间复杂度。算法需要存储与输入规模成线性关系的数据结构。例如,数组、链表、哈希表等。
  5. O(n log n):线性对数空间复杂度。常见于归并排序的递归实现。递归时需要维护一部分额外的内存空间。
  6. O(n²):平方空间复杂度。通常用于存储二维数据结构或矩阵。例如,矩阵乘法、二维数组存储。
  7. O(n³):立方空间复杂度。通常出现在需要存储三维数据结构的算法中,如某些复杂的图算法或多维数据的存储。
  8. O(2^n):指数空间复杂度。常见于递归算法,特别是子集生成问题或递归树的生成问题。例如,递归回溯算法生成所有子集的存储空间。
  9. O(n!):阶乘空间复杂度。出现于需要存储排列组合的算法中,如旅行商问题、排列问题等。
  10. O(2^n / n!):超指数空间复杂度。较少见,通常出现在一些递归算法的优化或特殊情境下,尤其是剪枝或某些子问题的合并。
  11. O(n^n):多项式空间复杂度。极为稀有,通常出现于一些递归问题,其中空间需求随着输入规模的增长而快速增加。例如,全排列问题的存储。
  12. O(n^k):多项式空间复杂度。常见于多维数组或需要存储多项式数量的数据。例如,多维数据结构的存储。
  13. O(log² n):对数的平方空间复杂度。通常出现于一些高级数据结构和算法中,例如,复杂树结构操作或高级排序算法。
  14. O(n log log n):线性对数对数空间复杂度。出现在一些特定的优化算法中,如某些素数筛选算法,通常使用空间较少的筛法。
  15. O(n² log n):平方对数空间复杂度。通常用于一些较为复杂的排序算法,或涉及对二维数据进行操作的算法。
  16. O(n³ log n):立方对数空间复杂度。出现在一些复杂的矩阵运算或其他需要存储多维数组的大规模数据处理算法中。
  17. O(2(2n)):双指数空间复杂度。常见于一些极其复杂的递归算法,如递归回溯或动态规划算法的多维空间。
  18. O(2^n / n^k):指数除以多项式空间复杂度。较为罕见,出现在一些优化算法中,通常出现在递归算法中。
  19. O(n^(log n)):指数多项式空间复杂度。通常出现在某些数论问题或涉及复杂递归的算法中,空间需求随输入规模的对数倍增长。
  20. O(n!) / n^k:阶乘除以多项式空间复杂度。非常稀有,通常出现在某些极为复杂的递归问题或排列组合问题中,处理时空间需求非常高。
;