オブジェクトとポインター
これらは、他の回答で hammar が述べたような基本的なデータ構造にすぎJava
ません。これは、エッジや頂点などのクラスで表現します。たとえば、エッジは 2 つの頂点を接続し、有向または無向のいずれかであり、重みを含むことができます。頂点には ID や名前などを付けることができます。ほとんどの場合、両方に追加のプロパティがあります。したがって、次のようにグラフを作成できます
Vertex a = new Vertex(1);
Vertex b = new Vertex(2);
Edge edge = new Edge(a,b, 30); // init an edge between ab and be with weight 30
このアプローチは、オブジェクト指向のユーザーにとってより読みやすく便利であるため、オブジェクト指向の実装に一般的に使用されます;)。
マトリックス
行列は単純な 2 次元配列です。次のような int 配列として表すことができる頂点 ID があると仮定します。
int[][] adjacencyMatrix = new int[SIZE][SIZE]; // SIZE is the number of vertices in our graph
adjacencyMatrix[0][1] = 30; // sets the weight of a vertex 0 that is adjacent to vertex 1
これは一般に、インデックス アクセスが必要な高密度グラフに使用されます。これで無向・無向・加重構造を表現できます。
隣接リスト
これは単純なデータ構造の組み合わせにすぎません。通常、HashMap<Vertex, List<Vertex>>
. HashMultimap
同様に、グアバでも使用できます。
O(1) (償却された) 頂点ルックアップがあり、要求したこの特定の頂点に隣接するすべての頂点のリストが返されるため、このアプローチはクールです。
ArrayList<Vertex> list = new ArrayList<>();
list.add(new Vertex(2));
list.add(new Vertex(3));
map.put(new Vertex(1), list); // vertex 1 is adjacent to 2 and 3
これはスパース グラフを表すために使用されます。Google で申請する場合は、Web グラフがスパースであることを知っておく必要があります。BigTableを使用すると、よりスケーラブルな方法でそれらを処理できます。
ああ、ところで、これはこの投稿の非常に良い要約です ;)