深度优先搜索剪枝学习(通俗易懂,用自己的话理解概念)

一、前言

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

二、正文

  1、什么是剪枝?

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

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

            

  2、剪枝原则

    (1)正确性

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

    (2)准确性

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

    (3)高效性

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

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

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

      (1)优化搜索顺序

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

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

      (2)排除等效冗余

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

      (3)可行性剪枝

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

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

      (4)最优性剪枝

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

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

      (5)记忆化

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

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

原文地址:https://www.cnblogs.com/codepeanut/p/12920499.html