Znakove stromy -------------- 1. strom: 2 smysluplna ceska slova, 12 uzlu zakodovani (viz priklad Tvar stromu): 101100010101010101010101 slovo v pre-oreder: ALGORITMICKÝ slovo v in-order: LOGARITMICKÝ (odpovida naplneni uzlu v grafickem znazorneni zleva) 2. strom: 2 smysluplna ceska slova, 9 uzlu zakodovani (viz priklad Tvar stromu): 101001101100101000 slovo v L-X-R-order: PRODĚKANE slovo v X-R-L-order: NEPOŘÁDEK (zde si lze povsimnout pozoruhodne vypovidaci hodnoty obou slov :-) 3. strom: 3 smysluplna ceska slova, 7 uzlu zakodovani (viz priklad Tvar stromu): 11010100010100 slovo v L-X-R-order: MÍNĚNÍM (odpovida naplneni uzlu v grafickem znazorneni zleva) slovo v X-L-R-order: NEMÍNÍM slovo v R-X-L-order: MÍNĚNÍM 4. strom: 3 smysluplna ceska slova, 7 uzlu zakodovani (viz priklad Tvar stromu): 11100001010100 slovo v L-X-R-order: NESUŠEN (odpovida naplneni uzlu v grafickem znazorneni zleva) slovo v L-R-X-order: NESNESU slovo v R-X-L-order: NESUŠEN dalsi dvojice slov, ktere jsou kandidaty na pokus o vlozeni do stromu: NEJNEZÁLUDNĚJŠÍMU - NEJZALIDNĚNĚJŠÍMI INTERPOLAČNÍMU - PROCENTUÁLNÍMI PRAVIDELNOST - OSPRAVEDLNIT PROTESTOVÁNÍ - OPERATIVNOST DONEKONEČNA - NEDOKONČENÁ DEKLAROVÁNÍ - KARDINÁLOVÉ ANDĚLÍČEK - DEKLINACE TŘÍČLENNÁ - CENTRÁLNÍ PARANOIK - POKÁRÁNÍ GALERIE - ALERGIE pozn.: omezil jsem se na ceska slova máte k dispozici slovník o n slovech. Jak nejrychleji zjistíte řešení této úlohy ? 1) najdu ve slovniku dvojice slov, ktere vzniknou permutaci pismen ze stejneho slova -ohodnotim kazde slovo hodnotou ktera je zavisla na poctu vyskytu pismen (hash, ktery je prosty do nejakeho max. poctu stejnych pismen - 3) ...v podstate linearni slozitost (v zavislosti na poctu slov) -seradim seznam podle vysledku teto funkce ...linearne-logaritmicka slozitost -slova se stejnou hodnotou (nyni v poli vedle sebe) patri do tech dvojic ...linearni slozitost 2) pro kazdou dvojici zkousim vsechny tvary stromu a zpetne ctu slova v ruznych orderech -pocet uzlu stromu = delka kodu stromu = 2*(n-1) (viz priklad Tvar stromu) ...stromu je max. 2^(2*(n-1)) => exponencialni slozitost (ted uz v zavislosti na delce slova) -naplneni stromu slovem o n pismenech ...linearne-logaritmicka slozitost -precteni slova v nekolika orderech a porovnani ...linearni slozitost ...celkova obalka slozitosti = linearne-exponencialni Vykresleni stromu ----------------- na to, aby byly uzly serazeny s osou x staci u BVS kreslit pri traverzovani typu in-order, tozn. 0) rekurzivne nakreslit strom od korene (volani r1 s hodnotou aktualniho uzlu = koren) 1) konec r1) nakreslit levy podstrom aktualniho uzlu (r1 rekurzivne) r2) nakreslit aktualni uzel r3) nakreslit levy podstrom aktualniho uzlu (r1 rekurzivne) a ted, graficky vystup by se dal resit napr. takto: rekurze by si pamatovala hloubku - souradnice y pro kresleni kolecek jakozto uzlu; souradnice x by se urcovala pri traverzovani a to tak ze pri prechodu vlevo by se odecetla hodnota, vpravo pricetla, ale nikoliv konstantni nybrz v zavislosti na hloubce by se exponencialne snizovala, aby byl zajisten deterministicky prubeh vykreslovani nezavisle na tom, jak vypada ta cast stromu, o ktere jeste nevime. pro dodrzeni stejnych uhlu u car mezi uzly by se na polovinu snizoval i posun po ose y v zavislosti na hloubce vnoreni rekurze. backtracking pri odchodu z rekurze (nemusime vedet jestli jdeme zpatky zleva ci zprava) by se resil tak, ze krome ukazatele na rodicovsky uzel se na zasobnik ulozi i jeho x-ova souradnice. Pri kazdem kresleni uzlu se pak nakresli kolecka na zname X,Y (takto snizujici se prubeh zmen hodnot na osach zaruci, ze v grafice nevzniknou prekryvajici se tvary) a carky mezi nimi (ve finale se muze graf vycentrovat podle maxim a minim hodnot pouzitych souradnic, ktere si prubezne algoritmus uchovava) Tvar stromu ----------- pravidla pro zakodovani: 0.0) necht X je koren, 0.1) zasobnik je zasobnik s predvlozenym prvkem NULL 0.2) Y je prazdna bitova sekvence (+= znaci concat) 1.0) ma-li X leveho potomka Y+=1 a pokracuj, jinak Y+=0 a skok na 2.0) 1.1) X je levy potomek (predchozi hodnota je ulozena na zasobnik) 1.2) opakuj 1.0) 2.0) ma-li X praveho potomka Y+=1 a pokracuj, jinak Y+=0 a skok na 3.0) 2.1) X je pravy potomek 2.2) opakuj 1.0) 3.0) vycti ze zasobniku predchozi hodnotu do X 3.1) pokud je X prazdne KONEC (vysledek v Y), jinak skok na 2.0) pro strom o n uzlech je obecne potreba sekvence dlouha 2*n bitu pro usetreni mista muzeme sekvenci zkratit o koncove nuly, v nejhorsim pripade o 2 (strom je vyvazeny) => je potreba 2*(n-1) bitu pozn. predchozi optimalizace je realizovatelna tehdy pokud nemusime ukladat strom s 0 uzlu, ten se pak neda rozlisit od stromu s jednim uzlem Permutace --------- algoritmus pro generovani vsech permutaci musi zapsat n! hodnot, tudiz bude mit prinejlepsim slozitost O(n!) implementace: napr. rekurzivni viz. "permut.c" - pocet prvku mnoziny je 1. parametr programu - pametova slozitost je linearni