The Boost Graph Library(1)

The boost Graph Library

图是数学上的抽象,对于解决很多类型的计算机科学问题很有用。所以,这些数学上的抽象必须被表示成计算机程序。用于遍历图的标准化通用接口对于图算法和数据结构的复用具有重大的促进作用。部分的boost图库是允许接触图结构但是对外隐藏了具体的实现的通用接口。这是一个开放的接口表现在:对用任何使用该接口的图库或者使用该接口的算法都将和BGL进行交互。BGL提供了一些按照该接口设计的通用目的图类,但并不意味着这些图类是最优的。毫无疑问,对于特定的场合会有更加好的图类。我们认为BGL的主要贡献在于对于这一接口的构思。

    BGL图接口和图组件是通用的,这与C++标准库有相似的意义。在接下来的章节,我们回顾类属编程在标准库中的角色,并与我们如何将类属编程使用在BGL中相比较。

    当然,如果你已经对于类属编程很熟悉,可以跳过该部分!这里是目录表。http://www.boost.org/doc/libs/1_64_0/libs/graph/doc/table_of_contents.html对于分布式内存并行,可以去参考并行BGL部分。

    BGL的源码可以在boost的发行版中找到,可以从该出下载。https://sourceforge.net/projects/boost/files/

如何编译BGL

    BGL是只有头文件的库,不需要使用前构建。唯一的例外是GraphVizinput parser和GraphML parser

    当编译使用GBL的的程序时,在编译时一定不要忘了优化,例如,在使用Microsoft C++编译时选择Release或者在使用GCC编译时选择参数-02 或 -03

genericty in STL (STL库中的泛型编程)

STL通过三种方式支持泛型

算法和数据结构的互操作性

    首先,所有算法在数据结构上都是中立的,允许一个模板函数在很多不同的容器的不同的类上操作。迭代器的概念是解耦合算法和数据结构的关键成分。迭代器技术奖STL标准库的代码规模从O(M*N)缩减到O(M+N),其中M是算法的数量,N是容器的数量。考虑有20个算法和5种数据结构的情况,相比写100个函数和25个函数这有很大的差别。并且这一差别随着算法和数据结构的增长越来越快。

通过函数对象扩展(Extension through Function Objects)

    STL第二种通用性在于,它的算法和容器是可以扩展的。使用函数对象用户可以适配和定制STL。正是这一灵活性使得STL成为解决实际问题的伟大的工具。每一个编程问题有自己的实体和必须被模型化的交互方式。函数对象提供了扩展STL到不同的具体问题域中的机制。

元素类型参数化(Element Type Parameterization)

    STL容器的元素类型是参数化的,这是STL通用的第三种方式。 尽管很重要,这也许是STL中最有趣的一种通用性方式了。泛型编程通常被一个简短的参数列表描述例如:std::list<T>。This hardly scratches the surface!

BGL中的泛型编程

    与STL相同,BGL也有三种实现通用性的方式

算法和数据结构的互操作性

    首先,BGL的图算法写到一个接口,该接口与图数据结构的具体细节抽象分离。和STL相同,BGL使用迭代器来定义接口实现数据结构的遍历。存在三种不同的图遍历模式:遍历图中的所有点,遍历所有边和遍历图的临界结构(从一点到达它的所有邻域)。对于每种不同的遍历方式有不同的迭代器。

    这一泛型界面使得例如breadth first search()模板函数能够工作在多种图数据结构,例如使用指针连接的节点方式和图矩阵方式的数据结构。这一灵活性在图域中显得尤其重要。图数据结构通常是由具体的图应用决定的。传统的方式是,如果程序员想要重用一个算法实现,他必须将图数据转化为图库中所事先提供的图结构。在LEDA,GTL和Stanford Graphbase中就是如此。在Fortran中编写的图算法尤是如此。着严重的限制了图算法的重用。

相反,通过使用external adaptation(http://www.boost.org/doc/libs/1_64_0/libs/graph/doc/leda_conversion.html),用户制定的图数据结构可以在BGL中与泛型图算法共用,外部适配器将数据结构使用新的界面进行包装,而不需要将数据放入迭代器中。通过精细的设计BGL使得该接口适配简单。为了说明这一特性,我们编译了可以将不同的数据结构包装到BGL算法的代码。

通过观察者扩展 

    第二,BGL图算法是可扩展的。BGL介绍了Visitor的概念,Visitor仅仅是一个具有多个方法的函数对象。在图算法中,通常有多个关键的“事件点”,在这些关键点插入用户定义的操作是很有用的。Visitor对象在每个事件点都包含不同的调用方式。具体的事件点和相应的VIsitor方法依赖于具体的算法。点通常包含以下操作:start_vertex(); discover_vertex(); examine_edge()和finish_vertex()。

点和边属性多参数化

    尽管在图中容器的元素类型参数化比STL中容器的参数化更加复杂一些,BGL泛型编程的第三种方式与STL中容器参数类型的参数化类似。因为我们需要将值和图中的点和边同时关联起来。另外,通常每个边和点具有多种属性;这就是多参数化在此处的含义。对于STL std::list<T>类对应于元素类型有一个参数T。相似的,BGL图类对于边和点的属性有相应的模板参数。一个属性具体指明了该属性的类型并且同时为该属性标上了一个区别性的标签。这些标签被用来区分一个点或边可能会有的多重属性。一个联系到一个具体的边或者点的属性值可以经由prooerty map来得到。对于每个属性property map是分离的。

    传统的图库和图结构在需要参数化图属性时出现尴尬。这就是为什么图数据结构一定要能够被用户面向应用自定义的主要原因。

算法

   BGL算法由一系列的核心算法模板(作为泛型算法实现)和一个更大的图算法集合组成。核心算法模板包括:

1.  Breadth First Search

2.  Depth First Search 

3.  Uniform Cost Search

    仅仅算法模式, 不会在图上计算任何有意义的量,它们仅仅是构建图算法的“块”。目前,BGL图算法包括:

  • Dijkstra's Shortest Paths
  • Bellman-Ford Shortest Paths
  • Johnson's All-Pairs Shortest Paths
  • Kruskal's Minimum Spanning Tree
  • Prim's Minimum Spanning Tree
  • Connected Components
  • Strongly Connected Components
  • Dynamic Connected Components (using Disjoint Sets)
  • Topological Sort
  • Transpose
  • Reverse Cuthill Mckee Ordering
  • Smallest Last Vertex Ordering
  • Sequential Vertex Coloring

  目前BGL提供两种图类和一个边列表容器

         

     adjacency_list类是图类实现泛型目标的“瑞士军刀”。因为该类是高度参数化的,所以它可以被在不同的情境中优化:有向图或是无向图;支不支持重边;仅仅高效遍历out-edges或者同时高效遍历in-edges,有过多额外的空间开销时节点的快速增删,等

     adjacency_list类在一个|V|*|V|的矩阵中存储边(N是结点的个数),该矩阵中元素的个数表示图中的边。邻接矩阵非常适合表示非常稠密的图,等,稠密图的边的个数接近 |V|2.

 

The edge_list class is an adaptor that takes any kind of edge iteratorand implements an Edge List Graph

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值