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


    ▎前置技能:搜索

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


    ▎前言

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

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

      

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

      

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

    ▎算法优化:剪枝

    『剪枝的本质』

      那么怎么优化呢?

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

    『形象的理解剪枝』

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

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

    『剪枝的原则』

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

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

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


     ▎怎样剪枝和优化?

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

    『可行性剪枝』

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

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

    『最优性剪枝』

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

    『其他优化方法』

       ①优化搜索顺序

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

      ②提前排除条件

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

      ③记忆化

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

  • 相关阅读:
    我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操作
    Eclipse 枚举类报错
    eclipse 遇关键字enum编译问题解决
    接口测试框架开发(二):extentreports报告中文乱码问题
    接口测试框架开发(一):rest-Assured_接口返回数据验证
    使用ant运行testng的testng.xml并且使用testng-results.xsl美化结果
    TestNG简单的学习-TestNG运行
    ExtentReports 结合 TestNg 生成自动化 html 报告 (支持多 suite)
    TestNG+ReportNG+Maven优化测试报告
    IDEA+MAVEN+testNG(reportNG)
  • 原文地址:https://www.cnblogs.com/TFLS-gzr/p/11146165.html
Copyright © 2020-2023  润新知