簡體   English   中英

帶有 vecS 的 adjacency_list 上的`boost::edge()` 的運行時復雜度是多少?

[英]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.

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