我需要檢測一個有向圖中是否存在一個循環,類似於拓撲排序,但是我想使用訪問者模式..你有一些想法嗎?我可以使用節點的數組列表,以及邊或其他結構(而不是數組)。在圖中應用訪問者模式來檢測週期
回答
訪客模式真的無法以最純粹的形式實現這樣的事情。
請記住,訪問者模式通常具有訪問對象網絡的「訪問者」,但「訪問者」指向訪問者。由於訪問者是有效的路徑不知道的,它可以防止某些種類的破壞。
from the wikipedia example of the Visitor pattern (in Java)
class Car implements CarElement {
CarElement[] elements;
public Car() {
//create new Array of elements
this.elements = new CarElement[] { new Wheel("front left"),
new Wheel("front right"), new Wheel("back left") ,
new Wheel("back right"), new Body(), new Engine() };
}
public void accept(CarElementVisitor visitor) {
for(CarElement elem : elements) {
elem.accept(visitor);
}
visitor.visit(this);
}
}
注意Car
accept方法。它確保汽車的所有子元素都被覆蓋,封裝了導航,但卻暴露出對整個數據結構應用外部功能的能力。
由於您的代碼需要瞭解數據結構如何連接在一起,因此訪問者模式很不適合該任務。如果訪問者遇到循環數據結構,未來的訪問者將陷入同一循環,而不是訪問某些的數據,從而破壞了Visitor
和VisitAcceptors
之間的合約。
現在,如果您在訪問路徑中沒有遵循「可能循環」的鏈接,您可能會稍微達到目標。您仍然必須確保在訪問路徑中遵循圖形的所有節點,只需通過訪問路徑的其他分支。那麼你的訪問者基本上會成爲一大堆節點,這些節點可能會被未經旅行的反向鏈接所擊中,但是當你實施這樣一個奇怪的解決方案時,你會想知道爲什麼你對訪問者部分感到困擾。
很遺憾,看到這是接受的答案。快速搜索遊客模式,循環,或閱讀聖經:四人幫。完全錯誤。不確定什麼是最純粹的形式。在這種情況下,我會贊成Visitor,原因正是:您構建了一個類型的組合,而不僅僅是隨機數據的集合。 – Rob 2016-05-05 17:31:08
- 1. 檢測週期在圖
- 2. 在圖中檢測週期的條件
- 3. 使用訪問者模式來檢測兩個形狀之間的交集
- 4. 圖:在一個週期中檢測週期
- 5. 使用訪問者模式
- 6. 訪問者模式使用
- 7. 在訪問者模式中檢索類模板的類型
- 8. 在C#中使用'dynamic'來實現訪問者模式
- 9. 使用sql檢測週期
- 10. 試圖實現訪問者模式
- 11. 週期檢測含有多個週期
- 12. 基本的Javascript RegExp來檢測來自谷歌的訪問者
- 13. OCaml訪問者模式
- 14. Java的訪問者模式
- 15. 訪問者模式執行
- 16. .NET C#訪問者模式
- 17. 訪問者模式爲AST
- 18. 訪問者模式與VB.Net
- 19. 在圖中檢測週期(使用三種顏色機制)
- 20. 使用DFS在無向圖中檢測週期
- 21. 使用密碼在neo4j屬性圖中檢測週期
- 22. 在單向鏈表中檢測週期
- 23. 圖算法檢測偶數週期
- 24. 圖:如何使用DFS檢測非直接圖中的週期
- 25. Java的JDT訪問者檢測環路
- 26. 檢測重定向訪問者
- 27. OCaml中的訪問者設計模式
- 28. Scala中的訪問者模式
- 29. 週期檢測算法
- 30. cp:檢測到週期:
向我們展示一些代碼。我不明白訪問者模式與你想解決的問題有什麼關係。 – 2013-03-24 12:23:03
圖形問題通常以DCEL作爲底層數據結構來解決http://en.wikipedia.org/wiki/Doubly_connected_edge_list我也不知道訪問者模式在這裏會有什麼幫助。 – 2013-03-24 12:32:26
我沒有我的代碼..我的圖是一個複合圖,有第一個節點,中間節點和最後一個節點。該圖實際上是記憶相鄰節點和輸入和輸出邊的節點(第一個節點只有輸出邊,最後一個節點只輸入邊)。訪問者必須從第一個節點傳遞到中間節點和檢查週期..對不起,英語不好.. – MI89 2013-03-24 12:51:04