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

数据结构与算法汇总

数据结构与算法中常见算法的分类、核心思想及时间复杂度、空间复杂度的详细说明,帮助理解算法的效率特性:

一、基础排序与查找算法

1. 排序算法
算法类型具体算法核心思想时间复杂度(平均 / 最好 / 最坏)空间复杂度稳定性
比较类排序冒泡排序相邻元素两两比较,逆序则交换,重复至有序O (n²) / O (n)(已排序) / O (n²)O(1)稳定
选择排序每次选剩余元素中的最值,放到已排序序列末尾O(n²) / O(n²) / O(n²)O(1)不稳定
插入排序将元素逐个插入到已排序序列的合适位置(类似整理扑克牌)O (n²) / O (n)(已排序) / O (n²)O(1)稳定
归并排序分治法:拆分数组为两半,分别排序后合并O(n log n) / O(n log n) / O(n log n)O(n)稳定
快速排序分治法:选基准元素,分割数组为 “小于 / 大于基准” 两部分,递归排序O(n log n) / O(n log n) / O(n²)O (log n)(递归栈) / O (n)(最坏)不稳定
堆排序利用堆的特性,每次提取堆顶最值,重新调整堆结构O(n log n) / O(n log n) / O(n log n)O(1)不稳定
非比较类排序计数排序统计每个元素出现次数,直接计算其在有序数组中的位置(适用于整数)O (n + k)(k 为数据范围) / O (n + k) / O (n + k)O(n + k)稳定
基数排序按数字每一位(从低到高)排序,依赖计数排序作为子过程O (d*(n + k))(d 为位数,k 为基数)O(n + k)稳定
桶排序将数据分到多个桶中,桶内单独排序后合并(适用于均匀分布数据)O (n + k) / O (n + k) / O (n²)(桶内无序)O(n + k)稳定
2. 查找算法
算法名称核心思想时间复杂度(平均 / 最坏)空间复杂度适用场景
顺序查找逐个遍历元素,匹配目标值O(n) / O(n)O(1)无序集合、数据量小
二分查找有序数组中,每次取中间元素比较,缩小查找范围O(log n) / O(log n)O (1)(迭代)/ O (log n)(递归)有序数组
插值查找基于目标值与首尾元素的比例动态计算中间位置(二分查找的改进)O (log log n)(均匀分布) / O (n)(极端分布)O(1)均匀分布的有序数组
斐波那契查找利用斐波那契数列分割数组,减少比较次数O(log n) / O(log n)O(1)有序数组,减少乘法 / 除法操作
哈希查找通过哈希函数直接定位元素存储位置(依赖哈希表)O (1) / O (n)(哈希冲突严重时)O(n)需快速查找,允许少量哈希冲突

二、递归与分治算法

算法 / 问题核心思想时间复杂度空间复杂度备注
归并排序分治法:拆分 + 排序 + 合并O(n log n)O(n)见排序算法
快速排序分治法:选基准 + 分割 + 递归O(n log n)O(log n)见排序算法
二分查找(递归)分治法:递归缩小查找范围O(log n)O(log n)递归栈开销
大整数乘法将大整数拆分为小整数,通过公式减少乘法次数O(n^log3) ≈ O(n^1.585)O(n)传统方法为 O (n²)
矩阵乘法(Strassen 算法)将矩阵分块,用 7 次乘法替代传统 8 次,递归计算O(n^log7) ≈ O(n^2.807)O(n²)传统方法为 O (n³)
汉诺塔问题递归移动圆盘:n 个圆盘从 A→C(借助 B),分解为 n-1 个圆盘的子问题O(2ⁿ)O(n)指数级复杂度,仅理论意义

三、动态规划(DP)

