测试给定DAG是否为格子

时间:2017-05-09 15:50:41

标签: algorithm graph-theory graph-algorithm partial-ordering mathematical-lattices

我获得了一个带有独特源和接收器的有向无环图(DAG)。是否有一种有效的方法来测试此图表所代表的partial order是否为lattice

换句话说,我需要测试任何两个顶点是否具有唯一最小上界和最大下界。

1 个答案:

答案 0 :(得分:2)

我不确定这是最佳方法,但在我看来,值得一试。

意图是至少检查可能的数量的顶点对是否存在满足和连接。使用相同的方法独立检查Meets和join。第一侧(相遇)比另一侧(连接)具有相反的边缘方向。

想法是使用拓扑排序,并检查下一个访问过的顶点以查看已访问过的顶点。为实现这一目标,每个顶点(v)必须存储:

  • 它的前身P(v) = {x; x < v}
  • 它的拓扑索引I(v)

通过以下方式查找两个给定顶点(a, b)是否存在相遇:

P_ab = P(a) intersect P(b)
Find x in P_ab with max I(x).
If |P(x)| = |P_ab| - 1 than x is a meet of a and b.

访问新顶点v时,要检查与v会面的节点是C(v) = all already visited nodes - P(v)。使用偏序的属性来减少检查次数。如果va in C(v)符合要求,b in C(v)b < a符合vb符合{{1} }和v)。有了它,就可以检查a中具有未解析的外边(C(v))的顶点。可能甚至不需要检查U(v)中的所有顶点,因为它们中的一些可以被排序。更容易按索引(U(v))降序从U(v)检查顶点。

会面的检查次数为I(x),可能远小于|V| * width(G)

存在内存问题,因为每个顶点都必须存储它的前辈集。这可能是|V|^2空间。这可以减少,因为如果访问的顶点|V|^2不再在x中,则只能检查大小P(x)。因此,对于这些顶点,可以删除U(v)并存储P(x)

请注意,如果下一个访问过的顶点只有一个在边缘,则不需要测试它以便在|P(x)|中与顶点相遇。这种推理甚至可以扩展到如果su-blattice通过一个边连接到访问顶点,则不必检查所有子晶格顶点。但是,检查子晶格可能非常困难: - )