簡體   English   中英

增強圖:測試兩個頂點是否相鄰

[英]Boost Graph : Test if two vertices are adjacent

我是新用的C ++ boost庫,尤其是boost圖庫,它需要嘗試編碼一些算法,我通常檢查兩個頂點的鄰接並處理其他圖形概念,如計算圖形不變量。 我所知道的是我們可以使用函數迭代相鄰頂點: adjacent_vertices(u, g)但是我正在尋找一種有效的方法來測試兩個頂點u,v是否相鄰而不進行線性搜索

AdjacencyMatrix概念給出了一個復雜性保證,即edge()函數必須在恆定時間內返回。

要檢查G兩個頂點vw是否相鄰,可以寫入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM