CSP-S——各算法可以实现的问题
CSP-S——各算法可以实现的问题
- 1. 排序算法
- 2. 搜索算法
- 3. 图论算法
- 4. 动态规划
- 5. 贪心算法
- 6. 字符串算法
- 7. 其他算法
1. 排序算法
著名问题:
- 数据排序
- Top K 问题
- 去重
- 中位数查找
2. 搜索算法
搜索算法用于在数据结构中查找元素或路径。
- 二分查找:在有序数组中查找元素。
- 深度优先搜索(DFS):用于图或树的遍历,解决路径问题。
- 广度优先搜索(BFS):用于图或树的遍历,解决最短路径问题(未加权图)。
- A*搜索:启发式搜索,用于路径规划(如游戏 AI)。
著名问题:
- 元素查找
- 迷宫求解
- 连通分量
- 拓扑排序
- 最短路径(未加权图)
3. 图论算法
图论算法解决图结构的问题,如路径、树和流。
- Dijkstra 算法:单源最短路径(非负权图),时间复杂度 O((V+E) log V)。
- Bellman-Ford 算法:单源最短路径(可处理负权边),时间复杂度 O(VE)。
- Floyd-Warshall 算法:所有对最短路径,时间复杂度 O(V³)。
- Kruskal 算法:最小生成树(基于并查集),时间复杂度 O(E log V)。
- Prim 算法:最小生成树(类似 Dijkstra),时间复杂度 O(E log V)。
- Ford-Fulkerson 算法:最大流问题(如网络流量)。
- 匈牙利算法:二分图匹配(如任务分配)。
著名问题:
- 最短路径:如地图导航(Dijkstra)、负权边处理(Bellman-Ford)、所有节点对最短路径(Floyd-Warshall)。
- 最小生成树:如网络设计、电缆布线(Kruskal 或 Prim)。
- 最大流:如网络流量优化、管道系统(Ford-Fulkerson)。
- 二分图匹配:如婚姻匹配、任务分配(匈牙利算法)。
- 强连通分量:使用 Kosaraju 或 Tarjan 算法找到有向图的强连通分量。
4. 动态规划
动态规划通过存储子问题解来解决优化问题,避免重复计算。
- 斐波那契数列
- 背包问题:0-1 背包、无限背包,用于资源分配。
- 最长公共子序列(LCS):用于字符串比较。
- 最长递增子序列(LIS):用于序列分析。
- 矩阵链乘法:优化矩阵乘法顺序。
- 编辑距离:字符串相似度。
- 硬币找零:最小硬币数凑出金额。
- 旅行商问题(TSP):虽然 NP 难,但 DP 可解决小规模问题。
著名问题:
- 优化问题:如最大化利润或最小化成本。
- 序列对齐:在生物信息学中用于 DNA 序列比对。
- 字符串处理:如自动更正、 plagiarism 检测。
- 路径规划:如机器人导航中的最短路径。
5. 贪心算法
贪心算法在每一步选择局部最优解,希望达到全局最优。
- 活动选择问题:选择最大兼容活动集。
- 霍夫曼编码:数据压缩,构建最优前缀码。
- 最小生成树:Kruskal 和 Prim 算法是贪心算法。
- Dijkstra 算法:单源最短路径也是贪心。
- 硬币找零:在某些币值下贪心有效(如美国币值)。
著名问题:
- 区间调度:如会议室安排、作业调度。
- 数据压缩:如文件压缩(霍夫曼编码)。
- 网络设计:如最小生成树用于连接所有节点。
- 贪心调度:如延迟最小化。
6. 字符串算法
字符串算法处理文本匹配、搜索和操作。
- KMP 算法:字符串匹配,时间复杂度 O(n+m)。
- Rabin-Karp 算法:使用哈希的字符串匹配。
- Boyer-Moore 算法:高效字符串匹配,跳过字符。
- Trie 树:前缀匹配(如自动完成)。
- 后缀树:高级字符串操作(如最长重复子串)。
著名问题:
- 文本搜索:在文档中查找关键词(如 grep 工具)。
- 拼写检查:使用编辑距离或 Trie 树。
- DNA 序列分析:如模式匹配、重复序列查找。
- 自动完成:如搜索引擎建议(使用 Trie 树)。
7. 其他算法
- 回溯算法:解决约束满足问题,如 N 皇后、数独、组合优化。
- 分支定界:用于组合优化,如 TSP、整数规划。
- 随机化算法:如快速排序随机化版本,避免最坏情况;或蒙特卡罗方法。
- 遗传算法:用于优化问题,模仿自然选择(如机器学习调参)。
著名问题:
- ** puzzles**:如数独、十字谜(回溯)。
- 组合优化:如装箱问题、调度(分支定界)。
- 近似解:对于 NP 难问题,提供近似解(如遗传算法)。