informatika:maturita:21a
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| informatika:maturita:21a [21. 02. 2015, 17.33] – xmrnustik | informatika:maturita:21a [17. 02. 2026, 21.03] (aktuální) – xwolf4 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| ====== Fronta a zásobník ====== | ====== Fronta a zásobník ====== | ||
| + | Tyto datové struktury si lze vyzkoušet na této [[https:// | ||
| - | = způsoby dočasného uložení dat v rámci | + | Fronta i zásobník jsou 2 principiálně velmi podobné |
| - | ===== Základní funkce obou ===== | + | Fronta a zásobník jsou centrální datové struktury algoritmů vyhledávání do šířky (BFS) a vyhledávání do hloubky (DFS). Jediným rozdílem mezi těmito algoritmy je použitá datová struktura. |
| - | **push(co)** - slouží k vložení dat | + | ===== Základní funkce ===== |
| - | **pop()** nebo také **pull()** | + | * **push(objekt)** – vkládá nová data do řady |
| + | * **pop()** nebo také **pull()** | ||
| + | ===== Fronta (queue) ===== | ||
| - | ===== Fronta ===== | + | Funguje na principu **FIFO** |
| - | (anglicky queue) | + | |
| - | Funguje na principu **FIFO** (first in first out), to znamená, že si frontu můžeme představit třeba jako frontu na úřadu práce. Lidé (data), kteří příjdou dříve, přijdou na řadu první(jsou vrácena dříve). | + | Jsou potřeba dva ukazatele: front (zde jsou odebírána |
| ==== Metody Implementace ==== | ==== Metody Implementace ==== | ||
| - | === Pomocí statického pole === | ||
| - | Řešení pomocí statického | + | === Cyklické |
| + | Při volání | ||
| - | Nevýhodou tohoto způsobu implementace je, že jsme **omezení velikostí** námi vytvořeného pole. Výhodou tohoto řešení je, že vždy za všech okolností **víme, kolik nám zbývá místa** na další data. | + | viz. diagram: |
| - | === Pomocí ukazatelů === | + | {{ : |
| - | Metodu | + | Výhody: |
| + | * O(1) přečtení libovolné hodnoty ve frontě (ne pouze na začátku nebo konci) | ||
| + | * rychlejší než linked list | ||
| + | | ||
| + | | ||
| + | | ||
| + | Nevýhody: | ||
| + | | ||
| + | * téměř vždy O(1) | ||
| + | * O(n) v případě naplnění fronty - musíme celé pole zkopírovat | ||
| + | * může | ||
| + | | ||
| + | * fronta je omezená velikostí ukazatelů - například v Javě má maximální velikost Integer.MAX_VALUE - 8 = 2 147 483 439 | ||
| + | Implementací cyklického pole je například kolekce ArrayDeque v jazyce Java, tady je její zjednodušená verze: | ||
| - | {{: | + | {{: |
| - | ===== Zásobník | + | === Pomocí ukazatelů (Linked list) === |
| - | (anglicky stack) | + | |
| - | Funguje na principu **LIFO** (last in first out), to znamená, že funguje stejně **jako zásobník v samopalu**. Při nabíjení samopalu (vkládání dat) skládáme vždy náboje na spodek zásobníku a vršíme je na sebe, při výstřelu (výběr dat) se náboje berou odvrchu, z toho plyne, že poslední vložený je první | + | Metodu řešení pomocí **ukazatelů** můžeme vidět na níže uvedeném diagramu. Výhoda tohoto řešení je zároveň i jeho nevýhodou – jsme už sice schopni přidávat do fronty příspěvky až do konce paměti, zároveň ale (při špatné implementaci) může dojít k **přehlcení nebo až přetečení paměti**, což může vést k nestabilitě systému. |
| + | |||
| + | {{: | ||
| + | |||
| + | Výhody: | ||
| + | * O(1) složitost přidání hodnoty | ||
| + | * neomezená velikost | ||
| + | * dynamicky se zvětšuje a zmenšuje - neplýtvá pamětí | ||
| + | Nevýhody: | ||
| + | * pomalejší než cyklické pole | ||
| + | |||
| + | Zde je zjednodušená verze kolekce LinkedList v jazyce Java. (V jazyce Java je LinkedList obousměrně vázaný seznam, ale pro jednoduchost je níže implementovaný jako jednosměrně vázaný seznam) | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Zásobník (stack) ===== | ||
| + | |||
| + | Funguje na principu **LIFO** (last in first out), to znamená, že funguje stejně **jako zásobník v samopalu**. Při nabíjení samopalu (vkládání dat) skládáme vždy náboje na spodek zásobníku a vršíme je na sebe, při výstřelu (výběru dat) se náboje berou svrchu – poslední vložený je tedy vystřelen jako první. | ||
| + | |||
| + | Bez zásobníku by v programování nefungovalo volání funkcí. Detailně je to popsáno v tomto [[https:// | ||
| ==== Metody Implementace ==== | ==== Metody Implementace ==== | ||
| Řádek 41: | Řádek 74: | ||
| Řešení zásobníku pomocí statického pole je stejné jako u **fronty**, jediný rozdíl je v tom, že si v další proměnné musíme držet index posledních vložených dat a při zavolání funkce pop() vezmeme data z indexu posledních vložených data a index snížíme o jedna. | Řešení zásobníku pomocí statického pole je stejné jako u **fronty**, jediný rozdíl je v tom, že si v další proměnné musíme držet index posledních vložených dat a při zavolání funkce pop() vezmeme data z indexu posledních vložených data a index snížíme o jedna. | ||
| - | Výhody a nevýhodu | + | Výhody a nevýhody |
| === Pomocí ukazatelů === | === Pomocí ukazatelů === | ||
| - | Řešení pomocí ukazatelů je také podobné jako u **fronty**, znázroněné ho máte na diagramu | + | Řešení pomocí ukazatelů je také podobné jako u **fronty** |
| - | Výhody a nevýhodu jsou stejné jako u fronty. | + | Výhody a nevýhodu jsou opět naprosto |
| {{: | {{: | ||
| - | |||
| - | |||
| - | |||
informatika/maturita/21a.1424536394.txt.gz · Poslední úprava: autor: xmrnustik
