概述
回溯算法的效率不是很高,就起本质而言,属于穷举,不同的是提供了一个穷举的思路:回溯。回溯算法也称试探法,基本思想是:从一条路往前走,能进则进。
what
回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
1.找到一个可能存在的正确的答案
2.在尝试了所有可能的分步方法后宣告该问题没有答案
特点
深度搜索,确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。
剪枝,回溯法是一个即带有系统性又带有跳跃性的搜索算法,当节点肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯,剪枝使得回溯算法效率提高了。
有去有回,去按照深度遍历,回体现了回溯的思想。
C# Demo
对于回溯的理解,是在代码的基础上不断加深的,分享一下自己写的代码,希望大家可以拍砖斧正~
#region 回溯+贪心--刘雅雯--2017年9月26日21:36:29
/// <summary>
/// 从K节点扩展下去,计算得到的最大价值
/// </summary>
/// <param name="values"></param>
/// <param name="weight"></param>
/// <param name="VM"></param>
/// <param name="n"></param>
/// <param name="W"></param>