摘要
深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。(来自百度百科)
算法思想
1.标记一切边“未用过”,对任意顶点v,k(v) = 0。令i = 0,v = s。
2.i = i + 1,k(v) = i。
3.若v没有“未用过”的关联边,转5。
4.选一条“未用过”的与v关联的边e = vu,标记e“用过”。若k(u) != 0,转3;否则,f(u) = v,v = u, 转2。
5.若k(v) = 1,停止。
6.v = f(v),转3。
其中,上述中的k(v)称为顶点v的DFS编码;f(v)称为顶点的父,v称为f(v)的子,且以f(v)为起始点、v为终点的有向边称为父子边。
程序的参数说明
G表示图的邻接矩阵
W表示图的边的访问顺序,按照顺序从小到大访问。
K表示图的顶点标号
f表示相应顶点的父亲顶点
MATLAB实现
function [W k f] = DFS3(G)
n = size(G,1);
W = G;
v = 1;
k = zeros(1,n);
f = zeros(1,n);
b = sum(sum(W == 1));
c = sum(k == 0);
d = 1;
if b == 0 & c == 0 & v == 1
d = 0;
end
k(1) = 1;
j = 2;
l = 2;
while d
a = find(W(v,:) == 1);
if isempty(a) & f(v) ~= 0
W(v,f(v)) = l;
l = l + 1;
v = f(v);
else
for i = 1:length(a)
if k(a(i)) == 0
k(a(i)) = j;
j = j + 1;
W(v,a(i)) = l;
l = l + 1;
f(a(i)) = v;
v = a(i);
break;
elseif k(a(i)) ~= 0
W(v,a(i)) = l;
l = l + 1;
end
end
end
b = sum(sum(W));
c = sum(k == 0);
if c == 0 & v == 1
d = 0;
end
end
W;
测试
测试用例:G =
0 1 0 0
0 0 1 1
0 0 0 0
0 0 0 0
测试结果:W =
0 2 0 0
7 0 3 5
0 4 0 0
0 6 0 0
k =
1 2 3 4
f =
0 1 2 2