列表圖形網絡中的所有用戶給出的距離X
從什麼的距離X
?從一個起始節點或距離X
之間?你能給個例子嗎?這可能會也可能不會像進行BF搜索或運行Dijkstra一樣簡單。
假設您從某個節點開始,並且想要列出所有距離爲X
的節點到起始節點,只需從起始節點運行BFS即可。當您要在隊列中插入一個新節點時,請檢查從起始節點到要插入新節點的節點的距離+要插入新節點的節點的邊的權重新節點是< = X
。如果嚴格低於,則插入新節點,如果相等,則僅打印新節點(並且只有在您也可以將0作爲邊權重時才插入)。
列表給出一個距離X的圖表網絡中的所有用戶和
見上述關係的類型。只要考慮到BFS中的關係類型:如果父類型與嘗試插入隊列的節點的類型不同,請不要插入它。
計算給定類型關係的圖表中網絡上的用戶之間的最短路徑
算法取決於多種因素:
既然你想要簡單,最簡單的是Roy-Floyd和Dijkstra's。
- 使用Roy-Floyd在節點數量上是立方的,所以效率很低。如果您可以負擔運行一次,然後回答O(1)中的每個查詢,請僅使用此值。如果你有能力在內存中保留一個鄰接矩陣,請使用它。
- 如果要保持簡單,Dijkstra的節點數量是二次的,但每次要計算兩個節點之間的距離時都必須運行該節點。如果您想使用Dijkstra's,請使用鄰接列表。
這裏是C實現:Roy-Floyd和Dijkstra_1,Dijkstra_2。您可以通過"<algorithm name> c implementation"
在google上找到很多信息。
編輯:對於18000個節點,Roy-Floyd不存在問題,因爲它是一個鄰接矩陣。這將花費太多的時間來構建和過多的內存。最好的辦法是對每個查詢使用Dijkstra算法,但最好是使用堆來實現Dijkstra - 在我提供的鏈接中,使用堆來找到最小值。如果你在每個查詢上運行經典的Dijkstra,那也可能需要很長時間。
另一個選擇是在每個查詢上使用Bellman-Ford算法,這會爲每個查詢提供O(Nodes*Edges)
運行時間。然而,如果你沒有像維基百科告訴你的那樣執行它,這是一個高估。相反,使用類似於BFS中使用的隊列。每當節點更新其與源的距離時,將該節點重新插入到隊列中。這在實踐中將會非常快,並且也會對負權重起作用。我建議你使用這個或Dijkstra堆,因爲古典Dijkstra可能需要很長時間在18 000個節點上。
計算圖形網絡
最簡單的方法是使用回溯2個用戶之間的最大距離:嘗試所有的可能性,並保持發現的最長路徑。 This is NP-complete,所以不存在多項式解。
如果您有18 000個節點,我不知道任何算法(簡單或其他),對於如此之多的節點可以合理快速地工作。考慮使用貪婪算法對其進行近似。或者也許你的圖有一些你可以利用的特性。例如,它是否是DAG(有向無環圖)?
計算圖形網絡
這意味着你要查找的圖的直徑上最遙遠的連接的用戶。最簡單的方法是找到每個兩個節點之間的距離(所有節點都配對最短路徑 - 在每兩個節點之間運行Roy-Floyd或Dijkstra並以最大距離選擇兩個節點)。
同樣,這對於節點數和邊數很難做到。恐怕在最後兩個問題上你的運氣不好,除非你的圖有特殊的屬性可以被利用。
如果我將圖轉化爲鄰接矩陣來表示鏈接權重和關係類型,您認爲這會有所幫助嗎?執行該算法而不是鏈接列表會更容易嗎?我可以輕鬆實現一個功能,在需要時進行轉換。我這樣說是因爲在閱讀了關於這個主題的幾頁後,我感覺它會更容易些,但我可能是錯的。
不,鄰接矩陣和Roy-Floyd是一個非常糟糕的主意,除非您的應用程序針對超級計算機。
1)距離X,我假設它就像2個節點之間的總重量。 2)我不知道多久,上面的操作是UI菜單中的選項。 3)就像提供的數據樣本中約有18000個頂點和〜520000個鏈接。 4)另外,感謝您的鏈接,我會調查... – 2010-04-15 17:41:54
我更新了我的答案,並且還添加了一些問題:)。 – IVlad 2010-04-15 18:14:03
沒有什麼特別的屬性......好吧,如果你說沒有特別的算法,並且它會花費很長時間才能與通常的算法相比,我不明白這些操作的重點是項目的一部分。去年(由於個人問題,我沒有完成)該項目是相似的,但只有最短的路徑被問到:S – 2010-04-16 02:07:49