좋은 Java 그래프 알고리즘 라이브러리? [닫은]


237

누구나 Java 알고리즘에 대한 Graph 알고리즘에 대한 경험이 풍부합니다. JGraph를 사용해 보았지만 괜찮 았으며 Google에는 다른 것들이 많이 있습니다. 사람들이 실제로 프로덕션 코드에서 성공적으로 사용하고 있거나 권장하는 것이 있습니까?

명확히하기 위해 그래프 / 차트를 생성하는 라이브러리를 찾고 있지 않습니다. 최소 스패닝 트리, Kruskal 알고리즘 노드, 에지 등 그래프 알고리즘을 돕는 라이브러리를 찾고 있습니다. 이상적으로 좋은 알고리즘 / 데이터가있는 라이브러리 멋진 Java OO API의 구조.

답변:


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

매우 간단하고 강력한 Java 그래프 라이브러리에 대해서는 JGraphT 를 확인하십시오. 혼돈을 완화하기 위해 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

정은 시각화를위한 좋은 옵션이며, 임의의 그래프 생성, 재배 선 등을위한 여러 가지 메커니즘을 포함하여 상당히 유용한 가용 그래프 알고리즘 세트를 가지고 있습니다. 또한 필요한 경우 일반적으로 확장 및 조정이 상당히 쉽다는 것을 알게되었습니다. .


hep.aida. * 패키지는 LGPL입니다 ( acs.lbl.gov/software/colt/license.html ). 콜트 ( jung.sourceforge.net/download.html ) 를 통해 가져 옵니다 . 이는 ASF 및 ESF의 우산 아래 프로젝트에서 JUNG이 사용되는 것을 방지합니다. 어쩌면 github 포크 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 에 있습니다. Jung, GraphT, Prefuse, jBPT 와 비교 한 구현 된 알고리즘 목록은 https://issues.apache.org/jira/browse/SANDBOX-458 을 참조 하십시오.

좋은 데이터 구조 만 필요한 경우 Google Guava

JGraphT 는 많은 알고리즘을 구현하고 좋은 의견을 제시 하는 그래프 라이브러리입니다. Helloworld 예제 . 라이센스 : LGPL + EPL.

JUNG2JGraphT 와 유사한 데이터 구조를 가진 BSD 라이센스 라이브러리입니다. JGraphT에서 현재 누락 된 레이아웃 알고리즘을 제공합니다. 가장 최근은 2010 년부터 커밋 및 패키지 hep.aida.*합니다 (통해 LGPL입니다 콜트 라이브러리 , JUNG을 가져옵니다 ). 이는 ASF 및 ESF의 우산 아래 프로젝트에서 JUNG이 사용되는 것을 방지합니다. 어쩌면 github 포크를 사용하여 해당 종속성을 제거 해야 할 수도 있습니다 . 커밋 f4ca0cd 는 마지막 CVS 커밋을 미러링합니다. 현재 커밋은 시각화 기능을 제거하는 것으로 보입니다. 커밋 d0fb491c 는 a를 추가합니다 .gitignore.

Prefuse 는 행렬 구조를 사용하여 그래프를 저장하므로 희소 그래프에는 메모리가 효율적이지 않습니다. 라이센스 : BSD

Eclipse Zest 는 SWT와 독립적으로 사용할 수있는 그래프 레이아웃 알고리즘을 내장했습니다. org.eclipse.zest.layouts.algorithms를 참조하십시오 . 사용되는 그래프 구조는 Eclipse Draw2d 중 하나입니다 . 여기서 노드는 명시 적 객체 이며 Generics를 통해 주입되지 않습니다 (Apache Commons Graph, JGraphT 및 JUNG2에서 발생).


12

http://neo4j.org/ 는 대부분의 인 메모리 라이브러리보다 많은 그래프 알고리즘과 스케일을 포함하는 그래프 데이터베이스입니다.


1
시각화 할 수있는 Neo4J 클라이언트 (자바 클라이언트)가 있습니까?
Vishrant

10

대학 프로젝트에서 나는에 의해 yFiles 주변에 장난 삼아 yWorks 하고 꽤 좋은 API를 가지고 있었다 발견했다.


상용 소프트웨어 플랫폼의 일부로 데이터 항목 간의 상호 종속성을 시각화하기 위해 yFiles를 사용했습니다. 나는 실제로 그래프 분석 알고리즘을 사용하지 않았지만 y.algo 패키지에 필요한 것이 있는지 확인하십시오. yworks.com/products/yfiles/doc/api
Jonik

