2012-11-19 12 views
7

Nie mogę używać żadnych zewnętrznych bibliotek, więc staram się wymyślić kilka sposobów na samodzielne zbudowanie struktury danych. Myślałem, że może coś takiego:W jaki sposób mogę przedstawić ważony, ukierunkowany wykres w Javie?

public class Node{ 
    Set<Edge> adjacent; 
    int value; 
} 

public class Edge{ 
    Node target; 
    int weight; 
} 

Ale domyślam się, że jest prawdopodobnie lepszy sposób to zrobić.

Moim ostatecznym zastosowaniem do tego wykresu jest uruchomienie algorytmu Bellmana Forda, ale oczywiście potrzebuję najpierw działającego wykresu!

Odpowiedz

10

Odpowiedź zależy w dużej mierze od algorytmów, które planujesz zastosować do swoich wykresów.

Istnieją dwa popularne sposoby prezentacji wykresu - adjacency list i adjacency matrix. W twoim przypadku macierz sąsiedztwa jest kwadratową tablicą liczb całkowitych reprezentujących wagi. Twoja reprezentacja używa listy przyległości.

Istnieją algorytmy, które działają lepiej na macierzach sąsiedztwa (np. Algorytmie Floyd-Warshall). Inne algorytmy działają lepiej na listach sąsiednich (np. Algorytm Dijkstry). Jeśli twój wykres jest rzadki, użycie macierzy sąsiedztwa może być zaporowe.

+0

Pracując lepiej, masz na myśli tylko to, że są bardziej wydajne? – Hoser

+1

@Hoser W większości przypadków odpowiedź brzmi "tak". Specjalne przypadki, takie jak Floyd-Warshall, wymagają macierzy do pracy. Możesz zachować reprezentację listy przyległości aż do momentu, w którym uruchomisz algorytm, zbudujesz macierz, aby ją uruchomić, a na końcu przekształć macierz z powrotem na listę sąsiedztwa. – dasblinkenlight

+0

W porządku, dziękuję. Co z jednym z nich sprawia, że ​​wspierają one kierunek? Czy faktycznie wymuszają kierunek, czy jest to coś, co muszę sam sobie zarządzać? – Hoser

2

Jak zwykle, możesz reprezentować wykresy jako Listy Przyległości lub Matryce Przyległości. Wybór naprawdę zależy od szczegółów twojego problemu.

Używając macierzy sąsiedztwa, można po prostu mieć macierz liczb całkowitych, reprezentujących wagę.

Jeśli zdecydujesz się na listę sąsiedztwa, możesz po prostu zapisać listę listy liczb całkowitych (zakładając, że węzły twojego wykresu są identyfikowane przez liczbę całkowitą), podobnie do tego, co zrobiłeś.

+0

działa jako nośnik matrycy przylegania grubości krawędzi ? – Hoser

+1

Tak, poprawiłem odpowiedź. Możesz mieć ciężary na macierzy (linia X, col Y ma wartość val Z, oznacza koszt od X do Y jest Z) – leo

+0

W porządku, dziękuję. Macierz dopasowania wydaje się dobrym sposobem na zrobienie tego. W jaki sposób obsługuje wymóg kierunku? Czy istnieje jakiś szczególny powód, dla którego macierz sąsiedztwa zmusza do przejścia w określony sposób między węzłami, czy jest to po prostu coś, czego muszę unikać. – Hoser

0

można użyć węzeł jak w nieważonej wykresie posiadający listę węzłów, z którym jest połączony, oraz dodać wagi związanych z połączeniami jak:

public class Node{ 
    int value; 
    HashMap<Node,Integer> adjacency; 
} 
Powiązane problemy