guava中 graphs 六
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
guava中 graphs 六
?
介紹
guava的common.graph 是一個圖類型結構的庫,也就是實體和他們之間的關系的工具類庫
?
比如包含網頁和超鏈接,科學家和他們的論文,航站和他們之間的通道,人們和他們呢之間的家族關系。目的是提供
一個共同的和可以擴展的語言能夠使用這些數據。
?
定義
圖包含了點的集合和邊的集合(也叫連接),每個邊連接使得節(jié)點能夠相互連接,邊進入的節(jié)點叫做端點
?
一個邊是有方向的如果定義了一個起點和一個結束點,有方向的邊適合不對稱的結構模型
無方向的邊適合有對稱關系的數據模型;
?
有向的圖它的邊是有向的,無向圖它的邊是無向的
?
例子
graph.addEdege(nodeU,ndeV,edgeUV)
?
nodeU和nodeV是相鄰的
edgeUV 是附屬于節(jié)點nodeU和nodeV
?
如果一個圖是有向的,那么
nodeU是nodeV的前邊的節(jié)點
nodeV是nodeU后面的節(jié)點
edgeUV是nodeU的向外的出去邊
edgeUV是nodeV的進入的邊
nodeU是 edgeUV的起始邊
nodeV是edgeUV的終止邊
如何一個圖是無向圖,那么
nodeU既是nodeV的前驅后繼
nodeV是nodeU的前驅后繼
edgeUV是nodeU的出邊也是入邊
edgeUV是nodeV的出邊和入邊
?
?
這些都是關于一個圖
循環(huán)圖是圖的起點和終點都是同一個點,如果是循環(huán)有向圖,他的出邊和入邊都是附屬節(jié)點,附屬節(jié)點既是起點也是終點
兩個邊是平行的如果連接的是相同的點,并且有相同的順序,反平行邊是有相同的節(jié)點但是是相反的順序
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支持以下幾種類型:
有向圖
非有向圖
節(jié)點
循環(huán)圖
平行非平行邊
有序無序節(jié)點
?
Graph types
有三個最常用的圖接口,通過邊的不同來區(qū)分 Graph,ValueGraph,Network,他們是對等關系,之間不會有等級區(qū)分
這些接口都結成了 SuccessorFunction 和 PredecessorsFunction
這些接口被當作訪問successors和predecessors方法的入參,圖的使用者已經有一個view,并不想去序列化view到common.graph,只是想在一個圖的算法中使用,這種場景就很實用
Graph
是一個最簡單和基礎的圖類型,定義了處理節(jié)點之間低頻地操作,如successors(node),adjacentNodes(node),
inDegree(node),它的節(jié)點是第一個類單獨的獨享,他們和map中的key類似。
圖graph的邊完全是匿名的,他們僅僅在端點定義
Graph<Airport> 這個圖中的邊表示連接兩個機場的一個航班
ValueGraph
ValueGraph 有所有Graph的方法,同時添加了找回特定邊值的方法
valueGraph的邊都有用戶初始化的特殊值,這些值不需要唯一,Graph和ValueGraph的關系與map和set的關系類似
graph的邊是節(jié)點對的集合,valuegraph的邊是短點和值的映射。
ValueGraph 提供了asGraph()方法返回Graph的view,能夠使用graph實例的方法
ValueGraph<Airport,Integer>這個值代表著往返兩個機場需要的時間
?
Network
Network有和Graph相關的所有方法,添加了邊和節(jié)點和邊之間的關系方法,如outEdges(node),incidentNodes(edge),edgesConnectiing(nodeU,nodeV)
network約束邊天然支持平行邊
network支持asGraph()方法返回Network的Graph view
Network<Airport,Flight> 這個network中的邊表示特定的班次從一個機場到另一個機場
?
?
選擇正確的圖類型
?
這三個類型的區(qū)別在于邊的表示不同
graph 類型 邊在節(jié)點之間沒有區(qū)別,沒有自己的數據,每一個節(jié)點對之間最多通過一條邊連接
,邊也沒有其他任何信息
ValueGraph類型中的邊有值,值可以相同也可以不同,邊的值可以附有不同的權重
Network ,節(jié)點的對象是唯一存在的
?
創(chuàng)建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
總結
以上是生活随笔為你收集整理的guava中 graphs 六的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 星云精准测试之用例魔方
- 下一篇: Flutter Live 2018 Fl