【算法•日更•第四期】深度优先搜索中的剪枝优化(一)

本文深入探讨了深度优先搜索(深搜)的剪枝优化技巧,包括剪枝的本质、原则,以及如何通过可行性剪枝和最优性剪枝提高搜索效率。此外,还介绍了优化搜索顺序、提前排除条件和记忆化等其他优化方法。

▎前置技能:搜索

  既然要学深搜的剪枝优化技巧,那么就先得会深搜了吧,不会的同志戳这里


▎前言

  请想象一下,如果将搜索算法的流程图像化,那么,你会先想到什么呢?

  最贴近的当然是树啦,搜索的流程正是不断试探,如果不行就回溯,就像树一样在每一个节点上试探,到了叶子结点就返回,直到找到正确答案/最优解。如图所示:

  

  可是,这么多的枝条,正确解可只有一条。

  

  于是,我们便想要优化,因为搜索的时间复杂度太高了,往往是指数级的,这对于竞赛而言就是可望而不可及的东西。

▎算法优化:剪枝

『剪枝的本质』

  那么怎么优化呢?

  这是个大问题,如上所述,搜索会经历很多没有必要的地方,那么我们就要适当的减少搜索次数,这就是剪枝优化的本质。

『形象的理解剪枝』

  剪枝这两个字要分成“剪”和“枝”来看,先说“枝”,看到枝,你会想到什么?树枝!正是将如前图所示的一根根树枝;“剪”当然就是把这些枝条剪下来了。

  也就是避免一些不必要的遍历过程,核心就在于如何确定哪些枝条应该保留,哪些枝条应该舍弃,从而写出适当的判断语句。

『剪枝的原则』

  ①正确性:虽然搜索这棵树有许多的枝条需要剪,但是如果剪到了最优解的枝条,那不就得不偿失了,因此在剪的同时要注意是否正确。

  ②准确性:在保证正确性的前提下,我们需要尽可能多的将无用的枝条剪去,当然是剪的越多越快喽。

  ③高效性:在正确性和准确性都做到的时候,往往代码会复杂繁琐起来,判断语句之类的剪枝的运算如果太慢了的话,还不如不剪枝了呢。


 

 ▎怎样剪枝和优化?

  看完上面,是不是一脸懵逼了?那么究竟怎样剪枝,就让小编来梳理一下吧。

『可行性剪枝』

   在搜索时要不断检查当前状态,如果已经确定到达不了正确答案,那么就立刻回溯。

  形象一点:就好比你要回家,如果你是个路痴,到处乱走,如果远远地就望见前面是死胡同,绝对走不到你家,那么你一定会立刻掉头,而不是走过去再掉头。

『最优性剪枝』

  在搜索时,如果当前的状态已经没有已经搜到过的最好的解的状态好了,那么就不要再搜了,立刻回溯。因为即使到达边界,也不可能比当前最好的解好了。

『其他优化方法』

   ①优化搜索顺序

  在同一道题中,搜索顺序不同,搜索树的结构就不同,如果能适当的调整搜索顺序,那么极有可能大幅提高效率。比方说,同一道题正着搜和倒着搜就不一样。

  ②提前排除条件

  在搜索进行前可以切除一些没必要的条件,或者降低搜索规模。怎么搜,如何搜,也是降低时间复杂度的关键。

  ③记忆化

  这就很像动态规划了,类似于图的遍历时会存储下点的状态vis[ ],看看是否已经访问过了,而记忆化就是把每次算出状态保存下来,如果继续遇到,那么就直接调用,如果不采取记忆化,那么很多状态可能会重复计算。

转载于:https://www.cnblogs.com/TFLS-gzr/p/11146165.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值