zoukankan      html  css  js  c++  java
  • 深度优先搜索剪枝学习(通俗易懂,用自己的话理解概念)

    一、前言

            刚开始学习搜索算法的时候,它给我的感觉就是加了条件的枚举,特别暴力,将所有的情况列出来找答案。时间效率低到让人难以忍受。用深搜做题更是容易被卡时间,本期我们来学习一下剪枝技巧,对程序优化的一种基本方法,可以极大的提高时间效率。

    二、正文

      1、什么是剪枝?

            简单的来讲就是通过某种判断,避免一些不必要的遍历过程,

            搜索过程可以看做从树根出发,遍历每一根枝条,而将一些不会得出结果的枝条剪掉,被称为剪枝

                

      2、剪枝原则

        (1)正确性

                    意思就是别把带有正确答案的枝条剪掉

        (2)准确性

                    通俗的讲就是尽可能多的剪去不能通向正解的枝条

        (3)高效性

                    为了加强优化效果,就必须调高剪枝判断的准确性,同时造成了判断条件的时间复杂度过高,而判断条件要对所           有枝条进行判断,直接造成了程序效率的下降。

                    然而降低判断难度,就会导致剪枝效率不高。

                    如何解决这个矛盾成为了算法优化的关键。
      3、优化技巧

          (1)优化搜索顺序

                    不同的搜索顺序会产生不同的搜索树形态,其规模大小也相差很远,

                    通俗的讲就是:合理的安排搜索顺序,能更快的搜索到答案,需要的时间空间也会相应的变少。

          (2)排除等效冗余

                    如果搜索路径是等效的,对其中一条搜索就可以了。

          (3)可行性剪枝

                     搜索过程中,对当前的搜索路径进行判断,如果预估到搜索不到答案,及时中断,

                     就比如于你在迷宫里走,走在一个胡同里,看到没有路了,难道你会走到胡同的尽头再返回?

          (4)最优性剪枝

                    在最优解问题中,每次我们搜到一个解,都要拿它与已经搜索到的解进行对比,如果更好,就进行替换,

                    而最优性剪枝就是考虑当前的花费,如果当前的花费已经超出了最优解,直接中断搜索。

          (5)记忆化

                    将每一个状态结果记录下来,当再访问到的时候,不用重新搜索浪费时间,直接调用即可。

    有些东西当时难以理解,后来用到的时候会非常庆幸的说:“还好我学过,不然就惨了”。

  • 相关阅读:
    用spring tool suite插件创建spring boot项目时报An internal error occurred during: "Building UI model". com/google/common/
    Eclipse卸载插件SpringSoource-tool-suite
    spring-tool-suite使用教程,并创建spring配置文件
    MySQL获取指定长度的字符串的函数left(s,n)和right(s,n)
    maven web项目配置log4j,及log4j参数设置
    Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'zoneId' in 'class java.lang.String'
    ifconfig 输出里没有IP地址
    maven web项目生成WebContent或WebRoot目录
    Window 命令行神器:cmder
    Filezilla Download for Linux (deb, rpm, txz, xz, amd64, i386, i486, i586, i686, x86_64)
  • 原文地址:https://www.cnblogs.com/codepeanut/p/12920499.html
Copyright © 2011-2022 走看看