我们能否以将 DFS 应用于新图将导致与在第一个图上应用 BFS 相同的遍历顺序的方式转换图?
Posted
技术标签:
【中文标题】我们能否以将 DFS 应用于新图将导致与在第一个图上应用 BFS 相同的遍历顺序的方式转换图?【英文标题】:Can we transform a graph in a way that applying DFS to the new graph would result in the same traversal order as applying BFS on the first graph? 【发布时间】:2022-01-21 17:00:52 【问题描述】:这个问题纯属理论。
假设您有一个图 A、一个深度优先搜索算法和一个广度优先搜索,它们都在图上搜索与给定谓词匹配的节点,并按照在图遍历期间遇到的顺序返回匹配节点列表。
我的问题是:
是否存在 图 B,这样对它应用 DFS 算法 会得到相同的结果,就像我们应用 广度优先搜索算法到图A?
IE BFS算法在图A上返回的匹配节点列表与应用于图B的DFS算法返回的节点列表(相同顺序的相同节点)相同。
如果是这样,什么算法能够将图 A 转换为图 B?
如果这样的图 B 通常不存在,对于任何图 A,如果我们对允许的图 A 施加限制,是否存在? (比如没有循环,比如是一棵树)
PS:这样表述的问题让我想到了函子的说明,因此想到了范畴论标签。
编辑: 现在我已经看到我的问题存在一个简单的解决方案,我意识到我的实际问题是在 infinite graphs 的特定情况下。我认为询问是否有解决方案一般会涵盖它,但那是在我看到似乎只适用于有限图的链表解决方案之前。
【问题讨论】:
不幸的是,答案不仅仅是“是的,有”。这是“当然有”。 我有一张图表。它对节点 v1、v2、.... vn 的 BFS 排序。构造一个以 v1, v2, ... v2 作为其深度优先排序的图是微不足道的。这个问题还有其他原因吗? @Frank Yellin 我原以为解决方案不是链表,而是看起来更像一棵树的东西。这让我意识到我想问的问题实际上是在无限图的特定情况下。虽然是理论上的,但它源于我尝试在约束下(只是一个学习玩具)编程适合我指定的问题的东西,其主要目标正是询问什么是可能的,什么不是。 @Frank Yellin 我还(错误地)认为,这次是实际应用程序真正问题的另一个实例。问题是:给定一个数据结构(dsc)A,它作为算法 A 的输入。您决定使用任意算法 C 将 dsc A 转换为 dsc B。C 的唯一约束是它应该是可逆的(即信息被保留)。你能否根据 dsc A、algo A 和 algo C 生成一个算法 B,以便在 dsc B 上应用算法 B 产生与在 dsc A 上应用算法 A 相同的结果? @Frank Yellin 当遇到一个我想“手动”平衡的不平衡尝试时,我问自己这个问题。我希望这个问题的解决方案能给我们一种方法来机械地编写具有不同复杂性特征的现有算法的不同版本,即不同的 tims 与内存权衡。如果可能的话,这种情况的用例将是优化编译器,以执行具有最佳复杂性特征的程序片段,从而在全局范围内最大化整体程序执行。 【参考方案1】:让我们把 A 排除在外,因为唯一有趣的是 A 的广度优先遍历中的节点序列:v1, v2, v3, ..., vn.
那么问题来了,我们能否创建一个图,其深度优先遍历必须恰好是序列v1, v2, v3, ..., vn?显然我们可以:图的节点是 v1, v2, v 3, …, vn 及其边是 vi , vi+1> for i ∈ 1, ..., n−1 (与广度优先遍历相同)
另一个简单的算法是获取任何具有 n 个节点的图 B',并对其进行深度优先遍历。说结果是序列 u1, u2, u3, ..., un。然后通过将每个 ui 重命名为 v 从 B' 构造图 B i,会有改变广度优先遍历的效果来匹配A的广度优先遍历。
【讨论】:
这不是我真正想要的,但它有效,并向我表明我没有考虑到这一点。我想我们可以将这个链表转换成一个更平衡的二叉树,这样 DFS 就不会简化为简单地迭代线性列表。 @WhiteMist:第二个示例只是重命名所有节点,适用于任何形状的图形。所以你不能仅仅限制形状就摆脱问题。我了解您正在寻找深度优先和广度优先遍历之间的某种关系(或非关系),但我认为节点标签是一个死胡同。 另外,我认为使用节点重命名算法生成 B 没有明显的障碍,即使 A 是无限的.尽管在无限图中可能存在一些未说明的节点标签属性,这会使这一点变得不重要。以上是关于我们能否以将 DFS 应用于新图将导致与在第一个图上应用 BFS 相同的遍历顺序的方式转换图?的主要内容,如果未能解决你的问题,请参考以下文章