zoukankan      html  css  js  c++  java
  • 【算法•日更•第四期】深度优先搜索中的剪枝优化(一)

    ▎前置技能:搜索

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


    ▎前言

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

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

      

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

      

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

    ▎算法优化:剪枝

    『剪枝的本质』

      那么怎么优化呢?

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

    『形象的理解剪枝』

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

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

    『剪枝的原则』

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

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

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


     ▎怎样剪枝和优化?

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

    『可行性剪枝』

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

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

    『最优性剪枝』

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

    『其他优化方法』

       ①优化搜索顺序

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

      ②提前排除条件

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

      ③记忆化

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

  • 相关阅读:
    Visual Studio的多语言加载项 Multi-Language for Visual Studio
    C#(99):文件监视 FileSystemWatcher
    亿图Edraw Project,甘特图
    C#(99):格式化信息、格式化数字、格式化日期
    小程序访问接口由于缺少中间证书访问失败的问题
    微信授权登录“redirect_uri域名与后台配置不一致”,公众号错误码10003
    如何在idea上新建一个springboot项目
    CSS实现网页背景图片自适应全屏的方法
    Umi与Keycloak整合
    Canal帮助MySQL进行数据同步
  • 原文地址:https://www.cnblogs.com/TFLS-gzr/p/11146165.html
Copyright © 2011-2022 走看看