昨天和今天开始做搜索的题目,进度略慢,昨天只做出一道题,今天也只做出一道,而且还都是似懂非懂的状态。发现一个问题,从区间dp开始,一直属于一种水过地皮湿的学习状态,当时会了,再回头一看,其实好多细节问题处理的不好,也就是没有理解透彻。
还是先说一下自己最近看的文章,关于DFS。 (1)算法原理
深度优先搜索即Depth First Search,是图遍历算法的一种。用一句话概括就是:“一直往下走,走不通回头,换条路再走,直到无路可走”。
DFS的具体算法描述为选择一个起始点v作为当前结点,执行如下操作:
a. 访问 当前结点,并且标记该结点已被访问,然后跳转到b;
b. 如果存在一个和 当前结点 相邻并且尚未被访问的结点u,则将u设为 当前结点,继续执行a;
c. 如果不存在这样的u,则进行回溯,回溯的过程就是回退 当前结点;
上述所说的当前结点需要用一个栈来维护,每次访问到的结点入栈,回溯的时候出栈(也可以用递归实现,更加方便易懂)。
( 2) 算法实现
深搜最简单的实现就是递归,写成伪代码如下: def DFS(v):
visited[v] = true
dosomething(v)
for u in adjcent_list[v]:
if visited[u] is false:
DFS(u)
其中dosomething表示访问时具体要干的事情,根据情况而定,并且DFS是允许有返回值的。
另外还在CSDN上看到了一个很好的模板 void dfs()//参数用来表示状态
{
if(到达终点状态)
{ ...//根据题意添加
return;
}
if(越界或者是不合法状态)
return;
if(特殊状态)//剪枝
return ;
for(扩展方式)
{
if(扩展方式所达到状态合法)
{
修改操作;//根据题意来添加标记;
dfs();
(还原标记);
//是否还原标记根据题意
//如果加上(还原标记)就是 回溯法
}
}
}
除此之外,DFS非递归实现涉及图论的内容,也就不做深入了解了。
4.17学习日志
最新推荐文章于 2022-09-30 20:21:27 发布