Zamiast zrobić zadanie domowe dla ciebie, mam zamiar zapytać cię przez proces myślowy, który dostaje odpowiedź ...
1) Co byś zrobił z abc milimetrowym (trzy wierzchołki, dwa krawędzie i zdecydowanie acykliczny)? Wyobraź sobie przez chwilę, że musisz umieścić etykiety na niektórych wierzchołkach, wiesz, że dostaniesz minimalną najdłuższą ścieżkę na wierzchołku "centrum". (b, z ostateczną etykietą "1") Ale robienie tego jednym krokiem wymaga mocy psychicznej. Zadaj sobie pytanie, co b dzieli 1 krok. Jeśli najdłuższa ścieżka do b wynosi 1, a my właśnie zrobiliśmy krok do tyłu tą ścieżką, jaka jest długość naszej dotychczasowej ścieżki? (najdłuższa ścieżka = 1, -1 dla tyłu o jeden stopień Aha: 0). To musi być etykieta liści.
2) Co to sugeruje jako pierwsze cięcie algorytmu? Zaznaczyć liście "0", zaznaczyć ich upstream "1", oznaczyć ich upstreams "2" i tak dalej. Maszerujemy z liści i liczymy dystans, kiedy jedziemy ...
3) Umm ... Mamy problem z wykresem a-b-c-d. (Odtąd etykietowany wierzchołek zostanie zastąpiony jego etykietą.) Oznakowanie liści "0" daje 0-bc-0 ... Nie możemy uzyskać dwóch centrów ... Heck, co robimy w prostszym stan 0-b-1? Chcemy oznaczać etykietą b zarówno "1", jak i "2" ... Obsługujemy te w odwrotnej kolejności ...
W 0-b-1, jeśli przedłużysz ścieżkę z b o jeden, otrzymamy ścieżka długości 1. Jeśli rozszerzymy ścieżkę z prawej strony b, otrzymamy 2. Chcemy śledzić "długość najdłuższej ścieżki od v do dowolnego innego węzła", więc chcemy śledzić najdłuższą ścieżkę do b. Oznacza to, że oznaczamy b "2".
0-b-1 -> 0-2-1
W 0-b-c-0, komputer nie faktycznie jednocześnie aktualizacji bi c. Aktualizuje jedną z nich, podając 0-1-c-0 lub 0-b-1-0, a następna aktualizacja daje 0-1-2-0 lub 0-2-1-0. Zarówno b jak i c są "centrum" tego wykresu, ponieważ każdy z nich spełnia żądanie "węzła v w drzewie, który minimalizuje długość najdłuższej ścieżki od v do dowolnego innego węzła". (Ta długość to 2.)
Prowadzi to do innej obserwacji: wynikiem obliczeń nie jest oznaczanie wykresu, to szukanie ostatniego wierzchołka, który oznakujemy i/lub wierzchołka, który kończy się największą etykietą. (Możliwe, że nie znajdziemy dobrego sposobu na zamówienie etykiet, więc w końcu będziemy musieli znaleźć maksimum na końcu, a może to zrobimy, a kto wie.)
4) Tak więc teraz mamy coś w stylu: wykonaj dwie kopie wykresu - oznaczoną etykietą i kopię do wypalenia. Pierwszy będzie przechowywać etykiety i to on będzie miał ostateczną odpowiedź. Spalona kopia będzie coraz mniejsza, ponieważ usuniemy z niej nieoznaczone wierzchołki (aby znaleźć nowe wierzchołki nadające się do etykietowania). (Istnieją inne sposoby, aby to zorganizować tak, że tylko jedna kopia wykresu służy Gdy dojdziesz do końca rozumiejąc tę odpowiedź, należy znaleźć sposób na zmniejszenie tych odpadów..) Zarys:
label = 0
while the burndown graph is nonempty
collect all the leaves in the burndown-graph into the set X
for each leaf in the set X
if the leaf does not have a label
set the leaf's label (to the current value of label)
delete the leaf from the burn-down graph (these leafs are two copies of the same leaf in the input graph)
label = label+1
find the vertex with the largest label and return it
5) Jeśli faktycznie obejrzysz ten bieg, zauważysz kilka możliwości skrócenia czasu. W tym zastąpienie wyszukiwania na ostatniej linii konturu szybszym sposobem rozpoznania odpowiedzi.
A teraz ogólne wskazówki dotyczące strategii rozwiązywania problemów związanych z algorytmem:
* Wykonaj kilka małych przykładów ręcznie. Jeśli nie rozumiesz, jak robić małe przypadki, nie ma możliwości, abyś natychmiast wskoczył do środka i powiedział komputerowi, jak zrobić duże skrzynie. * Jeśli którykolwiek z powyższych kroków wydawał się być pozbawiony motywacji lub całkowicie nieprzejrzysty, będziesz musiał uczyć się o wiele, dużo trudniej zrobić dobrze w dziedzinie informatyki. To może być Informatyka nie jest dla ciebie ...
Jeśli dokładnie punkt środkowy nie istnieje, jak możemy wybrać? Mam na myśli, jeśli najdłuższym sposobem jest a-b-c, a-b ma długość 1, a b-c ma długość 2?Lub bardziej złożony przykład? – cnhk
Wybierz jeden arbitralnie, jeśli potrzebujesz tylko jednego węzła, który kwalifikuje się, lub skonstruuj zestaw centralny, jeśli potrzebujesz wszystkich tych kwalifikacji. – tvanfosson