当前位置: 首页 > backend >正文

深入浅出理解时间复杂度和空间复杂度

目录

一、基本概念

时间复杂度

空间复杂度

二、常见复杂度分类

时间复杂度常见情况

空间复杂度常见情况

三、如何分析复杂度

时间复杂度分析步骤

空间复杂度分析步骤

四、复杂度对比图表

时间复杂度增长趋势

常见算法复杂度汇总

五、实际应用中的注意事项


一、基本概念

时间复杂度

定义:算法执行所需要的时间与输入数据规模之间的关系,表示算法运行时间的增长趋势。

通俗理解:当数据量增大时,算法执行时间会如何变化。

空间复杂度

定义:算法执行所需要的存储空间与输入数据规模之间的关系,表示算法内存占用的增长趋势。

通俗理解:当数据量增大时,算法需要多少额外的内存空间。

二、常见复杂度分类

时间复杂度常见情况

  1. O(1) - 常数时间

    • 无论数据量多大,执行时间不变

    • 例子:访问数组中的某个元素

    python

    复制

    下载

    def get_first_element(arr):return arr[0]  # 无论arr多大,都只做一次操作
  2. O(log n) - 对数时间

    • 数据量翻倍时,时间只增加固定量

    • 例子:二分查找

    python

    复制

    下载

    def binary_search(arr, target):low, high = 0, len(arr)-1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1
  3. O(n) - 线性时间

    • 执行时间与数据量成正比

    • 例子:遍历数组

    python

    复制

    下载

    def find_max(arr):max_val = arr[0]for num in arr:  # 遍历所有元素if num > max_val:max_val = numreturn max_val
  4. O(n log n) - 线性对数时间

    • 比线性慢,但比平方快

    • 例子:快速排序、归并排序

    python

    复制

    下载

    # 快速排序的复杂度为O(n log n)
  5. O(n²) - 平方时间

    • 数据量翻倍,时间变为4倍

    • 例子:嵌套循环

    python

    复制

    下载

    def bubble_sort(arr):n = len(arr)for i in range(n):         # 外层循环n次for j in range(n-1):   # 内层循环n-1次if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]
  6. O(2ⁿ) - 指数时间

    • 数据量增加1,时间翻倍

    • 例子:斐波那契数列递归解法

    python

    复制

    下载

    def fibonacci(n):if n <= 1:return nreturn fibonacci(n-1) + fibonacci(n-2)
  7. O(n!) - 阶乘时间

    • 最慢的复杂度之一

    • 例子:旅行商问题的暴力解法

空间复杂度常见情况

  1. O(1) - 常数空间

    • 算法使用的额外空间不随输入规模变化

    • 例子:交换两个变量

    python

    复制

    下载

    def swap(a, b):temp = a  # 只用了1个额外变量a = bb = temp
  2. O(n) - 线性空间

    • 额外空间与输入规模成正比

    • 例子:复制数组

    python

    复制

    下载

    def copy_array(arr):new_arr = []  # 创建与输入等大的新数组for num in arr:new_arr.append(num)return new_arr
  3. O(n²) - 平方空间

    • 额外空间与输入规模的平方成正比

    • 例子:构建二维矩阵

    python

    复制

    下载

    def create_matrix(n):matrix = [[0]*n for _ in range(n)]  # n×n的矩阵return matrix
  4. O(log n) - 对数空间

    • 递归调用时的栈空间

    • 例子:二分查找的递归实现

    python

    复制

    下载

    def binary_search_recursive(arr, target, low, high):if low > high:return -1mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:return binary_search_recursive(arr, target, mid+1, high)else:return binary_search_recursive(arr, target, low, mid-1)

三、如何分析复杂度

时间复杂度分析步骤

  1. 找出基本操作(通常是循环内的操作)

  2. 计算基本操作的执行次数与n的关系

  3. 忽略低阶项和常数系数

示例分析

python

复制

下载

def example(n):sum = 0                 # O(1)for i in range(n):      # 循环n次sum += i            # O(1)的操作执行n次 → O(n)return sum              # O(1)

总时间复杂度:O(1) + O(n) + O(1) = O(n)

