这段代码中boost :: property_map operator [] O(1)的时间复杂度是多少?

时间:2013-05-29 13:00:49

标签: performance boost boost-graph

我是新手,也可以提升图库。任何人都可以解释一下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;
}

2 个答案:

答案 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)。

回想起来,我想我会期望,因为图书馆的工作非常难以保持高效,它将确保这也是高效的。