常用的剪枝优化方法
常用的剪枝优化方法
优化搜索顺序
在一些搜索问题中,搜索树的各层次、各结点的分支不是固定的,不同的搜索顺序会产生不同的搜索树形态,其搜索规模也相差甚远,如小猫爬山(按小猫重量递减)和数独问题(找出可填数字最少的位置)。我们要优先选择分支最少的状态结点进行搜索。
排除等效冗余
在搜索过程中,如果我们能判定从搜索树上的当前结点沿着某几条不同分支到达的子树是等效的,那么只需要对其中一条分支进行搜索即可,在”Stick“问题中可以看到对此方法的应用。
可行性剪枝
在搜索过程中,及时对当前状态进行检查,如果发现分支已经无法到达递归边界,就即使执行回溯,不必等到真的到达最后一步才开始回溯。这好比我们在道路上行走时,远远就看到前方是一个死胡同,就应该直接折返原路,而不必到达死胡同正前方,才开始折返。
最优性剪枝
在最优化问题中,如果我们在搜索过程中发现,当前解已经超过了我们所找到的最优解,那么无论采取什么方案,都不可能更新最优解,直接回溯即可。
记忆化(DP)
可以记录每个状态的搜索结果,在进行重复对某个结点计算时,可以以O(1)的时间计算,而不需要再重新计算一遍。这就好比我们在对图DFS时,会对记录过的结点打上访问标记。
在树形搜索树中,每个结点只会经过一次,不需要记忆化,如小猫爬山和数独。