Dependencies 源删除排序是否总是返回最大循环?

Dependencies 源删除排序是否总是返回最大循环?,dependencies,graph-theory,topological-sort,Dependencies,Graph Theory,Topological Sort,我编写了一个源代码删除算法来对数据库中表之间的一些依赖项进行排序,结果证明我们有一个循环。为简单起见,假设我们有表A、B、C和D。边如下所示: (A, B) (B, A) (B, C) (C, D) (D, A) 正如你所看到的,这里有两个循环。一个在A和B之间,另一个在它们四个之间。这种类型的产品会在最大的周期内窒息吗?或者不一定是这样吗?通过源删除,我想你的意思是在每一步删除一个没有传入边的节点 我认为您要求的是找到图的最大Euler旅行(即具有唯一边的循环,而节点可以重复) 显然,循环中

我编写了一个源代码删除算法来对数据库中表之间的一些依赖项进行排序,结果证明我们有一个循环。为简单起见,假设我们有表A、B、C和D。边如下所示:

(A, B)
(B, A)
(B, C)
(C, D)
(D, A)

正如你所看到的,这里有两个循环。一个在A和B之间,另一个在它们四个之间。这种类型的产品会在最大的周期内窒息吗?或者不一定是这样吗?

通过源删除,我想你的意思是在每一步删除一个没有传入边的节点

我认为您要求的是找到图的最大Euler旅行(即具有唯一边的循环,而节点可以重复)

显然,循环中没有顶点可以删除(循环中没有顶点会有零个传入边),因此该算法当然会保留所有循环(以及最大的循环),但仍然不能帮助您找到它,剩余的边不能保证是任何循环的一部分(我可以很容易地构造一个示例,其中您描述的算法保留了所有边,而最大循环的大小仅为2,因此对查找后者没有太大帮助)

以下是您可以改为这样做的方法:

  • 在图形上执行一个命令
您感兴趣的是识别后边缘,即在遍历中,指回访问节点的祖先(在DFS树中,由首次访问节点的边缘诱导)的边缘。例如,如果DFS堆栈具有节点[A->B->C->D]当你探索D时,你会发现一条边D->B,这是一条后边。每条后边定义了一个循环

更重要的是,由后边引起的周期是图的一个基本循环集合。“一个基本的循环集合”:可以通过基本集的统一和XORIN循环来构造图的“强>全< /强”循环。例如,考虑周期[A1->A2->A3->A1]和[A2--B1--B2-->B3->A2]。[A1->A2->B1->B2->B2->A2->A3->A1]。因为你想要最大循环,你不需要考虑XORs。< /P>

  • 通过联合在一个节点上相交的所有基本循环来构造最大循环(如果您仔细地这样做,这也应该具有线性时间复杂度)

另一方面,如果您需要,这将比线性算法困难得多:)

您的源删除算法(我假设这意味着一次删除一个没有依赖关系的节点,如Dimitris)实际上,算法将删除所有不依赖于循环的节点,剩下的节点要么是循环的一部分,要么依赖于属于循环一部分的节点


这些循环也被称为,如果你用一个节点替换每个循环,你就会有一个DAG。

不知道你在说什么。但是如果你有一个多项式时间算法,它总是给你最长的循环,你已经证明了p=NP。顺便问一下,你是指最长/最大值而不是最大值吗?@傻瓜-可能。我想他们是指最长/最大值同样的事情。:-)我实际上并没有试图找到一种或另一种类型的循环。我实际上更喜欢没有循环(源代码删除确实需要DAG)。然而,我从我编写的一个程序中注意到了这种行为,我只是好奇这种行为是否总是可以预期的。