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