Kometarz do zadania 1 z egzaminu z ASD 26 stycznia 2010 ======================================================= Oznaczmy n = |t| + |s|. RozwiÄ zanie wzorcowe dziaĹa w czasie O(n). Bierzemy sĹowo t#s$, gdzie # i $ sÄ róşnymi symbolami spoza alfabetu, i konstruujemy dla tego sĹowa drzewo sufiksowe. Dla kaĹźdego wÄzĹa v wyliczamy (od doĹu do gĂłry) wartoĹÄ dolar(v) - czy da siÄ z tego wÄzĹa idÄ c w dóŠdojĹÄ do znaku $ nie odwiedzajÄ c znaku #. ZauwaĹźmy, Ĺźe kaĹźdemu podsĹowu sĹowa t, ktĂłre nie jest podsĹowem sĹowa s, odpowiada taki wÄzeĹ w nieskompresowanym drzewie sufiksowym sĹowa t#s$, dla ktĂłrego dolar = false, i do ktĂłrego od korzenia moĹźna dojĹÄ nie odwiedzajÄ c znaku #. Takie wÄzĹy moĹźna Ĺatwo zliczyÄ majÄ c funkcjÄ dolar w skompresowanym drzewie sufiksowym. ParÄ osĂłb zrobiĹo to zadanie w czasie liniowym, zazwyczaj w sposĂłb bardzo zbliĹźony do wzorcowego. Wiele rozwiÄ zaĹ polegaĹo na mniej lub bardziej skomplikowanym wyszukiwaniu podsĹĂłw jednego sĹowa w drugim - te, w zaleĹźnoĹci od zĹoĹźonoĹci, byĹy oceniane od 1 do 3 pkt. Bardzo popularnym rozwiÄ zaniem byĹo coĹ nastÄpujÄ cego: tworzymy dwa drzewa sufiksowe (skompresowane) sĹowa t i sĹowa s i nastÄpnie "jednoczeĹnie" przechodzimy je DFSem. To jest poprawne rozwiÄ zanie, ale dziaĹajÄ ce w czasie O(n^2) - mimo, iĹź wiele osĂłb twierdziĹo, Ĺźe jest liniowe. Tak, liczba wÄzĹĂłw w drzewach wynosi n - ale przejĹcie po krawÄdzi, by sprawdziÄ, czy teksty w obu drzewach siÄ zgadzajÄ , trwa. SpĂłjrzmy na przypadek t = s. WĂłwczas drzewa sufiksowe siÄ caĹkowicie naĹoĹźÄ , i my je DFSem caĹkowicie przejdziemy - zajrzymy do kaĹźdej literki na kaĹźdej krawÄdzi - czyli obejrzymy tak naprawdÄ caĹe nieskompresowane drzewo sufiksowe - a to ma rozmiar O(n^2). Takie rozwiÄ zanie dostawaĹo 3 pkt, chyba Ĺźe ktoĹ twierdziĹ, Ĺźe jest liniowe - wĂłwczas 2 pkt. Warto nadmieniÄ, Ĺźe z problemem powyĹźszym moĹźna sobie poradziÄ nastÄpujÄ co: my de facto chcemy umieÄ szybko odpowiadaÄ na pytania: dla indeksu i w sĹowe t, dla indeksu j w sĹowie s, jak daleko sĹowa t[i...] i s[j...] siÄ zgadzajÄ . To moĹźna odpowiadaÄ w czasie staĹym robiÄ c tablicÄ LCA dla sĹowa t#s, lub w czasie O(log n) robiÄ c algorytm KMR dla sĹowa ts. Podsumowanie punktacji: 9 pkt rozwiÄ zanie O(n) 8 pkt rozwiÄ zanie O(n log n) 5 pkt rozwiÄ zanie O(n) z powaĹźnymi bĹÄdami lub brakami: - zazwyczaj byĹo to niepoprawny opis tego, co zliczamy w drzewie sufiksowym sĹowa t#s$ - rĂłwnieĹź tyle punktĂłw otrzymywaĹo rozwiÄ zanie, ktĂłre prĂłbowaĹo wpierw skonstruowaÄ drzewo sufiksowe s, a nastÄpnie "przy pomocy s skonstruowaÄ drzewo sufiksowe sĹowa t" - bez dokĹadniejszego opisu, co ono robi (to siÄ da tak zrobiÄ, de facto sprowadza siÄ do zrobienia drzewa sufiksowego sĹowa st, i uwaĹźaniu w algorytmie Ukkonena, ale bez dokĹadniejszego opisu o co chodzi dostawaĹo 5 pkt) 3 pkt rozwiÄ zanie O(n^2) lub O(n^2 log n) z poprawnÄ analizÄ zĹoĹźonoĹci 2 pkt rozwiÄ zanie O(n^2) z niepoprawnÄ analizÄ zĹoĹźonoĹci (zazwyczaj byĹo to stwierdzenie, Ĺźe jest to liniowy algorytm) lub jej brakiem 1 pkt poprawne rozwiÄ zanie szybsze od absolutnie naiwnego