簡體   English   中英

Boost圖形庫-具有正好N個邊/頂點的圖形

[英]Boost Graph Library - Graph with exactly N Edges/Vertex

我使用BGL鄰接表描繪了一個非常規則的圖,我確切地知道每個頂點都有N條邊。

這是我的圖形定義:

typedef boost::vecS OutEdgeList;
typedef boost::vecS VertexList;
typedef boost::no_property GraphProperties;
typedef boost::vecS EdgeList;

// Graph definition
typedef boost::adjacency_list<
            OutEdgeList,
            VertexList,
            boost::undirectedS,
            VertexProperties,
            EdgeProperties,
            GraphProperties,
            EdgeList
            > Graph;
Graph g;

我使用vector / vecS來存儲連接,並且我想通過天真地調用boost::add_edge使列表按需要矢量的大小進行調整,其大小是其上一次大小的兩倍。

該圖使用大量RAM(〜12GiB),並且當說N = 9保留16個連接時,我不希望該向量。

有沒有一種內存有效的方法來預先初始化鄰接列表容器,例如

for(auto edgesOfVert:edgesOfVerts)
    edgesOfVert.reserve(N);

還是另一種利用圖形的規律性來節省內存的方法?

感謝您的任何建議!

編輯:作為一種可能的解決方案,我發現了這一點,但我同意sehe的做法,並考慮保留適當數量的有邊的不雅元素,因為它試圖強制使用不是為我需要的特定任務而設計的數據結構

真正的解決方案是不使用boost::adjacency_list 相反,改編自己的數據結構以對所需的Graph概念建模。

例如,Boost Graph庫中有grid_graph<>模型(如果我沒記錯的話)根本不使用任何頂點存儲,並且確實知道提前知道所有節點之間將存在多少條邊。

您仍然可以使用適用於建模圖概念的所有圖算法( grid_graph<>模型grid_graph<> Incidence GraphAdjacency GraphVertex List GraphEdge List GraphBidirectional GraphAdjacency Matrix )。

還可以考慮使圖形內存映射,這樣就不必完全“加載”它,甚至不必在任何給定時間將其裝入RAM中(不過要注意訪問時間,這全都取決於訪問模式和如何布置數據)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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