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

Posted

技术标签:

【中文标题】好的Java图算法库? [关闭]【英文标题】:Good Java graph algorithm library? [closed] 【发布时间】:2010-09-08 06:30:35 【问题描述】:

有没有人对任何用于图形算法的 Java 库有很好的经验。我试过JGraph 发现没问题,而且google 里有很多不同的。是否有人实际在生产代码中成功使用或推荐使用?

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

【问题讨论】:

【参考方案1】:

在可视化方面,我们小组在prefuse 方面取得了一些成功。我们将它扩展到处理建筑底板和气泡图,它并没有太多抱怨。他们也有一个名为 Flare 的新 Flex 工具包,它使用非常相似的 API。

更新: 我不得不同意评论,我们最终编写了很多自定义功能/解决了前置限制。我不能说从头开始会更好,因为我们能够通过使用 prefuse 从第一天开始展示进步。另一方面,如果我们要对相同的东西进行第二次实现,我可能会跳过前言,因为我们会更好地理解需求。

【讨论】:

您的个人想法是什么?在我的上一份工作中,一个项目开始使用它,但最终得到了 90% 以上的重写(并优化,添加了新功能)版本的 prefuse。【参考方案2】:

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

【讨论】:

我使用 yFiles 来可视化数据项之间的相互依赖关系(作为商业软件平台的一部分)。我并没有真正使用任何图形分析算法,但请检查 y.algo 包是否有您需要的内容:yworks.com/products/yfiles/doc/api yFiles 不是开源的,但提供商业许可【参考方案3】:

如果您实际上是在寻找图表库而不是节点/边缘图形库,我建议您购买 Big Faceless Graph 库 (BFG)。它比 JFreeChart 更容易使用,看起来更好,运行更快,输出选项更多,真的没有可比性。

【讨论】:

你误解了这个问题:它是关于有节点和边的图,而不是有饼图和条形图的那种。【参考方案4】:

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

【讨论】:

包 hep.aida.* 是 LGPL (acs.lbl.gov/software/colt/license.html)。这是通过 colt (jung.sourceforge.net/download.html) 导入的。这可以防止 JUNG 被用于 ASF 和 ESF 旗下的项目。也许应该使用 github fork github.com/rortian/jung2 并删除该依赖项。 github.com/rortian/jung2/commit/… 正在镜像最后一次 CVS 提交。当前的提交似乎删除了可视化功能。 自2010年以来没有发布过,我认为这个项目已经放弃了【参考方案5】:

我不知道我是否称它为生产就绪,但有jGABL。

【讨论】:

【参考方案6】:

查看JGraphT 了解一个非常简单且功能强大的 Java 图形库,它做得非常好,为了消除任何混淆,与 JGraph 不同。一些sample code:

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

【讨论】:

这是一个很棒的演示 github.com/jgrapht/jgrapht/wiki/DirectedGraphDemo【参考方案7】:

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

【讨论】:

JGraph 现在确实有一个分析包,其中包括一系列分析函数,jgraph.github.com/mxgraph/java/docs/index.html。【参考方案8】:

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

【讨论】:

谢谢你,我从来没有遇到过。你在用吗? 是的,我正在使用它。我可能在 4 年前开始使用它。到目前为止一切顺利,我只是希望也有一个用于 .NET 的端口。 很遗憾,jdsl.org 页面现在似乎是垃圾页面。 我已经更新了原帖中的链接。谢谢。【参考方案9】:

总结:

JGraphT 如果您对数据结构和算法更感兴趣。 JGraph 如果您的主要关注点是可视化。 Jung、yWorks 和 BFG 是人们尝试使用的其他东西。 Prefuse 是不行的,因为必须重写大部分内容。 Google Guava 如果您只需要好的数据结构。 Apache Commons Graph。目前处于休眠状态,但提供了许多算法的实现。请参阅https://issues.apache.org/jira/browse/SANDBOX-458 获取已实现算法的列表,并与 Jung、GraphT、Prefuse、jBPT 进行比较

【讨论】:

其中很多都非常复杂......使用工厂方法等等。我只需要一些简单的东西来准备面试。有什么想法吗? 如果这些比你要找的工作复杂 图算法在这里geeksforgeeks.org/graph-data-structure-and-algorithms用简单的代码解释【参考方案10】:

试试 Annas,它是一个易于掌握的开源图形包

http://annas.googlecode.com

【讨论】:

【参考方案11】:

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

【讨论】:

有Neo4J客户端(java客户端)可以可视化吗?【参考方案12】:

http://incubator.apache.org/hama/ 是 Hadoop 上用于海量矩阵和图形数据的分布式科学包。

【讨论】:

【参考方案13】:

来自http://mmengineer.blogspot.com/2009/10/java-graph-floyd-class.html的JGraph

提供强大的软件来处理图形(直接或非直接)。还生成 Graphivz 代码,可以看到图形表示。您可以将自己的代码算法打包,例如:回溯代码。该软件包提供了一些算法:Dijkstra、回溯最小路径成本等。

【讨论】:

【参考方案14】:

Apache Commons 提供commons-graph。在http://svn.apache.org/viewvc/commons/sandbox/graph/trunk/ 下可以查看源代码。示例 API 用法也是 in the 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,其中 is imported by JUNG)。这可以防止 JUNG 被用于 ASF 和 ESF 旗下的项目。也许应该使用github fork 并删除该依赖项。 Commit f4ca0cd 正在镜像最后一次 CVS 提交。当前的提交似乎删除了可视化功能。 Commit d0fb491c 添加.gitignore

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

Eclipse Zest 内置了图形布局算法,可以独立于 SWT 使用。见org.eclipse.zest.layouts.algorithms。使用的图形结构是 Eclipse Draw2d 之一,其中 Nodes are explicit objects 不是通过泛型注入的(就像在 Apache Commons Graph、JGraphT 和 JUNG2 中发生的那样)。

【讨论】:

【参考方案15】:

如果您需要性能,可以看看 Grph。该库由法国大学和 CNRS/Inria 开发。

http://www.i3s.unice.fr/~hogie/grph/

项目处于活跃状态,提供响应式支持!

【讨论】:

【参考方案16】:

可以在此处找到 java 中的教学图算法实现(由 Sedgewick 等人教授): http://algs4.cs.princeton.edu/code/

我是在参加 coursera 上这些出色的算法课程时认识的(也是由 Sedgewick 教授教授的):

https://www.coursera.org/course/algs4partI

https://www.coursera.org/course/algs4partII

【讨论】:

【参考方案17】:

相信 Graph 可以简单地表示为:

class Node 
   int value;
   List<Node> adj;

并自己实现大多数您觉得有趣的算法。如果您在有关图表的一些练习/学习会议中遇到这个问题,那么这是要考虑的最佳库。 ;)

对于最常见的算法,您也可以选择邻接矩阵:

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

或一些操作的矩阵:

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

【讨论】:

【参考方案18】:

查看Blueprints:

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

Pipes:一个懒惰的数据流框架

Gremlin:一种图遍历语言

Frames:对象到图的映射器

Furnace: 一个图算法包

Rexster:图形服务器

【讨论】:

以上是关于好的Java图算法库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

TigerGraph算法库

java多个图形[关闭]

蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库

机器学习二十三:scikit-learn 支持向量机算法库总结

通信算法之一百零七:通信算法库函数

python有没有简单的遗传算法库