枚举算法
枚举算法(Enumeration / Brute Force)是指:列举出所有可能的候选解,逐一验证每个候选是否满足问题要求,最终找到正确答案。
- 核心思想:用计算机”不怕重复”的特点,把所有的可能性都试一遍
- 通俗理解:”我不知道密码,但我从0000试到9999″
- 别名:暴力枚举、穷举法
枚举是最笨的方法,也是最可靠的方法——当你想不出其他解法时,枚举就是解法。
枚举算法的三个核心要素
| 要素 | 说明 | 示例 |
|---|---|---|
| 解空间 | 所有可能解的集合 | 0~9999的所有数字 |
| 枚举方式 | 如何遍历解空间 | for循环、递归、位运算 |
| 验证条件 | 判断一个候选是否为解 | 是否满足方程式 |
枚举算法的基本结构
// 枚举算法通用模板
for (枚举所有可能) {
if (验证条件成立) {
记录答案或输出;
}
}
枚举算法的优缺点
| 优点 | 缺点 |
|---|---|
| 思路简单,不容易出错 | 时间复杂度高 |
| 一定能找到正确答案 | 数据量大时无法使用 |
| 不用动脑筋想数学规律 | 可能产生重复解 |
模拟算法
模拟算法(Simulation)是指:按照问题描述的操作步骤,用代码”翻译”整个过程,一步步执行,最终得到结果。
- 核心思想:忠实还原规则,跟着过程走
- 通俗理解:就像按菜谱做菜——菜谱说放盐就放盐,说翻炒就翻炒
- 别名:过程仿真、情景模拟
模拟不需要聪明的数学公式,只需要耐心地把规则翻译成代码。
模拟算法的四个核心要素
| 要素 | 说明 | 示例 |
|---|---|---|
| 状态 | 模拟过程中需要维护的数据 | 当前位置、当前分数、剩余时间 |
| 规则 | 每一步如何改变状态 | 移动规则、计分规则 |
| 初始状态 | 模拟开始时的状态 | 起点(0,0)、分数0 |
| 终止条件 | 模拟何时结束 | 达到指定步数、触发某个条件 |
模拟算法的基本结构
// 模拟算法通用模板
初始化状态;
while (未达到终止条件) {
根据规则更新状态;
步数/时间推进;
}
输出最终状态;
模拟算法的优缺点
| 优点 | 缺点 |
|---|---|
| 思路直接,按步骤写 | 代码可能很长 |
| 不需要复杂数学推导 | 容易遗漏边界条件 |
| 结果可靠(规则正确时) | 效率可能不高 |
模拟 vs 枚举 对比总结
| 维度 | 枚举算法 | 模拟算法 |
|---|---|---|
| 核心问题 | “有哪些可能?” | “过程是怎样的?” |
| 思维方式 | 穷举所有候选 | 复现问题步骤 |
| 关键动作 | 生成 + 验证 | 状态更新 + 规则翻译 |
| 代码结构 | 循环 + if判断 | 循环 + 状态变量 |
| 复杂度来源 | 解空间大小 | 过程步数 |
| 典型问法 | “找出所有满足…” | “执行后结果是什么?” |
一句话总结
枚举是”我试试所有可能”——找答案 模拟是”我跟着规则走一遍”——复现过程 数据范围小用枚举,步骤清晰用模拟,两者可以结合使用。