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实例 --使用构造者的方式
例如
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();
}