好的Java图形算法库?[关闭]


237

有没有人对任何适用于Graph算法的Java库有丰富的经验。我已经尝试过JGraph并发现它还可以,并且Google中有很多不同的代码。人们实际上在生产代码中成功使用了哪些东西,或者会推荐什么?

需要澄清的是,我不是在寻找可生成图形/图表的库,而是在寻找一种可用于图形算法的库,例如最小生成树,Kruskal算法的节点,边等。理想情况下,它具有一些良好的算法/数据一个漂亮的Java OO API中的结构。

Answers:


108

如果使用的是JGraph,则应尝试为算法设计的JGraphT。它的功能之一是使用JGraph库进行可视化。它仍在开发中,但相当稳定。我前段时间分析了JGraphT算法的复杂性。其中一些并不是最快的,但是如果您要自己实现它们并且需要显示图形,那么它可能是最佳选择。我真的很喜欢使用它的API,当时我不得不快速编写一个可以处理图形并稍后显示的应用程序。


JGraph现在有一个分析包,其中包含一系列分析功能,jgraph.github.com/mxgraph/java/docs/index.html
David

63

摘要:


其中很多都是极其复杂的...使用工厂方法等等。我只需要一些简单的准备就可以接受面试。有任何想法吗?
SoftwareSavant

4
如果这些复杂的比你在找什么样的工作
maytham-ɯɐɥʇʎɐɯ

1
图算法在这里通过简单的代码解释了geeksforgeeks.org/graph-data-structure-and-algorithms
mosh

40

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


37

JUNG是可视化的不错选择,并且还有相当不错的一组可用图形算法,包括几种用于随机图形创建,重新布线等的不同机制。我还发现,在必要时,它通常很容易扩展和适应。


软件包hep.aida。*是LGPL(acs.lbl.gov/software/colt/license.html)。这是通过柯尔特(jung.sourceforge.net/download.html)导入的。这样可以避免在ASF和ESF的框架下将JUNG用于项目中。也许应该使用github fork github.com/rortian/jung2并删除该依赖项。github.com/rortian/jung2/commit/…正在镜像最后的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示例。许可证:LGPL + EPL。

JUNG2也是BSD许可的库,其数据结构类似于JGraphT。它提供了布局算法,当前在JGraphT中缺少。最新的提交来自2010年,软件包hep.aida.*为LGPL(通过colt库由JUNG导入))。这样可以避免在ASF和ESF的框架下将JUNG用于项目中。也许应该使用github分支并删除该依赖项。提交f4ca0cd正在镜像最后的CVS提交。当前的提交似乎删除了可视化功能。提交d0fb491c添加一个.gitignore

Prefuse使用矩阵结构存储图,对于稀疏图,这种结构对内存的存储效率不高。许可:BSD

Eclipse Zest具有内置的图形布局算法,可以独立于SWT使用。请参阅org.eclipse.zest.layouts.algorithms。所使用的图结构是Eclipse Draw2d之一,其中的节点是显式对象,而不是通过泛型注入的(就像在Apache Commons Graph,JGraphT和JUNG2中那样)。



10

在一个大学项目中,我戏弄了yWorks的yFiles,发现它具有相当不错的API。


我已经使用yFiles可视化数据项之间的相互依赖性(作为商业软件平台的一部分)。我并没有真正使用任何图形分析算法,而是检查y.algo软件包是否满足您的需求:yworks.com/products/yfiles/doc/api
Jonik,2009年

2
yFiles不是开源的,但是提供商业许可证
koppor

9

查看蓝图

蓝图是属性图数据模型的接口,实现,实现和测试套件的集合。蓝图类似于JDBC,但适用于图数据库。在TinkerPop开源软件堆栈中,蓝图充当了以下方面的基础技术:

管道:一个懒惰的数据流框架

格雷姆林:图形遍历语言

框架:对象到图形的映射器

:图形算法包

Rexster:图形服务器



7

如果您喜欢图算法,那么JDSL(Java中的数据结构库)应该足够好-http: //www.cs.brown.edu/cgc/jdsl/


谢谢你,我永远都不会碰到它。你在用吗?
尼克·福特斯库

1
是的,我正在使用它。我大概在4年前开始使用它。到目前为止,我还是很希望.NET也可以使用它。
sverrir先生,

可悲的是,jdsl.org页面现在似乎是垃圾邮件页面。
罗斯·贾德森

1
我已经更新了原始帖子中的链接。谢谢。
mr.sverrir '02

5

为了可视化,我们小组在预涂方面取得了一些成功。我们将其扩展为可以处理建筑地板和气泡图,并且它不会抱怨太多。他们有一个新的Flex工具箱,也称为Flare,它使用非常相似的API。

更新:我必须同意这一评论,我们最终编写了许多自定义功能/围绕预用限制进行工作。我不能说从头开始会更好,因为我们能够通过使用预熔来证明从第一天开始的进步。另一方面,如果我们要对相同的东西进行第二次实现,我可能会跳过预言,因为我们会更好地理解这些要求。


你对自己的想法有何看法?在我的上一份工作中,一个项目开始使用它,但最终重写了90%以上的版本(并进行了优化,并增加了新功能)。
Thomas Owens


5

确信图可以简单地表示为:

class Node {
   int value;
   List<Node> adj;
}

并自己实现大多数您认为有趣的算法。如果您在图的一些实践/学习会议中遇到这个问题,那么这是最好的库。;)

对于大多数常见算法,您也可以选择邻接矩阵:

class SparseGraph {
  int[] nodeValues;
  List<Integer>[] edges;     
}

或某些操作的矩阵:

class DenseGraph {
  int[] nodeValues;
  int[][] edges;     
}




0

如果您实际上是在寻找Charting库而不是Node / Edge Graph库,则建议您使用Big Faceless Graph库(BFG)。它比JFreeChart易于使用,看起来更好,运行更快,具有更多输出选项,实际上没有可比性。


您误解了这个问题:它是关于具有节点和边的图形,而不是具有饼图和条的图形。
amarillion

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.