gpt4 book ai didi

java - 拓扑排序与DFS的区别仅在于当前元素的处理是在递归调用之后完成的

转载 作者:行者123 更新时间:2023-11-30 10:36:38 24 4
gpt4 key购买 nike

拓扑排序与DFS的区别仅在于此,

  • 在拓扑排序的情况下,处理(添加到输出当前元素的堆栈)在递归调用之后完成,而
  • 在 DFS 的情况下,当前元素被处理(即打印或添加到输出队列)在递归调用之前?

这是我的 DFS 代码

public void depthfirstsearchrecursive()
{
for(int i = 0;i<vertices.size();i++)
{
if(vertices.get(i).isVisited == false)
{
vertices.get(i).isVisited = true;
System.out.println(vertices.get(i).name + " ");
depthfirstsearchrecursiveUtil(vertices.get(i));
}
}
}
public void depthfirstsearchrecursiveUtil(Vertex v)
{
for(int i = 0;i<v.neighbors.size();i++)
{
if(v.neighbors.get(i).isVisited == false)
{
v.neighbors.get(i).isVisited = true;
System.out.println(v.neighbors.get(i).name + " ");
depthfirstsearchrecursiveUtil(v.neighbors.get(i));
}
}
}

如您所见,我先打印元素,然后进行递归调用。

这是我的拓扑排序实现

/* topological sort recursive */
public void topologicalsortrecursive()
{
Stack<Vertex> output = new Stack<Vertex>();
for(int i = 0;i<vertices.size();i++)
{
if(vertices.get(i).isVisited == false)
{
vertices.get(i).isVisited = true;
topologicalsortrecursiveDriver(vertices.get(i), output);

// System.out.println(vertices.get(i).name + " ");
output.push(vertices.get(i));
}
}
}
public void topologicalsortrecursiveDriver(Vertex v, Stack<Vertex> output)
{
for(int i = 0;i<v.neighbors.size();i++)
{
if(v.neighbors.get(i).isVisited == false)
{
v.neighbors.get(i).isVisited = true;
topologicalsortrecursiveDriver(v.neighbors.get(i), output);

// System.out.println(v.neighbors.get(i).name + " ");
output.push(v.neighbors.get(i));
}
}
}

这里是处理(入栈,在递归调用之后)

这样说是真的吗

  • DFS 就像一个 PreOrder 遍历,我们在这里处理元素,然后去找它的 child ,而
  • 拓扑排序就像一个反向的后序遍历,我们去哪里先给 child ,然后处理当前元素,通过推送它们堆叠在一起,(这就是为什么我说 reverse Postorder)

最佳答案

不完全是。 DFS 是通用形式。您可以使用它来实现订单前和/或订单后评估。

拓扑排序需要后评估 DFS。

考虑以下代码:

void DFS(Vertex v) {
if (v.hasVisited)
return;
v.hasVisited = true;
doBeforeDepth(v)
for (Vertex u : v.neighbours)
DFS(u);
doAfterDepth(v);
}

void DFS()
{
for (Vertex v : vertices)
DFS(v);
}

您可以使用此 DFS 代码执行拓扑排序。

关于java - 拓扑排序与DFS的区别仅在于当前元素的处理是在递归调用之后完成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40510110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com