Niedawno dokonałem wstępnego porównania czasu działania algorytmu Dijkstry przy użyciu dwóch struktur danych, opartego na Javie PriorityQueue (opartego na binarnej stercie, jeśli ja ' nie mylę się) i stertę Fibonacciego. Użyłem currentTimeMillis() Java, aby wykonać moje obliczenia. Rezultaty, które otrzymałem, są całkiem interesujące. Jest to wyjście do jednego z moich testami:Dijkstra na Java: Uzyskiwanie interesujących wyników przy użyciu sterty Fibonacciego vs. PriorityQueue
Running Dijkstra's with 8 nodes and 27 links
- Execution time with binary heap: 1 miliseconds
- Execution time with Fibonacci heap: 4 miliseconds
Trzeba przyznać, że jestem mało zestawów danych w tej chwili, z powyższego wykresu jest moja największa (mam zamiar zrobić więcej wkrótce). Ale czy to ma jakiś sens? Zawsze uważałem, że stosy Fibonacciego były szybsze niż inne struktury danych ze względu na ich amortyzowany czas działania w porównaniu z innymi strukturami danych. Nie jestem pewien, skąd się bierze ta 3-milisekundowa różnica. (Używam go na procesorze Intel Core Ivy Bridge i7-3630M, jeśli to pomaga.)
Uwaga: natknąłem się na this thread, co może wyjaśnić problem, chociaż nadal nie jestem pewien, dlaczego sterty Fibonacci Wersja trwa dłużej. Zgodnie z tym wątkiem może to wynikać z tego, że mój wykres nie jest wystarczająco gęsty i dlatego liczba operacji zmniejszania liczby kluczowych nie jest wystarczająco duża, aby wydajność sterty Fibonacciego naprawdę się świeciła. Czy byłby to jedyny wiarygodny wniosek, czy może jest coś, czego mi brakuje?
Potrzebowałbyś zestawu danych o wielkości rzędu kilku rzędów większych niż 8 węzłów i 27 łączy, aby uzyskać znaczący poziom odniesienia. – EJP
Tak, teraz to rozumiem. Będę musiał sprawdzić i zobaczyć, co mogę zrobić. Dzięki. –