0x23 剪枝

0x23 剪枝

剪枝,就是减少搜索树规模,尽早排除搜索树中不必要的分支的一种手段。形象地看,就好像剪掉了搜索树的枝条,故被称为"剪枝"。在深度优先搜索中,有以下几类常见的剪枝方法:

1.优化搜索顺序

在一些搜索问题中,搜索树的各个层次、各个分支之间的顺序不是固定的。不同的搜索顺序会产生不同的搜索树形态,其规模大小也相差甚远。例如:在数独问题中,优先搜索"能填的合法数字最少的位置。

2.排除等效冗余

在搜索过程中,如果我们能够判定从搜索树的当前节点上沿着某几条不同分支到达的子树是等效的,那么只需要对其中的一条分支执行搜索。

初学者一定要避免重叠、混淆"层次"与"分支",避免遍历若干颗覆盖同一状态空间的等效搜索树。

3.可行性剪枝

在搜索过程中,及时对当前状态进行检查,如果发现分支已经无法到达递归边界,就执行回溯。这就好比我们在道路上行走时,远远看到前方是一个死胡同,就应该立即折返绕路,而不是走到路的尽头再返回。

某些题目条件的范围限制是一个区间,此时可行性剪枝也被称为"上下界剪枝"。

4.最优性剪枝

在最优化问题的搜索过程中,如果当前花费的代价超过了当前搜索到的最优解,那么无论采取多么优秀的策略到达递归边界,都不可能更新答案。此时可以停止对当前分支的搜索,执行回溯。

5.记忆化

可以记录每个状态的搜索结果,在重复遍历一个状态时直接检索并返回。这就好比我们对图进行深度优先遍历时,标记一个节点是否已经被访问过。

相关推荐
Fuyo_11194 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan5 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..5 小时前
【C语言】猜数字游戏
c语言·算法·游戏
LabVIEW开发6 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 2296 小时前
C++算法(六)
开发语言·c++·算法
Dumbness7 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka7 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
UIU1147 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
旖旎夜光7 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由20208 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi