我是新手,也可以提升图库。任何人都可以解释一下property_map背后的实现是什么,以下代码中operator []的时间复杂度是多少?
谢谢!
#include <string>
#include <boost/graph/adjacency_list.hpp>
int main()
{
using namespace boost;
typedef adjacency_list<listS, listS, directedS,
property<vertex_name_t, std::string> > graph_t;
graph_t g;
graph_traits<graph_t>::vertex_descriptor u = add_vertex(g);
property_map<graph_t, vertex_name_t>::type name_map = get(vertex_name, g);
name_map[i] = "Joe";
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
您可以通过向其提供std::map来创建属性地图。因此,时间和空间复杂度可能与基础std::map相同。您可能希望深入了解Sorted Associative Container的STL文档。
答案 1 :(得分:0)
我自己也想知道这一点,并且发现很难说boost :: graph文档没有说明这一点,因为像这样的问题与性能关键算法/应用程序高度相关。
总之,我认为答案是肯定的,它是O(1)时间复杂度。我的推理如下。
由于property map concepts只是概念,因此无法保证复杂性。因此,我们必须查看adjacency_list的属性映射实现,以了解其复杂性。我相信相关代码可以在boost/graph/detail/adjacency_list.hpp找到;搜索“顶点属性地图”。
template <class Graph, class ValueType, class Reference, class Tag>
struct adj_list_vertex_property_map
: public boost::put_get_helper<
Reference,
adj_list_vertex_property_map<Graph, ValueType, Reference, Tag>
>
{
typedef typename Graph::stored_vertex StoredVertex;
typedef ValueType value_type;
typedef Reference reference;
typedef typename Graph::vertex_descriptor key_type;
typedef boost::lvalue_property_map_tag category;
inline adj_list_vertex_property_map(const Graph* = 0, Tag tag = Tag()): m_tag(tag) { }
inline Reference operator[](key_type v) const {
StoredVertex* sv = (StoredVertex*)v;
return get_property_value(sv->m_property, m_tag);
}
inline Reference operator()(key_type v) const {
return this->operator[](v);
}
Tag m_tag;
};
我相信这是一个属性映射,用于使用ListS VertexList类型实例化的adjacency_list的内部属性,如您的示例所示。你可以看到operator []采用了一个Graph :: vertex_descriptor,它看起来像是一个句柄,可能是一个迭代器,并直接访问属性结构而不需要查找sv->m_property
,因此是恒定的时间。当您有多个与每个顶点关联的属性时,对get_property_value()
的调用似乎是属性标记解析;在你的情况下,你只有一个。标签查找通常也是固定时间。
使用具有VecS VertexList类型的属性实例化adjacency_list也会在属性映射查找中提供O(1)时间复杂度。在那里使用的类型似乎是vec_adj_list_vertex_property_map
,而opearator []使用Graph :: vector_descriptor看似是每个顶点的属性向量的索引,因此O(1)。
回想起来,我想我会期望,因为图书馆的工作非常难以保持高效,它将确保这也是高效的。