オブジェクトとポインタ
これらは、他の回答で述べた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で申請する場合は、ウェブグラフがスパースであることを知っておく必要があります。BigTableを使用すると、よりスケーラブルな方法でそれらを処理できます。
ああ、ところで、ここにファンシーピクチャー付きのこの投稿の非常に良い要約があります;)