对于深度优先搜索算法的理解

1. dfs尝试走遍可能的路线

所以一看到题目确定要使用dfs来解决的时候首先要在纸上画出简单的例子的树,然后进行简单的模拟调用dfs的过程,通过这颗简单的树可以清楚地了解调用的情况,从简单的例子和自己的总结中看出有多少个平行的状态,并且每个平行状态退回来需要怎么样处理
其中确定了使用dfs处理之后最核心的就是如何处理平行状态,有的题目可能涉及两个平行状态,有的题目可能涉及多个平行状态,像数独就存在多个平行的状态
退回来执行状态说明要尝试另外一可能的情况

2.其中在调用dfs的过程中可能涉及要记录其中的过程,所以我们需要对退回来的状态非常地熟悉,才能对退回来之后的状态进行处理
其中我们经常使用到List,HashMap,StringBuilder,数组这些数据结构来记录其中动态变化的情况
这就涉及到了调用完退回来之后需不需要进行回溯的问题,假如进入下一个平行状态的时候,上一个平行状态对其有影响那么就需要进行回溯,像数组,List这些引用型的变量那么可能需要回溯,但是是否需回溯需要看具体的情况来决定


通常在记录结果的时候在退回到两个平行状态下进行回溯把加入到List或者中的元素给删除掉,以便下一次找到符合的元素进行加入到这些动态的数据结构中,像持有0.5,1面值的人怎么样进行排队才能够满足有足够的钱找的题目就是经典的例子,一返回到这一层然后就把这一层的加入的元素给删除掉(每一次调用退回去的时候都把原来加入的元素给删除掉让动态的数据结构能够保持正常的元素
所以在回溯的过程我们就可以记录下其中的中间过程了,加入元素然后删除元素那么动态的数据结构里面保存的元素就是正确的

3.dfs方法中参数的变化和处理
调用dfs的时候要传入多少个参数需要看具体的情况假如传入进去的参数不够可以增加参数可以更方便地进行处理,每一次调用,参数都在变化,所以总会达到某一个临界的状态,这个时候就需要设计出口来退出这一层的dfs的调用
 

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/83623267