(1)穷举法(Brute Force)
穷举法的基本思想是:列举所有可能的情况,逐一验证,直到找到问题的解或证明无解。
- 优点:通用性强,思路简单,容易实现。
- 缺点:效率低,通常时间复杂度较高。
例子 :
判断一个数组中是否存在两个数的和为 kkk。穷举法的做法是枚举所有数对,检查其和是否等于 kkk,复杂度为 O(n2)O(n^2)O(n2)。
在考研中,穷举法往往作为起点 ,在此基础上再引入优化(如排序 + 双指针,将复杂度降为 O(nlogn)O(n\log n)O(nlogn))。
(2)递归法(Recursion)
递归是一种"函数直接或间接调用自身 "的思想。其核心在于:把原问题分解为规模更小、形式相同的子问题来求解。
- 关键要素:递归出口(终止条件) + 递归式(自我调用)。
- 优点:描述简洁,符合问题的自然结构。
- 缺点:可能导致栈空间开销大,效率较低。
例子 :
斐波那契数列:
F(n)={0,n=01,n=1F(n−1)+F(n−2),n>1 F(n)= \begin{cases} 0, & n=0 \\ 1, & n=1 \\ F(n-1)+F(n-2), & n>1 \end{cases} F(n)=⎩ ⎨ ⎧0,1,F(n−1)+F(n−2),n=0n=1n>1
直接递归的效率为 O(2n)O(2^n)O(2n),但通过记忆化搜索或动态规划 可降为 O(n)O(n)O(n)。
(3)分治法(Divide and Conquer)
分治法的基本思想是:把一个规模较大的问题分解为若干规模较小但结构相同的子问题,分别求解后再合并结果。
- 步骤:分解(Divide)→ 递归求解(Conquer)→ 合并(Combine)。
- 优点:常能显著降低复杂度;适合处理大规模数据。
- 典型应用:排序(归并排序、快速排序)、搜索(二分查找)、矩阵运算。
例子 :
归并排序:
- 分解:把数组分成左右两半;
- 求解:递归排序左右子数组;
- 合并:将两个有序子数组合并。
其时间复杂度为 O(nlogn)O(n\log n)O(nlogn)。
(4)其它常见思想(简要了解)
除了上述三种,考研中还会涉及一些常见的算法思想:
- 贪心(Greedy):在每一步选择当前最优解,期望最终得到整体最优解。例如最小生成树(Prim、Kruskal)、哈夫曼编码。
- 动态规划(Dynamic Programming):通过保存子问题的解来避免重复计算。例如背包问题、最长公共子序列。
- 回溯法(Backtracking):在搜索过程中尝试构造解,不符合条件时立即回退。例如八皇后问题、数独求解。
- 分支限界法(Branch and Bound):在搜索树中利用上下界估计剪枝,避免无效搜索。
小结
- 穷举法:简单直接,效率低。
- 递归法:问题自我分解,但要注意效率和栈开销。
- 分治法 :分解 + 合并,效率常为 O(nlogn)O(n\log n)O(nlogn)。
- 其它思想(贪心、动态规划、回溯)在后续章节会结合具体数据结构深入讲解。
在考研复习中,理解这些思想能帮助我们在遇到陌生题目时快速找到突破口。