首页 > 编程知识 正文

prim算法图解,搜索与回溯算法详解

时间:2023-05-04 23:45:19 阅读:156549 作者:4907

回溯算法是什么?

回溯法(搜索和回溯法)是选拔搜索法,也叫启发式法,根据选拔条件进行前进搜索,实现目标。 但是,在探索了某一步的时候,如果原来的选择不优秀或者没有达到目标,就返回一步重新选择。 这样,如果不顺利就返回的技术是回溯法,将满足有回溯条件的状态的点称为“回溯点”。

可以解决什么问题?

数组、组合(子集、幂集、字符的全部数组)。 传递值时,对于数组问题,删除一个使用过的元素; 问题是删除前面的所有要素。 给定数组、字符串、特定的规则,搜索迭代试图找到某个解。 二维数组中的DFS搜索(八皇后,黄金矿工,数独)如何理解回溯算法?

为问题建立空间结构

在求解空间结构的基础上进行DFS检索

追溯出口和剪枝点减少无效搜索,在出口保存有效解

如何理解回溯的解空间

回溯算法有两种常见的解空间模型,分别对应数学中的两种暴力思想、组合及排列。 其中的子集问题对应数学中的组合问题。 序列问题对应数学中的序列问题。

然后基于这两个leetcode主题,分析了应该如何构造回溯解空间,其他主题几乎都是基于这两个基础主题变形而来的。

全排列问题分析

案例:排序数组[ 1,2,3 ]的解空间如下,树结构整体可以用以下逻辑来理解。

节点表示当前状态,路径表示当前选择

每个节点代表求解“全阵列”问题的不同阶段,这些阶段由变量的“不同值”表示,这些值可称为状态或路径

必须使用DFS遍历整个搜索树,并在搜索节点返回上一层时重置状态

遍历叶节点将退出。 判断方法是根据现在的深度判断候补要素是否消失

组合问题分析

组合问题的解空间构成

节点表示状态,按现在选择了哪个要素的每个分支,表示要素选择的方式扩展节点时,可以进行如下适当的剪枝

回溯算法的设计思路

全局变量:结果参数设计:保存候选列表。 用于解析空间扩展节点的扩展路径。 用于记录当前节点的列表选择状态条件变量。 结束回溯的判定条件和修剪分枝的判定条件全局变量。 用于存储各过程的解回溯实现:回溯的代码可以主要分为三个部分来制作回溯出口。 找到满足限制条件的解,记录该解并返回。 通常放在函数的入口节点会变宽。 从候选列表中选择适当的元素进行递归求解。 节点扩展阶段需要改变路径和条件变量以适应新节点。 扩展的规则主要有两种数组情况:数组和组合。 必须每次都选择未选择的元素组合。 每次只能向后选择,不能向前选择,从后向前选择时会出现重复问题选择子串。 在这种情况下,与数组和组合不同,两者都是一次选择一个元素。 现在,在这种情况下选择连续的数组,属于组合情况下的特别列。 修剪树枝。 修剪树枝的操作是为了减去解空间中不合适的树枝。 可以在回溯出口处检测到剪枝,也可以在节点扩展时检测到剪枝。算法模板

result=[]//记录最终结果的func backtrack (选择列表、路径、条件变量) ://回溯剪枝//回溯出口指定的解if为结束条件: result.add (通过检查要选择的元素是否符合主题规定的规则(//check ) )选择///更改路径和条件变量值backtrack )的路径)取消选择//路径和条件变量值选择列表是指当前层为DDD参考文献

回溯算法模板

回溯法的解空间表示方法

通过全序列问题理解回溯算法

递归与回溯的区别

《剑指offer》 2.4.3节

回溯法例题

leetcode数组组合编程问题

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。