通过成对关系检查队列一致性的高效算法

问题描述

我们有n个物品进出队列,他们可以随时进出。我们拥有的信息是,对于每一对 (a,b),我们知道 1) a 在 b 进入之前离开队列,反之亦然; 2) 在某个时刻,a 和 b 同时在队列中。或 3) 根本没有信息。假设我们给出了所有(n 选择 2)对的成对信息列表,找到一个 O(n^2) 算法来确定信息中是否存在任何不一致。

例如a在b进入之前离开(为简单起见,写成a>b),b>c,c=a是不一致的,因为没有a,b,c进入和离开的可能时间线使所有三个语句都为真的队列。我想把它变成一个图横向问题,每个项目作为一个顶点,成对关系作为一条边,如果 a>b 或 b 或 b、b>c、c=a是不一致的,而a=b、b=c、c>a是一致的。

任何意见和想法将不胜感激!

解决方法

将此视为一个有向图,如果 ab 进入之前离开,则从 ab 有一条弧线,反之亦然。

对于同时在队列中的节点 (x,y),请注意,这意味着对于每个顶点 w,一致图没有 x w > y。通过将这些节点合并为一个节点来反映这一点,保留所有弧。

然后,运行 topological sort 以查找节点的拓扑排序。

当且仅当没有拓扑排序时才存在不一致。

运行时间:拓扑排序为 O(nodes + edge) 即 O(n^2)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...