[英]Boost Graph : Test if two vertices are adjacent
我是新用的C ++ boost庫,尤其是boost圖庫,它需要嘗試編碼一些算法,我通常檢查兩個頂點的鄰接並處理其他圖形概念,如計算圖形不變量。 我所知道的是我們可以使用函數迭代相鄰頂點: adjacent_vertices(u, g)
但是我正在尋找一種有效的方法來測試兩個頂點u,v是否相鄰而不進行線性搜索
AdjacencyMatrix概念給出了一個復雜性保證,即edge()
函數必須在恆定時間內返回。
要檢查G
兩個頂點v
和w
是否相鄰,可以寫入edge(v, w, G).second
,因為該函數返回一個對,其中第二個值指示邊是否存在。
edge()
函數也用於其他圖形表示。 下面的圖表顯示了不同的表示與檢查頂點鄰接性能的比較:
這是用於生成此繪圖數據的代碼 。 每個數據點是100個中密度隨機圖,每個圖有100個隨機邊緣檢查。 注意對數y軸。
什么是最佳選擇最終取決於您的特定應用,因為對於其他操作,結構的速度順序是不同的。 換句話說,避免過早優化。
BGL是一個高度通用的庫。 您可以調整大多數數據結構以與其算法一起使用。
您可以更改邊緣容器。 你沒有提到它,但我假設你一直在關注boost::adjacency_list
的接口/復雜性保證。
實際上,即使您使用setS
作為邊緣容器選擇器,邊緣成員資格測試也將是O(n)。 這主要是因為鄰接列表存儲每個頂點的傳出邊。 所以在最壞的情況下,每個頂點最多包含一個輸出邊緣,搜索實際上是O(n)[1]
在這種情況下,您只需要選擇另一個圖形實現。
Graph Concepts的文檔頁面是一個很好的起點,可以找出預期的概念。 以及哪些模型提供這些概念。
在最壞的情況下,您可以調整數據結構以用於Boost Graph算法。 例如,您可以將所有邊存儲在簡單的std::[unordered_]set<std::pair<VID, VID> >
並對其進行調整以對EdgeListGraph
概念建模。
這樣你就可以進行高效的查找。
[1]當然這也意味着,在最好的情況下,搜索是你的set實現提供的任何東西:O(log n)因為所有邊都可以來自同一個頂點...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.