# ADS B - Abeceda
## Rozbor
Abeceda je lineární uspořádání, takže se jednotlivá písmena dají převést na vrcholy maximálního DAGu (tzn. z $A$ vede hrana do $B,C...$, z $B$ do $C...$ atd.)
Pokud by každá kniha měla jen jedno písmeno, pak lze úlohu vyřešit následujícím způsobem:
$A1$
$1.$ Procházím postupně všechny knihy; neexistuje-li ještě dané písmeno, přidám jej do např.pole
$2.$ Zavedu všechny hrany z dosavadních písmen do nového
$3.$ Výsledek:
- existuje-li smyčka, pak jsou knihy se stejným počátečním písmenem za sebou
- existuje-li cyklus, pak knihy nemohou být v abecedním pořadí
- není-li žádný cyklus, pak knihy mohou být v abecedním pořadí
Správnost algoritmu vychází z toho, že se prvky v poli/množině vyskytují jen jednou; směřuje-li hrana z $b$ do dřívějšího prvku $a$ pak to znamená, že prvek $b$ se nachází v abecedě před prvkem $a$, jenže v některém předchozím kroku jsem již předpokládal, že prvek $a$ je před prvkem $b$, což je spor.
U jednopísmenných názvů se dá tak zjistit pořadí všech písmen, která se v názvech knih vyskytují (pokud neexistuje cyklus). U vícepísmenných názvů toto nemusí být úplně jednoznačné, jak je vidět z následujícího algoritmu:
$1.$ $A1$
$2.$ Existuje-li smyčka, proveď $A1$ na všechny knihy začínající tímto písmenem (nazvěme výsledek podgraf $H$), a pokračuj na další smyčku
$3.$ Zjisti, zdali hrany v $H$ jsou totožné s hranami v $G$ obsahující pouze tyto vrcholy.
$4.$ Pokračuj rekurzivně, dokud jsou v $H$ nějaké smyčky.
3.krok opět může skončit chybou, pokud dané vrcholy existují v $G$, ale podgraf tvořenými těmito vrcholy obsahuje jiné hrany. Může však nastat i jiná situace, a to, když daný vrchol není v $G$. Pak je potřeba zjistit jeho "těsné sousedy" a zkoumat, zdali se tito v grafu nachází. Pokud ano, pak lze pořadí opět aktualizovat.
Např. znám-li vrcholy $u,v$ a objevím-li sekvenci $u,x,g,v$, pak mohu tvrdit, že abeceda je v pořadí $u,x,g,v$.
Pokud však v dané hloubce není levý nebo pravý hraniční vrchol v prvotní abecedě, pak se mohu jen domýšlet. Pokud bych znal pouze pořadí $u,x,g$, pak vím, že daná písmena leží za $u$, ale nic více. To mi naštěstí nebrání v tom, zavést toto pořadí do výsledného grafu. Jakmile totiž později zjistím druhou hranici (např. $x,v$), budu již znát výsledné pořadí.
Tedy oprava výsledku: abeceda je jednoznačná v případě, že existuje jednoznačné topologické uspořádání.
Jelikož by smyčky a částečné grafy byly nepřehledné, vytvořím si graf, do kterého budu zapisovat jen jednoznačnosti.
Tento postup může být poněkud zdlouhavý, například v případě knih "Aaaaaa" a "Aaaaab".Také závisí na délce slov. Například pokud by knihy pokrývaly celou abecedu a "nadbytečné" knihy by se lišily až $z$-tým písmenem, pak by složitost byla řádově $k+z(k-n)$. Samozřejmě mohu předpokládat, že $z$ je konstanta
## Celkový algoritmus:
$1.$ Mám prázdný graf o $n$ vrcholech (pro zjednodušení budu předpokládat, že znaky písmen známe) a jména knih (slova) ve frontě a jednu prázdnou frontu (budu je střídat, šla by i cyklická fronta). Ukazatel $z$ na písmeno je roven $0$
$2.$ $z = z+1$;
$3.$ Nastavím proměnou $p$ na žádnou.
$4.$ zjistím $z$-té písmeno ve slově, označím $t$ a porovnám ho s písmenem v následujícím slově $q$ (jsem-li na konci, pak neporovnávám)
$5a.$ Shoduje-li se alespoň s jedním, pošlu slovo na konec fronty.
$5b.$ Pokud $t$ neexistuje (krátké slovo) nebo se liší od písmen v předchozím i následujícím slově, vyhodím slovo pryč z fronty.
$6.$ Je-li $t\neq q$, pak přidám hranu $t\to q$. Obdobně $p \to t$.
$7.$ $p = t$.
$7.$ Jakmile je fronta prázdná, vyměním prvky ve frontách a jdu na $2$.
$8.$ Jakmile jsou obě fronty prázdné, pokusím se o nalezení topologického uspořádání grafu. Existuje-li alespoň jedno, pak tato knihovna může být uspořádána podle abecedy (permutací může být tolik, kolik je těchto uspořádání).
Výstupem tak může být graf s cyklem, graf s více zdroji, nebo nesouvislý graf.
Důležité je, že abeceda bude jednoznačná, pokud je podgrafem na všech vrcholech orientovaná cesta. Ostatní hrany, pokud nebudou tvořit cyklus, jsou tak přebytečné.
Složitost - časová: závisí na celkovém počtu znaků, z kterých se skládají jména všech knih, přičemž každý znak je potřeba projít nejhůře jednou.
Složitost - prostorová: v grafu je potřeba tolik paměti, kolik je znaků v abecedě, a počet hran mezi nimi (což je O(n^2)).