深度优先搜索算法及其MATLAB实现

摘要

深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值