studiowałem queue-based
podejście do Bellman-Ford algorithm
dla pojedynczego źródła najkrótszej ścieżki od Robert Sedgewick and Kevin Wayne - Algorithms, 4th edition
kodu źródłowego dla algorytmu z książki jest obecna pod tym linkiem http://algs4.cs.princeton.edu/44sp/BellmanFordSP.java.Bellman ford kolejka podejście oparte od Sedgewick i Wayne - algorytmy, 4. wydanie
Mam dwa punkty jeden jest wątpliwości, a inne sugestie poprawy kodu.
W powyższym podejściu jest kod metody relaksacji dla relaksującej odległości od wierzchołków.
for (DirectedEdge e : G.adj(v)) { int w = e.to(); if (distTo[w] > distTo[v] + e.weight()) { distTo[w] = distTo[v] + e.weight(); edgeTo[w] = e; if (!onQueue[w]) { queue.enqueue(w); onQueue[w] = true; } } if (cost++ % G.V() == 0){ findNegativeCycle(); } }
W ten sposób pod warunkiem, jest stosowany przed znalezieniem negatywny cyklu.
if (cost++ % G.V() == 0){
findNegativeCycle();
}
Przede są podzielenie kosztów przez liczbę vertices
w wykres, aby sprawdzić negative cycle
. Może to być spowodowane tym, że relaksacja odbywa się razy i jeśli czas relaksacji dla Vth
czas oznacza, że ma cykl, gdzie V jest liczbą wierzchołków.
Ale myślę, że w podejściu opartym na kolejce używają dzielnika do sprawdzania w regularnych odstępach czasu, jeśli wystąpił cykl, czy nie. Cykl może wystąpić przed lub tuż po powyższym warunku jest prawdziwy. Jeśli cykl wystąpił po spełnieniu powyższego warunku, to algorytm musi czekać do następnego warunku czasowego, aby był prawdziwy, aby wykryć cykl. Nie jest konieczne, aby cykl wystąpił dokładnie wtedy, gdy (cost++ % G.V() == 0)
jest prawdziwy. Myślę więc, że dzielnik może być dowolną liczbą wystarczająco małą, abyśmy mogli sprawdzić cykl po odpowiednim czasie. Czy mam rację?
Kod poprawa sugestia jest
findNegativeCycle()
metoda może być zastosowana, aby powrócić prawdziwe w przypadku wystąpienia cyklu. A zatem. to condition-if (cost++ % G.V() == 0) { findNegativeCycle(); }
Może być zmieniane To-
if (cost++ % G.V() == 0)
if(findNegativeCycle()){
return;
}
W kodzie pętli utrzymuje się na prowadzeniu nawet jeśli findNegativeCycle()
metoda znalazła cykl. Możemy więc wrócić, jeśli wystąpił cykl zamiast przetwarzania reszty pętli for.
Podziel się swoimi przemyśleniami na temat powyżej 2 punktów. Z góry dzięki.
Wielkie dzięki za oczyszczenie tych wątpliwości. – anujprashar
@anujprashar Nie ma za co. Bądź na bieżąco z dobrymi pytaniami, to było bardzo głębokie zanurzenie się w implementacji tego algorytmu. –