算法 / 问题核心思想时间复杂度空间复杂度备注
斐波那契数列(DP 优化)存储子问题结果(f (n)=f (n-1)+f (n-2)),避免重复计算O(n)O (1)(滚动数组)递归未优化为 O (2ⁿ)
最长公共子序列(LCS)定义 dp [i][j] 为两个字符串前 i/j 位的 LCS 长度,通过子问题推导O(m*n)O (m*n)(可优化为 O (min (m,n)))m、n 为字符串长度
最长递增子序列(LIS)维护 “最小尾元素数组”,二分查找优化更新O(n log n)O(n)传统 DP 为 O (n²)
0-1 背包定义 dp [i][j] 为前 i 件物品、容量 j 时的最大价值,通过状态转移推导O(n*C)O (n*C)(可优化为 O (C))n 为物品数,C 为背包容量
完全背包物品可无限选,状态转移时允许重复选取O(n*C)O(C)优化后空间复杂度降低
Floyd-Warshall 算法动态规划求任意两点间最短路径,通过中间节点更新距离O(n³)O(n²)n 为顶点数
编辑距离定义 dp [i][j] 为两个字符串前 i/j 位的最小修改次数(插入 / 删除 / 替换)O(m*n)O(m*n)m、n 为字符串长度

四、贪心算法

算法名称核心思想时间复杂度空间复杂度适用场景
哈夫曼编码合并频率最低的节点生成最优前缀码树,用于数据压缩O(n log n)O(n)字符频率不均的压缩场景
活动选择问题每次选择结束时间最早的活动,最大化不重叠活动数量O (n log n)(排序)O(1)无权重的活动调度
Prim 算法从顶点出发,每次添加连接树内外的最短边,构建最小生成树O (E log V)(邻接表 + 优先队列)O(V)稠密图(边多)更优
Kruskal 算法按边权排序,依次添加不形成环的边,构建最小生成树O (E log E)(排序)O(V)稀疏图(边少)更优
Dijkstra 算法贪心选择当前最短路径节点,更新邻接节点距离,求单源最短路径O (E log V)(优先队列)O(V)非负权图
零钱兑换(贪心适用场景)优先选择最大面额硬币,直到凑齐金额(仅适用于特定面额,如 1,5,10)O (k)(k 为硬币种类)O(1)面额满足 “贪心选择性质”

五、图论算法

算法名称核心思想时间复杂度空间复杂度适用场景
图的遍历
深度优先搜索(DFS)从起点出发,尽可能深入遍历,无路可走时回溯O(V + E)O (V)(递归栈 /visited 数组)检测环、连通分量
广度优先搜索(BFS)从起点出发,按层次遍历所有可达节点O(V + E)O (V)(队列 /visited 数组)无权图最短路径、层次遍历
最短路径
Bellman-Ford 算法迭代松弛所有边,可检测负权环O(V*E)O(V)含负权边的单源最短路径
Floyd-Warshall 算法动态规划求任意两点间最短路径(见动态规划)O(V³)O(V²)多源最短路径
最小生成树
Prim 算法 / Kruskal 算法见贪心算法部分O(E log V) / O(E log E)O(V)连通无向图
其他图算法
拓扑排序对有向无环图(DAG)节点排序,使所有边从左到右O(V + E)O(V)任务调度、依赖关系处理
Kosaraju 算法(强连通分量)两次 DFS:第一次按完成时间排序,第二次在反向图中遍历O(V + E)O(V + E)有向图的强连通分量求解
Tarjan 算法(强连通分量)一次 DFS,通过栈和低链接值识别强连通分量O(V + E)O(V)有向图的强连通分量求解
Edmonds-Karp 算法(最大流)基于 BFS 的 Ford-Fulkerson 实现,寻找增广路径O(V*E²)O(V + E)网络流问题

六、字符串匹配算法

算法名称核心思想时间复杂度空间复杂度适用场景
朴素匹配逐个比较文本与模式串的字符,不匹配则回溯O(n*m)O(1)模式串 / 文本短,简单场景
KMP 算法预处理模式串得到 “部分匹配表”,避免文本指针回溯O(n + m)O(m)单模式串匹配,文本 / 模式串长
BM 算法从模式串尾部比较,利用 “坏字符” 和 “好后缀” 规则跳过无效比较O (n/m)(平均) / O (n*m)(最坏)O(m)单模式串匹配,实际效率高于 KMP
Rabin-Karp 算法通过哈希值比较文本子串与模式串,不匹配则直接跳过O (n + m)(无哈希冲突) / O (n*m)(冲突多)O(1)多模式串匹配初步筛选
AC 自动机基于字典树(Trie)和失败指针,同时匹配多个模式串O (n + m + z)(n 为文本长,m 为总模式串长,z 为匹配数)O(m)多模式串匹配(如敏感词过滤)

