我想知道属性映射是如何在提升图中实现的。例如,
我的顶点和边属性定义如下:
//vertex property:-->
struct NodeInfo { int a , b , c; }; //actual bundled property
struct NodeInfoPropertyTag { // tag and kind (as in boost documentation)
typedef boost::vertex_property_tag kind;
static std::size_t const num;
};
std::size_t const NodeInfoPropertyTag::num = (std::size_t) &NodeInfoPropertyTag::num;
//typedef the Vertex Property
typedef boost::property <NodeInfoPropertyTag, NodeInfo> NodeProperty;
//Similar fashion for Edge Property --> some property for each edge of graph.
typedef boost::property <EdgeInfoPropertyTag, EdgeInfo> EdgeProperty;
我的图表的类型定义如下:
typedef boost::adjacency_list <vecS, vecS, undirectedS, NodeProperty, EdgeProperty, no_property, listS> Graph_t;
现在,在使用上面的 typedef 初始化图 G 时,我可以使用以下属性将属性分配给顶点和边
for eg:
Graph_t G;
typedef graph_traits<Graph_t>::vertex_descriptor vd_t;
// edge_descriptor ed_t;
NodeInfo ninfo1, ninfo2; //put some values in ninfo
vd_t v = add_vertex (ninfo1, G) //add a vertex in G with property ninfo1
vd_t u = add_vertex (ninfo2, G) //add a vertex in G with property ninfo2
EdgeInfo einfo; //initialize edgeinfo for edge property
add_edge (u, v, einfo, G ) edge (u, v) with property einfo is added in G
要访问任何顶点的节点属性,我可以使用以下两种方法中的任何一种:
//method 1: direct method: using Tags
// for a vertex "v" --> get()
NodInfo info = boost::get (NodeInfoPropertyTag(), G, v) //get v's property
//modify info
//put the modified property
put (NodeInfoPropertyTag(), G, v, info) // (put in G, key = v, value = info )
//method 2 : using property maps.
//Edge Map and Node Map
typedef typename boost::property_map <Graph_t, EdgeInfoPropertyTag>::type EdgeMap;
typedef typename boost::property_map <Graph_t, NodeInfoPropertyTag>::type NodeMap;
//edge e --> get
EdgeInfo einfo = boost::get (EdgeMap, e)
//modify einfo
//put
put (EdgeMap, e, einfo) //put in the EdgeMap key = e, value = einfo
现在,这两个操作本质上是相同的:即使用
//former is translated to the latter -->
get(NodeInfoPropertyTag(), G, "key") is equivalent to get (NodeMap, "key")
我的问题是:
- 这些属性如何存储在 Graph 对象中。
- 它是否存储在诸如 std::map 之类的地图中?或一些清单?或一些高效的类似地图的数据结构。
- 如果是这样,我如何将底层数据结构修改为 std::unordered_map 甚至
concurrent_hashmap 或 boost::vector_property_map ?
笔记:
我不确定我可以使用 vector_prop_map (此处),但我真的很想使用它,以便
顶点 id 成为向量索引并且更高效 --> 但它可能会导致边缘问题
我的图将包含一百万个顶点和许多边,以这种方式搜索
std::map 仍然是 log(n) 本身,但我希望可移植性改变
底层数据结构,以便我可以使用 unordered_map /并发_hashmap
我需要并发哈希图(来自英特尔TBB),因为我要并行化我的算法
因此希望同时访问属性映射,这将是
由线程修改。
请建议是否可以控制和修改boost graph中的此类底层数据结构来存储边和顶点属性。