2
yFiles는 오픈 소스는 아니지만 상업용 라이센스를 제공합니다
koppor

9

청사진을 확인하십시오 :

블루 프린트는 프로퍼티 그래프 데이터 모델을위한 인터페이스, 구현, ouplementation 및 테스트 스위트 모음입니다. 블루 프린트는 JDBC와 유사하지만 그래프 데이터베이스 용입니다. TinkerPop 오픈 소스 소프트웨어 스택 내에서 Blueprints는 다음을위한 기본 기술로 사용됩니다.

파이프 : 게으른 데이터 흐름 프레임 워크

Gremlin : 그래프 순회 언어

프레임 : 객체 대 그래프 매퍼

용광로 : 그래프 알고리즘 패키지

렉스 스터 : 그래프 서버



7

당신이 그래프 알고리즘에 있다면 JDSL (데이터 구조 자바 라이브러리) 좋은 충분해야한다 - http://www.cs.brown.edu/cgc/jdsl/


이것에 감사합니다, 나는 결코 그것을 겪지 않을 것입니다. 당신은 그것을 사용하고 있습니까?
Nick Fortescue

1
예, 사용하고 있습니다. 아마 4 년 전에 사용하기 시작했습니다. 지금까지는 .NET 포트가 있었으면 좋겠다.
mr.sverrir

안타깝게도 jdsl.org 페이지는 현재 스팸 페이지 인 것 같습니다.
로스 저드슨

1
원래 게시물의 링크를 업데이트했습니다. 감사.
mr.sverrir

5

시각화를 위해 우리 그룹은 prefuse로 약간의 성공을 거두었습니다 . 우리는 건축 바닥 판과 버블 다이어그램을 처리하도록 확장했으며 너무 불평하지 않았습니다. 매우 유사한 API를 사용하는 Flare라는 새로운 Flex 툴킷이 있습니다.

업데이트 : 의견에 동의해야합니다. 우리는 많은 사용자 정의 기능을 작성하고 prefuse 제한을 해결하기 위해 노력했습니다. 우리는 prefuse를 사용하여 첫날부터 진전을 보여줄 수 있었지만 처음부터 시작하는 것이 더 나았을 것이라고 말할 수는 없습니다. 반면에 우리가 동일한 것들을 두 번째로 구현하고 있다면 요구 사항을 훨씬 잘 이해하기 때문에 혼란을 건너 뛸 수 있습니다.


prefuse에 대한 당신의 개인적인 생각은 무엇입니까? 마지막 작업에서 프로젝트는 프로젝트를 사용하기 시작했지만 90 % 이상의 재 작성 (및 새로운 기능 추가로 최적화) 버전의 프리 퓨즈로 끝났습니다.
Thomas Owens


5

그래프는 다음과 같이 간단하게 표현 될 수 있다고 확신하는 것이 좋습니다.

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

흥미로운 알고리즘을 대부분 구현하십시오. 그래프에 대한 연습 / 학습 세션 중간에이 질문에 해당되는 경우, 이것이 가장 좋은 라이브러리입니다. ;)

가장 일반적인 알고리즘에 인접 행렬을 선호 할 수도 있습니다.

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

또는 일부 작업에 대한 행렬 :

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


4

성능이 필요한 경우 Grph를 살펴볼 수 있습니다. 이 도서관은 프랑스 대학교와 CNRS / Inria에서 개발되었습니다.

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

이 프로젝트는 활발하고 사후 지원이 제공됩니다!



0

Node / Edge Graph 라이브러리가 아닌 Charting 라이브러리를 실제로 찾고 있다면 Big Faceless Graph 라이브러리 ( BFG )를 splurging하는 것이 좋습니다 . JFreeChart보다 사용하기가 쉽고, 멋지게 보이고, 더 빠르게 실행되며, 더 많은 출력 옵션이 있으며 실제로 비교할 필요가 없습니다.


당신은 질문을 오해했습니다 : 그것은 파이와 막대가 아닌 종류와 노드가있는 그래프의 종류에 관한 것입니다.
amarillion

-1

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

그래프 작업을위한 강력한 소프트웨어를 제공합니다 (직접 또는 간접). Graphivz 코드도 생성하여 그래픽 표현을 볼 수 있습니다. 백 트래킹 코드와 같이 자체 코드 알고리즘을 pakage에 넣을 수 있습니다. 이 패키지는 Dijkstra, 역 추적 미니 문 경로 비용 등의 알고리즘을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.