在Java中实现深度优先搜索

时间:2014-10-14 14:34:52

标签: java arrays algorithm depth-first-search

我有一个功课,我需要在java中实现DFS。 这个伪代码用于任务1。

DFS(V,E,s)

foreach u ∈ V
    vis(u) <-- 0
    p[u] <-- NULL

DFS-Visit(u)
    vis(u) <-- 1

work through u here foreach neighbor v to u
if vis(u) = 0
    p[v] = u
DFS-Visit(v)

到目前为止,这就是我所得到的:

package kth.id2010.lab.lab05;

public class DFS {
    private static boolean[] visited;
    private static int[] path;

    static void DFS(int vertecies[], int edges[], int sourceVertex){

        for(int i = 0; i < vertecies.length; i++){
            visited[i] = false;
            dfsVisit(i);
        }

    }
    static void dfsVisit(int u){
        visited[u] = true;
    }
}

因此,如果我认为我已经完成了我需要通过你的邻居对你工作的部分。 而且我并不确定如何做到这一点。

1 个答案:

答案 0 :(得分:0)

好吧,如果它只是通过邻居的迭代,那么这里是一个开始的地方:

DFS意味着您希望在转移到第二个邻居之前一直扩展节点,因此,正如您可能已经教过的那样,这是一种先进先出的方法。实际上,您可以从空Stack对象开始,并使用Stack.push()将第一个节点添加到它。然后你可以做while !Stack.empty(): Stack.pop()。这将删除插入的最后一个元素。然后以递归方式遍历每个元素(在for循环中调用此方法)并重复,直到邻居用完为止,此时只返回任何内容。

现在的问题是这些'元素'是什么?如果您正在推送[start,end]的数组,那么当您弹出它时,您需要反馈到递归的邻居是什么?好吧,如果你仔细想一想,你会发现具有这种表示的节点的邻居将是父节点的end点与任何其他节点的start点匹配的所有节点(这不是没去过。

天真的实现方式,这是一个很好的开始方式,将是以下(伪代码):

while (!Stack.empty()):
    current_node = Stack.pop();
    foreach node in all_nodes:
        if current_node[1] == node[0] and node.not_visited_yet(): Stack.push(node)
    // now we have the neighbors for this current_node pushed into the Stack
    // Note that node.not_visited_yet() could be a function that keeps track of nodes
    // that you already visited somehow (a map from node to boolean perhaps?)

这就是穿越你的树。当然这一切都是遍历,它没有任何意义,但这不是你的问题。例如,如果您希望在到达特定节点时返回字符串,只需将其添加到for循环下方即可。你也可以把它变成一个接收节点和堆栈的函数,而不是使用while循环,而是在你达到最终目标后返回。

function DFS (Stack, current_node): // recursive
    current_node = Stack.pop();
    foreach node in all_nodes:
        if current_node[1] == node[0] and node.not_visited_yet(): Stack.push(node)
    if not Stack.empty:
        next_node = Stack.pop()
        return DFS(Stack, next_node)