Algorytm Manachera.
Transkrypt
Algorytm Manachera.
Algorytm Manachera. Mamy pewne słowo s[1…n] gdzie chcemy dla każdego i takie że [1…n] wyznaczyć R[i], będące promieniem największego palindromu parzystego który ma środek w „i”. Dokładniej R[i] to taka największa liczba , że s[i-R[i] … i+R[i]+1] jest palindromem parzystej długości. Algorytm działa tak , wyliczamy pierwszą wartość funkcji R, a potem w czasie stałym znajdujemy wartości dla R[i+k] dla R{i] <= k <= R[i+k], czyli takie które mieszą się pod tzw. „parasolem” palindromu o promieniu R[i]. Wykorzystujemy nizwykła obserwację: jeżeli k jest takie, jak wyżej zostało opisane i R[i-k] ≠ R[i]-k, to R[i+k] = min(R[i-k], R[i]-k). Skąd to się w ogóle bierze? Pomyślała większość czytelników. Ano dowód nie jest zbyt przyjemy nawet jeżeli użyje obrazków , osobą którym nie jest to do szczęścia potrzebne mogą go pominąć tak czy siak , poniżej wykonam zobrazowany dowód. Mamy dwa przypadki ! 1)R[i-k] < R[i]-k, to oznacza że cały palindrom z pozycji R[i-k] znajduję się pod „parasolem” palindromu R[i], dzięki właściwością palindromu R[i] , możemy powiedzieć że to przenosi się na pozycje R[i+k]. Dosyć teorii czas na obrazek ! Niebieski R[i-k] Czerwony R[i] Zielony R[i+k] Wszystko jasne , jedziemy dalej ;) 2)Jeżeli R[i-k] > R[i]-k, to z kolei palindromR[i-k] wystaje poza daszek palindromu R[i]. Ponownie wykorzystując właściwości palindromu R[i], mamy ,że R[i+k] ≥ R[i]-k. Jednakże uwaga! Czemu to nie może być większe ? Otóż wiemy że litera s[i-R[i-k]-1] jest różna od litery s[i+R[i]+k], wiemy ta stąd iż jeżeliby były to cały palindrom by się powiększył ! Innymi słowy daszek z pozycji R[i]-k nie da się rozszerzyć czyli R[i+k]=R[i]-k. To kończy dowód , kilka rzeczy w tym dowodzie uznałem za intuicyjne , jednakże mam nadzieję , że udało mi się wszystko w miarę możliwości wytłumaczyć Jako zabawę na zrozumienie tego algorytmu polecam przerobić go tak aby działał dla palindromów Nieparzystych ! Emil Hotkowski