一、什么是算法
算法是一组明确、有限、可执行的步骤:给定输入,经过一系列规则,得到期望输出。写程序并不总是在实现复杂算法,但排序、搜索、推荐、路径规划和调度都离不开它。
一个好的算法至少要回答三件事:结果是否正确、运行是否足够快、在边界条件下是否仍然可靠。
二、常见的解题方式
| 方法 | 核心想法 | 常见用途 |
|---|---|---|
| 枚举 | 尝试所有或大部分可能性 | 规模较小、验证思路 |
| 分治 | 把问题拆成更小的同类问题,再合并结果 | 归并排序、二分查找 |
| 贪心 | 每一步选择当前看起来最优的方案 | 区间选择、部分调度问题 |
| 动态规划 | 保存子问题结果,避免重复计算 | 路径、背包、序列问题 |
| 回溯 | 逐步构造方案,不满足条件就撤回 | 组合、排列、棋盘问题 |
| 图搜索 | 沿节点和边探索关系 | 最短路径、依赖分析、社交网络 |
没有一种方法永远最好。关键是识别问题是否有可拆分的子问题、局部最优是否能推出整体最优,以及状态是否会被重复计算。
三、用复杂度评估方案
算法需要在正确之外,考虑输入规模。比如在有序数组中找一个数:顺序查找是 O(n),二分查找是 O(log n)。当数据量足够大时,差异会非常明显。
除了时间复杂度,也要观察空间复杂度:为了更快而额外保存的数据是否值得。实际工程常常是在时间、内存、实现难度和可维护性之间取平衡。
四、形成算法思维的练习方式
- 先用最直接的方法写出能工作的版本;
- 写下输入、输出和边界条件,例如空数组、重复值和极端规模;
- 估算时间与空间成本;
- 再寻找能减少重复计算、缩小搜索范围或改进数据结构的地方。
先保证正确,再讨论优化。能清楚解释每一步为什么成立,比记住某个题目的答案更重要。