guava中 graphs 六

guava中 graphs 六

 

介绍

guava的common.graph 是一个图类型结构的库,也就是实体和他们之间的关系的工具类库

 

比如包含网页和超链接,科学家和他们的论文,航站和他们之间的通道,人们和他们呢之间的家族关系。目的是提供

一个共同的和可以扩展的语言能够使用这些数据。

 

定义

图包含了点的集合和边的集合(也叫连接),每个边连接使得节点能够相互连接,边进入的节点叫做端点

 

一个边是有方向的如果定义了一个起点和一个结束点,有方向的边适合不对称的结构模型

无方向的边适合有对称关系的数据模型;

 

有向的图它的边是有向的,无向图它的边是无向的

 

例子

graph.addEdege(nodeU,ndeV,edgeUV)

 

nodeU和nodeV是相邻的

edgeUV 是附属于节点nodeU和nodeV

 

如果一个图是有向的,那么

nodeU是nodeV的前边的节点

nodeV是nodeU后面的节点

edgeUV是nodeU的向外的出去边

edgeUV是nodeV的进入的边

nodeU是 edgeUV的起始边

nodeV是edgeUV的终止边

如何一个图是无向图,那么

nodeU既是nodeV的前驱后继

nodeV是nodeU的前驱后继

edgeUV是nodeU的出边也是入边

edgeUV是nodeV的出边和入边

 

 

这些都是关于一个图

循环图是图的起点和终点都是同一个点,如果是循环有向图,他的出边和入边都是附属节点,附属节点既是起点也是终点

两个边是平行的如果连接的是相同的点,并且有相同的顺序,反平行边是有相同的节点但是是相反的顺序

eg:

directedGraph.addEdge(nodeU,nodeV,edgeUV_a);

directedGraph.addEdge(nodeU,nodeV,edgeUV_b);

directedGraph.addEdge(nodeV,nodeU,edgeVU);

在directedGraph中edgeUV_a和edgeUV_b是平行的,和edgeVU是反平行的;

 

undirectedGraph.addEdge(nodeU,nodeV,edgeUV_a);

undirectedGraph.addEdge(nodeU,nodeV,edgeUV_b);

undirectedGraph.addEdge(nodeV,nodeU,edgeVU);

在undirectedGraph中edgeUV_a和edgeUV_b是平行的,edgeVU和其他两个也是平行的

 

容量Capabilities

common.graph 关注提供接口方方法使得图能够简单实用,不提供功能性如i/o和可视化,有很有限的工具

 

common.graph支持以下几种类型:

有向图

非有向图

节点

循环图

平行非平行边

有序无序节点

 

Graph types

有三个最常用的图接口,通过边的不同来区分 Graph,ValueGraph,Network,他们是对等关系,之间不会有等级区分

这些接口都结成了 SuccessorFunction 和 PredecessorsFunction

这些接口被当作访问successors和predecessors方法的入参,图的使用者已经有一个view,并不想去序列化view到common.graph,只是想在一个图的算法中使用,这种场景就很实用

Graph

是一个最简单和基础的图类型,定义了处理节点之间低频地操作,如successors(node),adjacentNodes(node),

inDegree(node),它的节点是第一个类单独的独享,他们和map中的key类似。

图graph的边完全是匿名的,他们仅仅在端点定义

Graph<Airport> 这个图中的边表示连接两个机场的一个航班

ValueGraph

ValueGraph 有所有Graph的方法,同时添加了找回特定边值的方法

valueGraph的边都有用户初始化的特殊值,这些值不需要唯一,Graph和ValueGraph的关系与map和set的关系类似

graph的边是节点对的集合,valuegraph的边是短点和值的映射。

ValueGraph 提供了asGraph()方法返回Graph的view,能够使用graph实例的方法

ValueGraph<Airport,Integer>这个值代表着往返两个机场需要的时间

 

Network

Network有和Graph相关的所有方法,添加了边和节点和边之间的关系方法,如outEdges(node),incidentNodes(edge),edgesConnectiing(nodeU,nodeV)

network约束边天然支持平行边

network支持asGraph()方法返回Network的Graph view

Network<Airport,Flight> 这个network中的边表示特定的班次从一个机场到另一个机场

 

 

选择正确的图类型

 

这三个类型的区别在于边的表示不同

graph 类型 边在节点之间没有区别,没有自己的数据,每一个节点对之间最多通过一条边连接

,边也没有其他任何信息

ValueGraph类型中的边有值,值可以相同也可以不同,边的值可以附有不同的权重

Network ,节点的对象是唯一存在的

 

创建graph实例 --使用构造者的方式

例如

@Test

public void test01() {

MutableGraph<Integer> graph = GraphBuilder.undirected().build();

MutableValueGraph<City, Distance> roads = ValueGraphBuilder.directed().build();

MutableNetwork<Webpage, Link> webSnapshot = NetworkBuilder.directed()

.allowsParallelEdges(true)

.nodeOrder(ElementOrder.natural())

.expectedNodeCount(10000)

.expectedEdgeCount(1000000).build();

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/iioschina/blog/2967581

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值