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

▎前置技能:搜索

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


▎前言

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

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

  

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

  

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

▎算法优化:剪枝

『剪枝的本质』

  那么怎么优化呢?

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

『形象的理解剪枝』

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

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

『剪枝的原则』

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

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

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


 

 ▎怎样剪枝和优化?

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

『可行性剪枝』

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

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

『最优性剪枝』

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

『其他优化方法』

   ①优化搜索顺序

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

  ②提前排除条件

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

  ③记忆化

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

posted @ 2019-07-07 14:14  c1714-gzr  阅读(502)  评论(0编辑  收藏  举报