那里's a gap in my knowledge but I'我不确定究竟在哪里 . 可以使用深度优先搜索来完成拓扑排序,如wikipedia explains . 但是我只看到了为树实现的深度优先搜索,其中拓扑排序是针对DAG的 .
-
是树的一种特殊情况,其中边的隐含方向来自根节点
-
是用于拓扑排序的算法,而不是真正做DFS,只有很多类似的东西?
例如,拓扑排序可以处理断开连接的图形,其中DFS无法遍历节点而没有边缘连接它...可以吗?
那里's a gap in my knowledge but I'我不确定究竟在哪里 . 可以使用深度优先搜索来完成拓扑排序,如wikipedia explains . 但是我只看到了为树实现的深度优先搜索,其中拓扑排序是针对DAG的 .
是树的一种特殊情况,其中边的隐含方向来自根节点
是用于拓扑排序的算法,而不是真正做DFS,只有很多类似的东西?
例如,拓扑排序可以处理断开连接的图形,其中DFS无法遍历节点而没有边缘连接它...可以吗?
2 回答
因为当用于拓扑排序时,您在 every 节点上执行DFS . 如果之前的DFS(彩色黑色)已经访问过其中一个孩子 . 然后它已被推入输出向量中,因此您已经完成了依赖性 .
引用您的链接(强调我的):
由于维基百科的文章有点令人困惑(在我看来),我会尝试更好地描述算法:
我们可以轻松计算复杂性:
我们为每个顶点绘制一个白色,灰色和黑色的顶点:
O(V)
我们检查每个顶点一行
5
的顶点颜色:O(V)
我们每行检查一次
10
行的顶点颜色:O(E)
我们将顶点推到每个顶点的
13
行输出:O(V)
所以最后的复杂性是:
O(V+E)
. 这非常有效 .该算法的优势之一是它不需要修改输入图 . 我们可以通过大小在
O(V)
的临时散列表轻松实现着色 . 一些其他拓扑排序算法需要在它们继续时(通过去除边缘)销毁图形 . 如果在排序后仍需要图形,则需要在运行toplogical排序之前复制图形 .您可能希望尝试向图表添加新的“源”节点,并使用有向边连接每个其他节点 . 然后从这个新节点开始搜索/遍历 . 这种方法可能适合也可能不适合您的需求 .