Obecnie pracuję nad ukierunkowaną strukturą danych wykresu w C++ (brak wzorca GL dla tego projektu). Podstawowa aplikacja będzie identyfikować połączone komponenty i pochłaniacze. Oczekuje się, że wykresy będą rzadkie (górny limit E ~ 4V na krawędziach num) i wszystkie będą miały jednolitą masę. Próbuję zdecydować między listą sąsiedztwa, listą przypadków lub ewentualnie inną reprezentacją, o której jeszcze nie słyszałem (np. Macierz nie jest opcją bc sparsity). Wąskim gardłem będzie prawdopodobnie całkowita przestrzeń i szybkość inicjalizacji wykresu: wykresy będą inicjowane z potencjalnie ogromnych tablic tak, że każdy element w tablicy będzie końcem będącym wierzchołkiem o skierowanej krawędzi do jednego z sąsiednich elementów. Aby uzyskać krawędzie dla każdego wierzchołka, wszystkie sąsiednie elementy muszą zostać najpierw porównane.Wdrożenie rzadkiego wykresu i wydajność w C++
Moje pytania są następujące: (1) Która reprezentacja jest zazwyczaj szybsza do zainicjowania, a także szybka do przechodzenia przez system plików BFS, (2) Jakie algorytmy (inne niż wanadowe BFS) umożliwiają znalezienie podłączonych komponentów? Wiem, że to O (V + E) używając BFS (co jest optymalne, jak sądzę), ale martwię się wielkością kolejki pośredniej, ponieważ szerokość wykresu rośnie wykładniczo wraz z wysokością.
Nie mam zbyt dużego doświadczenia w implementacji wykresów, więc byłbym wdzięczny za wszelkie sugestie.
Jest też DFS waniliowy do wyszukiwania komponentów;) Ale ogólnie rzecz biorąc, nie można zrobić szybciej niż te; będziesz musiał zbadać każdą krawędź, aby zdecydować, czy wymagane jest połączenie niektórych wierzchołków, czy nie. Weźmy na przykład gwiazdę, kometę (czyli gwiazdę ze ścieżką jako jej ogon) lub drzewo; każda krawędź jest wymagana do połączenia wszystkich wierzchołków. Nie ma nic lepszego niż BFS/DFS, o ile wiem (!), I który zawiera algorytmy w O (| E | + | V |) o różnych współczynnikach. –
Domyślam się, że DFS może być lepszy, ponieważ pośredni stos jest niejawny i nie będzie tak wysoki, jak długo kolejka będzie w BFS. – compandu
To zależy całkowicie od wykresu; dla ścieżki kolejka będzie zawsze 1 elementem, a stos osiągnie długość ścieżki. Ponieważ Twoje wykresy są rzadkie, możesz mieć podgramy bardzo podobne do ścieżek lub przynajmniej coś, co ma mniej elementów w każdej granicy BFS niż najdłuższa ścieżka. –