七、其他重要算法

算法名称核心思想时间复杂度空间复杂度适用场景
回溯算法尝试所有可能解,不满足条件则回溯(如 N 皇后、子集和)O (k*2ⁿ)(k 为操作复杂度)O (n)(递归栈)组合优化、解空间小的问题
分支限界法类似回溯,但通过 “界限” 剪枝,优先扩展更优分支(如旅行商问题)O (2ⁿ)(最坏)O(n)求最优解,解空间较大
位运算算法利用二进制位操作(如判断奇偶、计数 1 的个数)O (1)(单操作)O(1)整数运算优化、状态压缩
滑动窗口算法维护一个 “窗口”,通过移动边界解决子串 / 子数组问题(如最长无重复子串)O(n)O (k)(k 为窗口内元素类型数)连续子序列 / 子串问题
前缀和预处理数组前缀和,快速计算区间和O (n)(预处理) / O (1)(查询)O(n)频繁区间和查询
差分预处理差分数组,快速实现区间更新O (n)(预处理) / O (1)(更新)O(n)频繁区间更新 + 最终查询

总结

  • 时间复杂度:反映算法随数据规模增长的执行效率,优先选择低复杂度算法(如 O (n log n) 优于 O (n²))。
  • 空间复杂度:反映算法对内存的占用,需在时间与空间之间权衡(如归并排序用空间换时间)。
  • 适用场景:算法选择需结合数据特性(如有序 / 无序、是否含负权)、规模(n 大小)及稳定性要求(如排序是否需保持相等元素的相对顺序)。

理解时空复杂度是分析算法效率的核心,实际应用中需根据问题场景选择最优解。

http://www.lryc.cn/news/594457.html

相关文章:

  • 连接语言大模型(LLM)服务进行对话
  • GaussDB select into和insert into的用法
  • 机器学习基础:从数据到智能的入门指南
  • python生成密钥
  • Self-Consistency:跨学科一致性的理论与AI推理的可靠性基石
  • An End-to-End Attention-Based Approach for Learning on Graphs NC 2025
  • JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》
  • 《通信原理》学习笔记——第五章
  • 【1】YOLOv13 AI大模型-可视化图形用户(GUI)界面系统开发
  • Openlayers 面试题及答案180道(121-140)
  • 让不符合要求的任何电脑升级Windows11
  • 【LeetCode数据结构】单链表的应用——环形链表问题详解
  • WireShark抓包分析TCP数据传输过程与内容详解
  • 使用Qt6 QML/C++ 和CMake构建海康威视摄像头应用(代码开源)
  • 【GameMaker】GML v3 的现行提案
  • FreeRTOS任务创建与删除
  • Python 图片爬取入门:从手动下载到自动批量获取
  • Selenium 处理动态网页与等待机制详解
  • 复杂度优先:基于推理链复杂性的提示工程新范式
  • AUTOSAR进阶图解==>AUTOSAR_SWS_CryptoInterface
  • 【Java学习|黑马笔记|Day18】Stream流|获取、中间方法、终结方法、收集方法及其练习
  • 扩散模型与强化学习(12):RLHF中的Reward hacking现象
  • 深入解析Ext2文件系统架构
  • 【RK3576】【Android14】ADB工具说明与使用
  • 【Linux性能优化】常用工具和实战指令
  • 软件测试-Bug
  • 【软件测试】从软件测试到Bug评审:生命周期与管理技巧
  • 机器学习-数据预处理
  • 0401聚类-机器学习-人工智能
  • Vue开发前端报错:‘vue-cli-service‘ 不是内部或外部命令解决方案