我获得了一个带有独特源和接收器的有向无环图(DAG)。是否有一种有效的方法来测试此图表所代表的partial order是否为lattice?
换句话说,我需要测试任何两个顶点是否具有唯一最小上界和最大下界。
答案 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)
。使用偏序的属性来减少检查次数。如果v
和a in C(v)
符合要求,b in C(v)
和b < a
符合v
和b
符合{{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通过一个边连接到访问顶点,则不必检查所有子晶格顶点。但是,检查子晶格可能非常困难: - )