空间复杂度分析步骤

  1. 计算算法使用的额外存储空间(不包括输入数据本身)

  2. 考虑变量、数据结构、递归调用栈等

示例分析

python

复制

下载

def example(n):arr = [0]*n      # 创建了长度为n的数组 → O(n)for i in range(n):arr[i] = ireturn arr

总空间复杂度:O(n)(因为创建了大小为n的数组)

四、复杂度对比图表

时间复杂度增长趋势

复制

下载

n       O(1)  O(log n)  O(n)  O(n log n)  O(n²)  O(2ⁿ)    O(n!)
-----------------------------------------------------------------
1       1     0         1     0           1      2        1
10      1     ~3.3      10    ~33         100    1024     ~3.6e6
100     1     ~6.6      100   ~664        10,000 1.27e30  9.33e157

常见算法复杂度汇总

算法时间复杂度(平均)时间复杂度(最坏)空间复杂度
线性查找O(n)O(n)O(1)
二分查找O(log n)O(log n)O(1)
冒泡排序O(n²)O(n²)O(1)
快速排序O(n log n)O(n²)O(log n)
归并排序O(n log n)O(n log n)O(n)
哈希表查找O(1)O(n)O(n)
深度优先搜索(DFS)O(V+E)O(V+E)O(V)
广度优先搜索(BFS)O(V+E)O(V+E)O(V)

五、实际应用中的注意事项

  1. 时间与空间的权衡

    • 有时可以用更多空间换取更快的时间(如哈希表)

    • 有时可以牺牲时间换取更少的空间使用

  2. 隐藏的复杂度

    • 内置函数的复杂度(如Python的list.sort()是O(n log n))

    • 递归调用的空间复杂度(调用栈深度)

  3. 最佳、平均和最坏情况

    • 快速排序平均是O(n log n),但最坏是O(n²)

    • 哈希表查找平均是O(1),但冲突时可能退化到O(n)

  4. 实际工程中的考量

    • 小数据量时,简单算法可能更快

    • 缓存友好性有时比理论复杂度更重要

理解时间复杂度和空间复杂度是写出高效算法的关键,希望这个解释能帮助你建立清晰的概念框架!

http://www.xdnf.cn/news/7892.html

相关文章:

  • 【音频】如何解析mp3文件
  • 如何从 iPhone 获取照片:5 个有效解决方案
  • Wi-Fi(无线局域网技术)
  • C++类与对象(二):六个默认构造函数(二)
  • 心联网(社群经济)视角下开源AI智能名片、链动2+1模式与S2B2C商城小程序源码的协同创新研究
  • 第13天-用BeautifulSoup解析网页数据:以百度热搜可视化为例
  • leetcode2844. 生成特殊数字的最少操作-medium
  • C语言中的弱符号 __attribute__((weak)) 的使用方法
  • C语言---内存函数
  • Axure通过下拉框选项改变,控制字段显隐藏
  • Rust 学习笔记:关于泛型的练习题
  • Switch最新 模拟器 Eden(伊甸)正式发布 替代Yuzu模拟器
  • C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别
  • Python里字典的操作
  • C#语法篇 :基类子类转换,成员变化情况
  • 云蝠智能大模型呼叫动态情感共情能力上线!
  • SIGIR25-推荐论文整理
  • 面试相关的知识点
  • vue3 + vite 使用tailwindcss
  • 现代化SQLite的构建之旅——解析开源项目Limbo
  • 第17天-Pandas使用示例
  • 【SPIN】PROMELA 通道(Channels)(SPIN学习系列--8)
  • 【完整版】基于laravel开发的开源交易所源码|BTC交易所/ETH交易所/交易所/交易平台/撮合交易引擎
  • 机器学习-KNN算法
  • 为什么服务器突然变慢?从硬件到软件的排查方法
  • 论文阅读:Next-Generation Database Interfaces:A Survey of LLM-based Text-to-SQL
  • Flink架构概览,Flink DataStream API 的使用,FlinkCDC的使用
  • 手机充电协议
  • 目标检测135个前沿算法模型汇总(附源码)!
  • rocketmq优先级控制 + 并发度控制