我正在使用this library在JS中的圖上執行拓撲排序。問題是,在極少數情況下,圖形將包含循環。這些只是結構的一小部分,所以減少一些邊緣不會對最終結果產生相當大的影響。然而,算法出現時就會中斷。什麼是最有效的方式來更新它,所以如果有一個或兩個週期它不會崩潰?如何忽略拓撲排序中的循環?
0
A
回答
7
根據Wikipedia:
甲拓撲順序是可能的,如果且僅當圖沒有向圈,即,如果它是一個有向非循環圖(DAG)。
因此,如果圖形包含循環,則無法找到有效的topsort。我想你使用的庫對輸入圖有一個要求是DAG。因此,該算法因該要求而中斷。
但是,如果您仍想找到一些topsort,您可以對圖進行以下修改之一: 1)構建圖的隨機生成樹。通過這種方式,您可以將圖形修改爲DAG,並且可以在新圖形上運行topsort算法。
2)找到圖的強連通組件(用Tarjan的強連通組件算法)。新圖形是DAG,因此您可以在其上運行topsort算法。
我建議你這兩個選項,因爲至少有幾個JavaScript庫有這些算法(對於1,你可以使用一個構建圖的最小生成樹的庫(MST))。最佳實施,兩種算法都具有線性複雜性。
此外,您可以運行自己修改的DFS算法,該算法會刪除它找到的每個圖形週期的單個邊沿。
1
使離開非循環圖的電弧數量最小化的問題稱爲feedback arc set。鏈接到的拓撲排序使用重複找到度0的頂點並將其移除的算法。 Eades-Lin-Smyth反饋弧集的啓發式算法並不遙遠,可以概括如下。如果存在0度的頂點v,則刪除它,在剩餘圖上進行遞歸,並將v加到訂單上。如果存在度數爲0的頂點v,則刪除它,在殘差圖上遞歸,並將v附加到該順序。否則,讓v有最大的出度減去入度,刪除所有的入弧,並繼續。
相關問題
- 1. 拓撲排序和循環
- 2. 拓撲排序
- 3. 拓撲排序僞
- 4. 拓撲排序Neo4j
- 5. 有向無環圖的拓撲排序
- 6. 使用拓撲排序的打印(未檢測)循環
- 7. 拓撲排序變體
- 8. 穩定拓撲排序
- 9. 拓撲圖排序java
- 10. 拓撲排序asm x86
- 11. 拓撲使用排序DFS
- 12. 如何使用拓撲排序在有向圖中找到一個循環?
- 13. 在Spark GraphX中實現拓撲排序
- 14. 拓撲排序的C++實現
- 15. Dummies的迭代/動態拓撲排序
- 16. 使用合金4.2的拓撲排序
- 17. 排序(拓撲)maven依賴關係
- 18. 拓撲排序(卡恩算法)麻煩
- 19. 圖表:拓撲排序,需要說明
- 20. 使用拓撲排序計算路徑
- 21. 通過圓弧進行拓撲排序
- 22. 如何獲得拓撲排序的所有解決方案
- 23. 如何查找拓撲排序的所有結果
- 24. 如何獲得Gradle子項目的拓撲排序列表?
- 25. 如何拓撲排序這個數據結構
- 26. 如何查找有向圖是否有兩個拓撲排序?
- 27. 排序和拓撲排序有什麼區別?
- 28. PHP排序依賴項數組列表 - 拓撲排序
- 29. 拓撲JavaScript庫
- 30. 拓撲,縮放
嗯,雖然這是一個很好的投票答案,這仍然沒有解決我的問題,因爲我找不到任何這些算法的JavaScript,並尋找方法來實現它導致我一些冗長的文件,我不能理解而不放棄一天或兩天的工作,所以自己做這件事似乎不是一個好主意。任何想法? – MaiaVictor