zoukankan      html  css  js  c++  java
  • 第五章作业和学习总结

    引论:回溯法是一种“万金油”的解题方法,其原理在于系统地检索一个问题的所有解(具体形式是检索一颗解空间树的所有叶子节点),再根据相应的实际情况和与前面检索结果对比来删去不可选的解方案(于解空间树中,就是使用剪枝函数来剪去不可选的叶子节点)。与分支限制法不同的是,回溯法对解空间树的遍历是深度优先遍历,遇到叶子节点后返回上一级节点至根节点,这就是回溯法的“回溯”所在。

    一、对回溯法的理解

    回溯法是一种通用的解题方法,它可以有效地解决最优解问题,回溯法的关键在于找到一个结果时,记录下来,并返回上一级节点,寻找另外一个结果。按照这种思想,我们可以将问题抽象为一棵解空间树,把问题的若干个解情况抽象成叶子节点,然后通过遍历解空间树的叶子节点来寻找最优解。但如果不进行剪枝操作,那么回溯法的时间复杂度往往是指数形式的。那么,我们使用回溯法时就要关注寻找剪枝条件,使用剪枝函数来舍弃不符合我们要求的结,以此在得到最优解的情况下降低时间复杂度。

    二、对“子集和”问题的解空间结构和约束函数的说明

    对于问题的子集合,我们可以将其抽象为一棵解空间树。如图,我们假设这是一棵解空间树,那么我们可以将根节点A到B、C节点层视为一个问题的选择,而B、C节点层到D、E、F、G节点层又是一个问题的选择,同时D、E、F、G节点作为解空间树的叶子节点,代表的是问题的解的情况,当我们遍历至叶子节点时,也就得到了其中一种解情况,比如说我们遍历至D节点了,我们得到了一个解,这时我们要回溯至B节点为了遍历到E节点,通过遍历E节点得到另外一个解与之前获得的解做对比,来比较谁才是最优的情况。而约束函数是用来约束我们遍历,因为单纯走完所有分支会消耗大量的时间,造成算法的时间复杂度极高,所以我们需要约束函数来减少我们走的分支的数目。比如说我们走到D节点所需要的条件不符合题目要求,那么我们就要使用约束函数来排除这个节点,减少做不必要的遍历。

    三、本章学习过程中遇到的问题及结对编程的情况

    在学习回溯法的时候,虽然感觉听起来很容易理解,它的理论也感觉非常简单。但实际上编程的时候使用起来却是有难度的,即使老师给出了回溯法三种解空间树的代码模板,使用的时候是要根据题目要求、实际情况来填充模板,如果对回溯法三种解空间情况不熟悉,就会感觉迷茫,无法理解模板内容。因为回溯法往往要是用到递归,而本人的递归思想很差,有时候无法理解回溯法的核心递归算法,这对于解题来说是很大的不利,因此往往需要跟着调试一步一步理解情况并解决程序的bug。

    由于回溯法使用起来不易,所以结对编程的时候我与搭档的联系更加紧密了,我们一起讨论题目是哪一种解空间情况,一起理解回溯中的递归算法,一起设计剪枝函数争取达成题目的时间要求。同时老师出的作业题也是有一定的难度的,所以在结对编程的同时,我们共同商讨解题对策,希望能够通过头脑风暴来理解并使用好回溯算法。

  • 相关阅读:
    java:transient是什么,有什么作用
    如何阅读java源码
    java里面list是引用的好例子
    sort给文件按照大小排序
    HBase的rowkey排序和scan输出顺序
    记录一次事故——idea,sbt,scala
    一个简单的synchronized多线程问题、梳理与思考
    Android TextView文字描边的实现!!
    android中include标签的使用
    layout_weight 的解释及使用
  • 原文地址:https://www.cnblogs.com/besthunterhj/p/12061779.html
Copyright © 2011-2022 走看看