[英]What is the runtime complexity of `boost::edge()` on an adjacency_list with vecS?
我有一個無向adjacency_list
圖定義如下:
typedef boost::adjacency_list<
boost::vecS,
boost::vecS, boost::undirectedS,
boost::no_property,
boost::property<
boost::edge_weight_t, int, EdgeInfo>
> weighted_graph;
對於我的算法 class,我的程序太慢了,在速度方面只通過了四個測試集之一。 然后我做了一個小改動,使我的程序通過了所有時間限制測試:我停止使用weightmap[boost::edge(u, v, G).first]
。
相反,我在所有邊上循環了一次,並將每個邊的權重存儲在一個 2D 向量中兩次,這樣我就可以用weightvec[u][v]
來查找它。
我找不到任何關於boost::edge()
運行時復雜性的文檔。 我預計它會保持不變,但似乎事實並非如此。 就圖中邊和頂點的數量而言,復雜度是多少?
我考慮是否可能是由於訪問權重屬性 map 而不是,但如果我仍然使用權重圖並存儲邊緣描述符,我仍然會看到加速。
edge(v,u) 搜索邊。 你為什么要這樣做?
如果
Since²您知道邊緣仍然存在,您可能應該:
問:我找不到任何關於 boost::edge() 運行時復雜性的文檔。
我想這是由鄰接表的概念所暗示的(見下文)。 此外,由於有許多影響這一點的泛型類型參數,因此制定起來會很棘手。
問:我預計它會保持不變,但似乎並非如此。
那么,讓我們看看。 鄰接列表是...鄰接列表。 對於圖,它將是一個頂點列表,每個頂點都有一個“鄰接”列表 - 即“邊¹”,由它們的目標頂點表示(數據結構已經暗示了源)。
通過 ( v
, u
) 頂點端點在圖g
中找到一條邊需要:
v
)u
) 由於您選擇vecS
/ vecS
兩者都可以是線性搜索。
幸運的是,因為頂點的vecS
是隨機訪問的,並且元素索引根據定義是 vertex_index它將是 O(1)。 (其中 n 是num_vertices(g)
)和第二個O(m) (其中 m 是頂點的平均出度)。
問:我考慮是否可能是由於訪問權重屬性 map 而不是,但如果我仍然使用權重圖並存儲邊緣描述符,我仍然看到加速。
是的,屬性圖沒有進行搜索:
通過使用其他容器選擇器,可能會獲得一些時間。 但是,憑直覺,我猜測您實際上是在尋找鄰接矩陣甚至隱式圖( 更多)。
¹ 在這種情況下。 在有向情況下,您會說出邊。 Boost 還有一個“birectionalS”表示,其中每個列表條目都包含一個冗余的傳入邊列表,以針對某些類型的算法進行優化
² 這可以從您無條件使用.first 而不檢查搜索結果的事實中推斷出來。 在不存在的邊緣上這樣做可能是UB
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.