obiekty i wskaźniki
To tylko podstawowe struktury danych, jak Hammar powiedział w drugiej odpowiedzi, w Java
których przedstawiłbyś to za pomocą klas takich jak krawędzie i wierzchołki. Na przykład krawędź łączy dwa wierzchołki i może być skierowana lub nie skierowana i może zawierać ciężar. Wierzchołek może mieć identyfikator, nazwę itp. Przeważnie oba mają dodatkowe właściwości. Możesz więc zbudować swój wykres z nimi, jak
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
Takie podejście jest powszechnie stosowane w implementacjach zorientowanych obiektowo, ponieważ jest bardziej czytelne i wygodne dla użytkowników zorientowanych obiektowo;).
matryca
Macierz to po prostu prosta dwuwymiarowa tablica. Zakładając, że masz identyfikatory wierzchołków, które można przedstawić jako tablicę int w następujący sposób:
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
Jest to często używane w przypadku gęstych wykresów, w których wymagany jest dostęp do indeksu. Za pomocą tego można przedstawić strukturę bez / ukierunkowaną i ważoną.
lista sąsiedztwa
To tylko prosta mieszanka danych, zwykle implementuję ją za pomocą pliku HashMap<Vertex, List<Vertex>>
. Podobnie używany może być HashMultimap
w guawie.
To podejście jest fajne, ponieważ masz wyszukiwanie wierzchołków O (1) (amortyzowanych) i zwraca mi listę wszystkich sąsiednich wierzchołków do tego konkretnego wierzchołka, którego żądałem.
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
Służy do przedstawiania rzadkich wykresów, jeśli aplikujesz w Google, powinieneś wiedzieć, że wykresy internetowe są rzadkie. Możesz sobie z nimi poradzić w bardziej skalowalny sposób, korzystając z BigTable .
Aha, tak przy okazji, oto bardzo dobre podsumowanie tego postu z fantazyjnymi zdjęciami;)