java - unity根號 - 程式語言開根號
好的Java圖形算法庫? (12)
Apache Commons提供公共圖表 。 在http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/下可以查看源代碼。 樣例API使用也在SVN中 。 請參閱https://issues.apache.org/jira/browse/SANDBOX-458獲取已實現算法的列表,並與Jung,GraphT,Prefuse, jBPT
谷歌Guava,如果你只需要好的數據結構。
JGraphT是一個圖表庫,其中實現了許多算法,並且具有(在我的看法中)一個好的圖形模型。 Helloworld示例 。 許可證:LGPL + EPL。
Jung也是一個BSD許可的庫,其數據結構類似於JGraphT。 它提供了佈局算法,目前在JGraphT中缺少。 最近的提交是從2010年開始的,包hep.aida.*
是LGPL(通過jung.sourceforge.net/download.html的acs.lbl.gov/software/colt/license.html )。 這可以防止JUNG被用於ASF和ESF的項目中。 也許應該使用github fork並刪除依賴關係。 github.com/rortian/jung2/commit/…鏡像最後一次CVS提交。 目前的提交似乎刪除了可視化功能。 提交d0fb491c添加一個.gitignore
。
Prefuse使用矩陣結構來存儲圖形,這對於稀疏圖形來說不是有效的。 許可證:BSD
Eclipse Zest內置了圖形佈局算法,可以獨立於SWT使用。 請參閱org.eclipse.zest.layouts.algorithms 。 所使用的圖形結構是Eclipse Draw2d ,其中節點是顯式對象,並且不是通過泛型注入的(就像在Apache Commons Graph,JGraphT和JUNG2中那樣)。
有沒有人對Graph算法的任何Java庫有很好的經驗。 我試過JGraph ,發現它沒問題,而且谷歌裡有很多不同的東西。 有沒有人實際使用生產代碼或推薦?
為了澄清,我沒有尋找一個產生圖形/圖表的庫,我正在尋找一個可以幫助圖形算法的庫,例如最小生成樹,克魯斯卡爾算法節點,邊等等。理想情況下,一個算法/數據很好結構在一個不錯的Java OO API中。
http://incubator.apache.org/hama/是Hadoop上的一個分佈式科學軟件包,用於海量矩陣和圖形數據。
http://neo4j.org/是一個圖形數據庫,其中包含許多圖形算法,並且比大多數內存庫更好地擴展。
也可以確信圖表可以簡單表示為:
class Node {
int value;
List<Node> adj;
}
並實現大多數您自己感興趣的算法。 如果你在圖表的某個練習/學習環節的中間討論這個問題,那麼這是最好的考慮。 ;)
您也可以選擇最常用算法的鄰接矩陣:
class SparseGraph {
int[] nodeValues;
List<Integer>[] edges;
}
或者某些操作的矩陣:
class DenseGraph {
int[] nodeValues;
int[][] edges;
}
可以在這裡找到java中的指令圖算法實現(由Sedgewick等人教授): http://algs4.cs.princeton.edu/code/ : http://algs4.cs.princeton.edu/code/
我在coursera參加這些特殊的算法課程(也是由Sedgewick教授授課)時被介紹給他們:
在我用yWorks玩弄yFiles的一個大學項目中,發現它有非常好的API。
如果你真的在尋找Charting庫而不是Node / Edge Graph庫,我會建議在Big Faceless Graph庫( BFG )上揮霍。 它比JFreeChart更容易使用,看起來更好,運行速度更快,有更多的輸出選項,真的沒有比較。
我不知道我是否會將其稱為生產準備,但有jGABL 。
查看JGraphT是一個非常簡單,功能強大的Java圖形庫,它可以很好地完成,為了消除任何混亂, 它與JGraph不同 。 一些示例代碼 :
UndirectedGraph<String, DefaultEdge> g =
new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);
String v1 = "v1";
String v2 = "v2";
String v3 = "v3";
String v4 = "v4";
// add the vertices
g.addVertex(v1);
g.addVertex(v2);
g.addVertex(v3);
g.addVertex(v4);
// add edges to create a circuit
g.addEdge(v1, v2);
g.addEdge(v2, v3);
g.addEdge(v3, v4);
g.addEdge(v4, v1);
為了可視化,我們的團隊在prefuse取得了一些成功。 我們擴展它來處理建築地板和氣泡圖,並沒有太多抱怨。 他們有一個新的Flex工具包,名為Flare,它使用了非常相似的API。
更新:我不得不同意評論,我們最終編寫了很多自定義功能/解決prefuse限制。 我不能說從頭開始會更好,因為我們能夠通過使用prefuse從第1天展示進步。 另一方面,如果我們再次執行相同的任務,那麼我可能會跳過prefuse,因為我們會更好地理解需求。