A co je to ten algoritmus? Neformálně se dá říci, že algoritmus je recept. Dostaneme zadání (co chceme uvařit), přísady (ingredience) a poté provádíme posloupnost kroků podle receptu. Skončíme s požadovaným výsledkem (uvařeným jídlem). Recept, nebo také pracovní postup, by měl mít přesně stanoveno, jak vypadá vstup (suroviny), co má být výstupem (jméno jídla) a dále by měl srozumitelně popisovat, co se má se vstupem dělat, abychom dostali požadovaný výstup.

Odkud pochází název algoritmus? Ještě ve středověku se počítalo s římskými čísly. Umíte sečíst dvě římská čísla, aniž byste je přepsali do desítkové soustavy? Pokud budou čísla dostatečně malá, tak to zvládneme na prstech, ale zkuste sečíst $MCDXLVIII + DCCCXXII$. Moc to nejde a to jsme je ještě nezkoušeli násobit nebo dělit. Desítková soustava vznikla až 6. stol v Indii. Jeden perský astronom a matematik, Al-Khwarizmi, napsal někdy kolem roku 825 spis “O počítání s indickými čísly”. Ve spise ukazuje, jak jednoduše sčítat, odčítat, násobit a dělit. Dokonce uměl počítat i druhé odmocniny a relativně dobře vyčíslit $\pi$. Jeho spis byl ve 12. století přeložen do latiny jako “Algoritmi de numero Indorum”, což znamená něco jako “Algoritmi o číslech od Indů”. Algoritmi bylo jméno autora. Lidé názvu špatně porozuměli a od té doby se ujal pojem algoritmus jako metoda výpočtu. Jiní tvrdí, že to bylo na počest autora.

Co jsou to ty datové struktury? Datová struktura je způsob, jak si v počítači organizovat a ukládat data, aby se s nimi dobře a efektivně pracovalo. Příkladem datových struktur je reprezentace čísel, se kterými chceme počítat. Můžeme si je zapsat jako římská čísla nebo v poziční desítkové soustavě. S datovými strukturami jsou přímo spojeny i algoritmy, které na nich pracují.

Samotný recept na jídlo ještě nezaručuje, že bude jídlo výborné. Záleží i na kuchaři. Podobně samotný algoritmus není zárukou skvělého programu, ale záleží na i programátorovi, který algoritmus implementuje pro konkrétní počítač a v konkrétním programovacím jazyce.

Program realizující algoritmus si můžeme představit jako takovou chytrou skříňku, které předhodíme vstup a ona nám po nějaké době “vyplivne” výstup. Čas, za jak dlouho nám skříňka vydá výstup, záleží na algoritmu a vstupu.

Když dostanete nový problém, ne který chcete vymyslet algoritmus, který ho řeší, tak si v první řadě musíte ujasnit, jak vypadají vstupy algoritmu a jak má vypadat výstup. Teprve pak má smysl přemýšlet o samotném algoritmu.1 Je dobré dát si nějaký čas na to, abychom si rozmysleli řešení, a pak terpve začít programovat. Řada programátorů se dopouští té chyby, že začnou příliš brzy psát řešení a až v půlce zjistí, že řeší jiný problém. Na druhou stranu nemá smysl příliš dlouho vymýšlet a plánovat. Klidně můžeme nejprve naprogramovat prototyp, získat nové poznatky a zkušenosti, a pak teprve napsat dokonalou verzi.

Při vymýšlení složitějších algoritmů často potřebujeme efektivně vyřešit řadu “základních problémů”, jako je třídění, vyhledávání, fronta, zásobník a další. Protože se tyto problémy vyskytují opravdu často, tak se i hodně studují. Známe pro ně celou řada efektivních řešení v podobě algoritmů a datových struktur. Jejich dobrá znalost patří k základnímu programátorskému “know how”. Více se o nich můžete dozvědět v literatuře. Pro jednoduchý úvod doporučujeme knihu P. T\“opfer: Algoritmy a programovací techniky [Topfer]. Pro znalce, hledající opravdové skvosty, doporučujeme D. Knuth: The Art of Computer Programming [KnuthAoCP1, KnuthAoCP2, KnuthAoCP3]. Poměrně dost informací najdete i na internetu. Internetová verze má o proti knize tu výhodu, že může obsahovat plně audiovizuální prezentaci, například animace průběhu algoritmů.