簡體   English   中英

通過成對關系檢查隊列一致性的高效算法

[英]Efficient algorithm to check queue consistency by pairwise relationship

我們有 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<a 則它是有向邊,如果 a=b 則它是無向邊,那么這個問題可能簡化為混合圖中(具有有向或無向邊)中的某種循環檢測,其中可以應用 DFS 或 BFS 等算法。 然而,不僅僅是任何一種循環都會導致不一致,顯然如果循環中的所有邊都是有向的,那么它肯定是不一致的,因為 > 或 < 是可傳遞的。 但是,如果循環中的所有邊都是無向的,則不存在不一致。 或者,如果有些是有向的或有些是無向的,則可能不一致或一致。 例如a>b、b>c、c=a不一致,而a=b、b=c、c>a一致。

任何輸入和想法將不勝感激!

將其視為一個有向圖,如果ab進入之前離開,則從ab有一條弧線,反之亦然。

對於同時在隊列中的節點 (x,y),注意這意味着對於每個頂點 w,一致圖沒有 x < w < y,也沒有 x > w >是的。 通過將這些節點合並為一個節點來反映這一點,保留所有弧。

然后,運行拓撲排序以找到節點的拓撲排序。

當且僅當沒有拓撲排序時才存在不一致。

運行時間:拓撲排序為 O(nodes + edges),即 O(n^2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM