所以基本上,我有一個n乘m的浮點值數組,我試圖找到任何第1行值和第m行值之間的最短路徑。圖中的節點(i, j)
對於任何不處於邊緣(0 < i < n-1)
且不在最後一行(j < m-1)
的節點都有子節點{(i, j+1), (i-1, j+1), i+1, j+1)}
。我正在尋找一種算法來及時解決這個特定的問題。我目前的思路圍繞A *搜索展開,但讓我知道您的想法。有向無環圖的最短路徑
0
A
回答
1
- 列表項
動態的解決方案是O(NM)或O-(M^2)。而且它不能在這下 - 這是任何更好的解決方案的反例。假設您想要在第一行的最左邊的元素和最後一行的最左邊的元素之間找到路徑。讓我們來看看這種形式的矩陣:
10000000000000
11000000000000
11100000000000
11110000000000
11111000000000
11111100000000
11111110000000
11111111000000
11111110000000
11111100000000
11111000000000
11110000000000
11100000000000
11000000000000
10000000000000
「1s」是您可能在從源到目標元素的路徑上經過的元素。 「0」是你無法通過的元素。 O(NM)(實際上,Min(NM,M^2),見下文)。「1」的數目是NM/4次序。因此,讀取矩陣中每個1的算法將具有> = O(NM)的複雜性。
另一方面,不讀取所有「1」的算法將不正確。
證明:讓矩陣中的數字爲權重。選擇一個「1」算法不會讀取。將該1更改爲0.5。該算法對於此輸入失敗,因爲最佳路徑現在通過它從不讀取的元素(因爲它第一次讀取的元素沒有改變,所以這次也讀取相同的元素,除非它是非確定性的,在這種情況下,它是一個隨機的機會是否會起作用,這也使得它不正確)。
但是,良好的O(NM)解決方案應該適用於1000x1000矩陣(不到一秒)。如果您只擊中了必須擊中的元素(例如,在我的示例矩陣中,如果寬度增加到10000000,則無需讀取添加的元素),您可以將其優化爲Min(M^2,MN) )。同樣,如果高度增加到10000000,則沒有M^2順序讀取,因爲您沒有超出矩陣的邊界。然而,正如你所說,這兩個維度都非常大,我猜這沒什麼幫助。
相關問題
- 1. 圖最短路徑無限循環
- 2. 找到有向圖的最短路徑
- 3. 圖最短路徑?
- 4. Python的DFS最短路徑與加權搜索,無向圖
- 5. JGraphT圖最短路徑
- 6. 最短路徑
- 7. DAG最短路徑
- 8. 如何表示一個無權有向圖並找到最短路徑? Java
- 9. 有向無環圖:找到特定節點的所有路徑
- 10. 的Dijkstra最短路徑算法無限循環
- 11. 彩色邊圖中的最短路徑
- 12. 通過加權圖的最短路徑
- 13. 優先圖中的最短路徑
- 14. 圖中最短路徑的數量
- 15. 循環指導中的最短路徑圖
- 16. 有障礙物的最短路徑
- 17. Trie中的最短路徑
- 18. 旅行的最短路徑
- 19. Dag的最短路徑
- 20. 油箱的最短路徑
- 21. 最有效的最短路徑算法非負邊緣圖
- 22. 在有向非循環圖中尋找最長路徑
- 23. 最短路徑不是圖中的路徑
- 24. 帶有networkx的加權圖的所有最短路徑?
- 25. 將循環圖分解爲最短路徑子圖的最小數目
- 26. C# - 最短路徑地圖查找
- 27. 谷歌地圖。找到最短路徑
- 28. 自定義地圖最短路徑
- 29. C#圖最短路徑算法
- 30. 圖中有多個「必須有」節點的最短路徑
李的算法 – nullpotent
浮點值是邊的權重?聽起來像是一個動態編程問題。 –
@AljoshaBre Lee的算法似乎有點慢。我可以看到它是如何工作的,但O(MN)的複雜性並不理想,特別是因爲我會處理M,N> 1000. – null0pointer