好的Java图形算法库?

237

有没有人在图算法方面使用过好的Java库?我尝试过JGraph,觉得还可以,而且在Google上有很多不同的库。有没有人在实际生产代码中成功使用并推荐的库呢?

为了澄清,我不是在寻找生成图表/图形的库,我要的是那些有助于处理图算法(如最小生成树、Kruskal算法、节点、边等)的库。最好是带有一些很好的算法/数据结构和优美的Java OO API。

18个回答

114

如果您正在使用JGraph,请尝试一下JGraphT,它专门设计用于算法。其中一个特点就是使用JGraph库进行可视化。该库仍在开发中,但已相当稳定。我曾经分析过JGraphT算法的复杂度。有些算法不是最快的,但如果您需要自己实现并显示图形,则它可能是最好的选择。我非常喜欢使用它的API,在必须快速编写处理图形并随后将其显示出来的应用时它非常有用。


JGraph现在有一个分析包,其中包括一系列的分析函数,http://jgraph.github.com/mxgraph/java/docs/index.html。 - Frodo Baggins

71

摘要:


很多都非常复杂...使用工厂方法等等。我只需要一些简单的东西来为面试做准备。有什么建议吗? - SoftwareSavant
5
如果这些内容太复杂了,那你想要找什么样的工作? - Maytham Fahmi
1
图形算法在这里解释:http://www.geeksforgeeks.org/graph-data-structure-and-algorithms/,并提供简单的代码。 - mosh

41

请看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);

这是一个很棒的演示,位于 https://github.com/jgrapht/jgrapht/wiki/DirectedGraphDemo - Someone Somewhere

37

JUNG 是一种很好的可视化选项,也有相当不错的可用图算法集,包括几种不同的随机图创建、重连等机制。我还发现,在必要时它通常很容易扩展和适应。


包hep.aida.*是LGPL许可证(http://acs.lbl.gov/software/colt/license.html)。它通过colt (http://jung.sourceforge.net/download.html)导入。这会防止JUNG在ASF和ESF的项目中使用。 也许应该使用github分支https://github.com/rortian/jung2并删除该依赖项。https://github.com/rortian/jung2/commit/f4ca0cdcd3312589cbb48de7350b84cbff6067b9正在镜像最后的CVS提交。当前提交似乎删除了可视化功能。 - koppor
自2010年以来就没有发布过,我认为这个项目已经被放弃了。 - Yacino

14
Apache Commons提供commons-graph。您可以在http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/下查看源代码。示例API使用也在SVN中。请参见https://issues.apache.org/jira/browse/SANDBOX-458,其中列出了已实现的算法列表,还与Jung、GraphT、Prefuse、jBPT进行了比较。
如果您需要良好的数据结构,请使用Google Guava

JGraphT是一个图形库,实现了许多算法,并且有一个(在我看来)良好的图形模型。Helloworld Example。许可证:LGPL+EPL。

JUNG2也是一个BSD许可的库,其数据结构类似于JGraphT。它提供了布局算法,而这些算法目前在JGraphT中尚未实现。最近的提交日期为2010年,hep.aida.*包是LGPL许可(通过colt library导入JUNG)。这使得JUNG不能在ASF和ESF项目的框架下使用。也许应该使用github fork并删除该依赖项。Commit f4ca0cd镜像了最后一次CVS提交。当前的提交似乎删除了可视化功能。Commit d0fb491c添加了.gitignore

Prefuse使用矩阵结构存储图形,对于稀疏图形来说不太节省内存。许可证:BSD。 Eclipse Zest具有内置的图形布局算法,可以独立于SWT使用。请参见org.eclipse.zest.layouts.algorithms。所使用的图形结构是Eclipse Draw2d的结构,其中节点是显式对象,而不是通过泛型注入(如Apache Commons Graph、JGraphT和JUNG2中所发生的情况)。

12

http://neo4j.org/ 是一个图形数据库,包含许多图算法,并且比大多数内存库具有更好的可扩展性。


1
有没有任何Neo4J客户端(Java客户端),可以在其中可视化它? - Vishrant

11

在一次大学项目中,我使用了由yWorks提供的 yFiles,并发现它拥有非常好的API。


我曾经在商业软件平台中使用yFiles来可视化数据项之间的相互依赖关系。我并没有真正使用任何图形分析算法,但是你可以检查一下y.algo包是否有你需要的功能: http://www.yworks.com/products/yfiles/doc/api/ - Jonik
3
yFiles不是开源的,但提供商业许可证。 - koppor

9
请查看Blueprints
Blueprints是一个与属性图数据模型相关的接口、实现、 ouplementations 和测试套件的集合。Blueprints类似于JDBC,但用于图形数据库。在TinkerPop开源软件堆栈中,Blueprints作为以下技术的基础技术: Pipes:一种延迟、数据流框架 Gremlin:一种图遍历语言 Frames:一种对象到图形映射器 Furnace:一个图形算法包 Rexster:一个图形服务器

7

7

谢谢分享,我以前从未听说过。你在使用它吗? - Nick Fortescue
1
是的,我正在使用它。我大概4年前开始使用它。到目前为止一切都很好,只是我希望也有一个适用于.NET的端口。 - mr.sverrir
很遗憾,jdsl.org网页现在似乎成为了垃圾邮件页面。 - Ross Judson
1
我已经在原始帖子中更新了链接。谢谢。 - mr.sverrir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接