Untitled Deck Flashcards
(147 cards)
Co je to časová složitost
jak dlouho algoritmus poběží v závislosti na velikosti vstupních dat
co je to Prostorová složitost
kolik paměti je potřeba k vykonání algoritmu v závistlosti na velikosti vstupních dat
Co jsou dynamické datové struktury
struktury, které se vyznačují tím, že se jejich velikost může během vakonávání programu měnit.
Jak funguje Dynamicky rostoucí pole
Eliminuje hlavní nevýhodu klasického pole, což je fixní velikost. Umožňuje tedy přidávat libovoný počet prvků. Dynamické pole ukládá prvky do pole fixní délky. Ve chvíli, kdy je kapacita vyčerpaná, alokuje sa větší pole (většinou 2x větší), všechny prvky se do něj nakopírují a staré pole sa dealokuje. Stejné chování vykazuje i ve chvíli, kdy je pole příliš prázdné, vytvoří se menší pole a opět se do něj překopírují všechny prvky.
Vkládání, vyhledání a mazání u dynamického pole
- Vkládání prvku = Θ(n)
- Vyhledání jednoho prvku = Θ(1)
- Smazání jednoho prvku = Je závislé na implementaci. Když mazaný prvek vyměníme s posledným, a toto místo potom uvolníme, bude složitost Θ(1), prvky ale budou přeházené. Pokud při mazání všechny prvky posuneme o 1 místo, bude složitost Θ(n), ale pořadí bude zachované.
Nejlepší metoda pro řazení prvků dynamického pole
Quick Sort
Jak funguje lineární seznam
- Všechny prvky jsou stejného typu a obsahují ukazatel na následující položku v seznamu. V paměti nemusí následovat lineárně za sebou. Při zvětšování seznamu stačí vytvořit nový prvek a pomocí ukazatele ho spojit s ostatními. Lineární seznam může být buď jednosměrný (každý prvek ukazuje na další prvek v seznamu, poslední pak na NULL) nebo obousměrný (každý prvek ukazuje na předešlý i následující prvek)
Vkládání, vyhledání a mazání u lineárního seznamu
Vyhledání
O(n)
Procházení seznamu od začátku, než se najde prvek.
Vkládání
O(1) nebo O(n)
O(1), pokud vkládáme na začátek nebo máme ukazatel na místo; jinak O(n) (musíme najít pozici).
Mazání
O(1) nebo O(n)
O(1), pokud máme ukazatel na předchozí prvek; jinak O(n) pro vyhledání prvku.
metoda pro rychlé řazení - Lineární seznam
Merge sort
Jak funguje hash tabulka
- Vyhledávací datová struktura typu key-value. Hashovací tabulka kombinuje výhody vyhledávání pomocí indexu (složitost O(1)) a procházení lineárního seznamu (nízké nároky na paměť). Pomocí hašovací funkce přiřazujeme klíči index do seznamu, který pak odkazuje na lineární seznam, který obsahuje opět dvojici key-value, jelikož existuje nekonečné množství možných stringů, ale omezené množství hashů, tak se může stát, že dojde ke kolizi a pro různé klíče se spočítá stejný index v seznamu.
Vkádání hledání a mazání u hash tabulky
- Vyhledávací datová struktura typu key-value. Hashovací tabulka kombinuje výhody vyhledávání pomocí indexu (složitost O(1)) a procházení lineárního seznamu (nízké nároky na paměť). Pomocí hašovací funkce přiřazujeme klíči index do seznamu, který pak odkazuje na lineární seznam, který obsahuje opět dvojici key-value, jelikož existuje nekonečné množství možných stringů, ale omezené množství hashů, tak se může stát, že dojde ke kolizi a pro různé klíče se spočítá stejný index v seznamu.
Metody pro rychlé řazení prvků - hash tabulka
= Nelze ji nějak řadit, pořadí určuje hash funkce. Pro seřazenou tabulku použít něco jako SortedDictionary (seřazená Hash tabulka)
Jak funguje binární strom
Každý prvek stromu má nejvíc jednoho předchůdce a může mít víc než jednoho následníka. Maximální počet následníků je určený stupněm uzlů - lineární (1), binární (2), ternární (3) atd. V informatice je binární strom nejčastěji používaný typ. Pro každý uzel “U” platí, že všechny prvky v levém podstromu jsou menší než “U” a všechny prvky v pravém podstromu jsou větší.
Vkládání, vyhledání a mazání u binárního stromu
Průměrně Θ(log n), v nejhorším případě Θ(n)
metoda pro ryhclé řazení prvků - binární strom
Tree sort algoritmus
Co je a jak funguje Quick sort
- Nejrychlejší řadící algoritmus, momentálně jedním z nejpoužívanějších, paměťově nenáročný, založen na principu rozděl a panuj.
- Princip = Zvolíme pivot. Na levou stranu pivotu vložíme prvky menší než pivot a na pravou stranu větší než pivot. Prvky řadíme na tyto dvě poloviny, tak, že najdeme prvek na levo, který je větší než pivot a prvek na pravo, který je menší než pivot a prohodíme je. Rekurzivně pak pro tyto dvě části provedeme stejnou akci (zvolíme pivot, do leva dáme menší, do prava větší). Toto opakujeme, dokud nenarazíme na pole velikosti 1. V tento moment je pole seřazeno. Pro volbu pivotu je mnoho strategií, protože je žádoucí zvolit hodnotu, která rozdělí pole zhruba na poloviny. Buď můžeme volit fixně první nebo poslední prvek, popř. náhodný nebo je také populární strategií volba mediánu prvního, posledního a prostředního prvku pole.
- Výkonnost je tedy dána hlavně volbou pivotu. V nejlepším případě se pole rozdělí na 2 stejné díly při každém rekurzivním průchodu, v nejhorším případě je rozdělení pole nerovnoměrné a průchodů tak bude více (uplně nejhorší by bylo opačně seřazené pole)
Co je a jak funguje Heap sort
- Řadící algoritmus založený na binární haldě
- Binární halda je binární strom, ve kterém jsou jeho položky seřazeny buď, tak že v rodičovském uzlu je vždy menší číslo než v jeho potomcích (min heap) nebo je v rodičovském uzlu vždy větší nebo rovné číslo těm v jeho potomcích (max heap). Při této reprezentaci také platí, že rodičovský uzel ležící na indexu i má levého potomka na indexu 2i+1 a pravého potomka na 2i + 2.
- Princip = pro seřazení pole se nejdříve vytvoří halda a následně se seřadí provedením max heap funkce. Při převedení haldy na max heap se tedy vždy rekurzivně projde halda od spodu nahoru a nastaví se, aby rodičovská node byla vždy větší nebo rovna jeho potomkům. Po provedení max heap se pak vždy prohodí první a poslední prvek a z haldy se smaže poslední prvek. Poté se opakovaně zase spouští max heap funkce, dokud není v haldě jen jeden prvek. Prohazování prvků v haldě se propisuje do pole, které třídíme pomocí těch pravidel 2i+1 a 2i + 2.
- Asymptotická časová složitost je zaručená, proto je heap sort vhodnější pro použití v real-time systémech než v průměrném případě rychlejší quick sort, který může dosahovat složitosti v nejhorším případě až O(n2).
Co je a jak funguje Merge sort
- Opět založen na principu rozděl a panuj
- Princip = Neseřazený list se nejdříve rekurzivně rozdělejuje na poloviny, dokud se nedostane do bodu, kdy všechny rozdělené seznamy jsou o velikosti 1. V tento moment začne slučovací (merge) část algoritmu a pole jsou rekurzivně slučována. Je vždy porovnávána hodnota prvních prvků dvou polí, do sloučeného pole se pak vždy na začátek vloží menší z těchto dvou hodnot, odstraní se z původního pole a krok se opakuje, dokud se jeden ze slučovaných seznamů nevyprázdní, potom překopírujeme zbytek druhého pole do toho nově sloučeného. Slučuje se, dokud není pole o velikosti původního neseřazeného pole.
- Oproti quick sortu nemá žádný nejhorší případ, vždy rozděluje pole na 2 poloviny a sloučení dvou polí zabírá lineární čas, merge sort je tak vhodnější pro větší pole a quick sort pro menší. Nevýhodou je, že pro svou práci potřebuje dodatečné pole o velikosti n.
Jaké má asymptotcké složitosti quick sort
= v nejlepším případě a průměrně je to Θ(n log n), v nejhorším případě Θ(n2)
Jaké má asymptotcké složitosti Heap sort
= ve všech případech Θ(n log n)
Jaké má asymptotcké složitosti Merge sort
ve všech případech Θ(n log n)
vysvětlete algoritmus „hrubé síly“ (naivní)
- Nejjednodušší z algoritmů pro vyhledávání vzorů v řetězci, kontroluje všechny znaky hlavního řetězce oproti vyhledávanému řetezci, takže oproti lepším algoritmům nic nepřeskakuje. Je vhodný pro kratší texty a nepotřebuje žádný čas na přípravu (preprocessing phase) oproti jiným algoritmům.
- Princip = Jendoduše porovnáváme postupně vyhledáváný řetězec s hlavním řetězcem, dokud najdeme nebo nenajdeme výskyt. Pokud je nalezen výskyt, tak se vrací index, kde začíná.
- Asymptotická časová složitost = Θ(n*m), kde velikost hledaného řetězce je n a velikost hlavního řetězce je m
Karp-Rabinův algoritmus
- Stejně jako naivní algoritmus, Karp-Rabinův algoritmus také posouvá hledaný řetězec po jednom. Na rozdíl od naivního, algoritmu ale Karp-Rabinův algoritmus porovnává hashovací hodnotu hledaného řetězce s hashovací hodnotou aktuálního dílčího textu, a pokud se hashové hodnoty shodují, teprve tehdy porovná jednotlivé znaky řetězců.
- Tento algoritmus tedy musí vypočítat hashovací hodnoty pro samotný řetězec, který hledáme a pro všechny substringy o stejné délce jako je hledaný řetězec, proto musíme zvolit efektivní hashovací funkci. Využívá se často tzv. rolling hash, který využívá vždy předešlý vypočítaný hash a jen od něj odečte hodnotu levého písmena, které bylo posunem vyhozeno z kontrolovaného podřetězce a přičteme hodnotu písmena na pravo, které se nově porovnává. Asymptotická náročnost takovéhoto hashe je pro první hash Θ(m), ale další hashe jsou již konstantní Θ(1).
- Asymptotická časová složitost = Příprava Θ(m) pro hash, potom průměrně je Θ(n+m) a v nejhorším případě Θ(n*m)
- Časová složitost se dá zlepšit kvalitou hashovací funkce
Quick Search algoritmus (Sunday)
- Porovnává se opět hledaný řetězec znak po znaku s hlavním řetězcem. Figuruje zde tzv. testový znak, který je vždy za právě prohledávaným substringem. Znaky se tedy porovnávají, pokud dojde k neshodě, tak se zbytek řetězce už dále neporovnává, ale přeskakuje se za testový znak. Pokud se testový znak nachází ve hledaném řetězci, tak se hledaný řetězec posune pod testový znak, tak aby pod sebou byl testový znak a první výskyt daného znaku v hledaném řetězci (řetězec se posune o co nejmenší vzdálenost, aby k tomu došlo) a začne se znovu porovnávat. Toto chování se opakuje, dokud je nebo není nalezen řetězec.