V informatike je dátová štruktúra organizácia a implementácia hodnôt a informácií. Zjednodušene povedané, dátová štruktúra je spôsob efektívnej organizácie údajov. Dátové štruktúry sa od abstraktných dátových typov líšia spôsobom použitia: dátová štruktúra je implementáciou abstraktného dátového typu v konkrétnom a fyzickom prostredí. Robia to pomocou algoritmov. Možno to vidieť na vzťahu medzi zoznamom (abstraktný dátový typ) a prepojeným zoznamom (dátová štruktúra).
Prečo sú dátové štruktúry dôležité? Pretože určujú, ako rýchlo a efektívne môžeme vykonávať základné operácie ako vkladanie, vyhľadávanie, mazanie alebo prechádzanie údajov. Hľadanie najlepšej dátovej štruktúry pri riešení problému je dôležitou súčasťou programovania. Správna voľba môže výrazne zlepšiť časovú a pamäťovú náročnosť programu.
Hlavné operácie a vlastnosti
- Vkladanie (insert) – pridanie novej položky.
- Vymazanie (delete) – odstránenie položky.
- Hľadanie (search) – nájdenie položky podľa hodnoty alebo kľúča.
- Prístup (access) – priamy prístup k položke, ak to štruktúra umožňuje (napr. pole).
- Prechádzanie (traversal) – navštívenie všetkých položiek v určitom poradí.
Základné typy dátových štruktúr (s príkladmi)
- Pole (array) – súvislá sekvencia prvkov rovnakého typu. Umožňuje rýchly priamy prístup podľa indexu (O(1)), ale vkladanie/mazanie uprostred môže byť O(n).
- Prepojený zoznam (linked list) – uzly s ukazovateľmi na ďalšie (a prípadne predchádzajúce) uzly. Efektívne vkladanie a mazanie v ľubovoľnej pozícii, ale priamy prístup je pomalý (O(n)).
- Zásobník (stack) – LIFO (last-in, first-out). Operácie push/pop sú O(1). Použitie: rekurzia, spätné kroky, vyhodnocovanie výrazov.
- Fronta (queue) – FIFO (first-in, first-out). Operácie enqueue/dequeue sú O(1). Použitie: plánovanie úloh, spracovanie udalostí.
- Strom (tree) – hierarchická štruktúra. Binárny strom, vyvážené stromy (AVL, Red-Black) poskytujú efektívne vyhľadávanie, vkladanie a mazanie (zvyčajne O(log n)).
- Binárny vyhľadávací strom (BST) – udržiava poradie; pri vyváženom stave má vyhľadávanie O(log n).
- Hašovacia tabuľka (hash table) – mapuje kľúče na hodnoty pomocou hašovacej funkcie; priemerný čas pre vyhľadanie, vloženie a vymazanie je O(1), v najhoršom prípade O(n).
- Graf (graph) – reprezentuje vzťahy medzi uzlami; používa sa pre siete, mapy, závislosti. Reprezentácia môže byť maticou susednosti alebo zoznamom susedov.
- Množiny a mapy (set, map/dictionary) – abstraktné typy, implementované cez hašovanie alebo stromy; vhodné na rýchle testovanie členstva a priradenie kľúč→hodnota.
Praktické príklady a použitie v programovaní
- Indexované pole pre prístup k prvkom podľa poradia (napr. matice, buffery).
- Prepojené zoznamy v situáciách, kde časté vkladanie/mazanie zaberá menej času ako prekopírovanie poľa.
- Zásobník pri vyhodnocovaní výrazov (postfix), pri spätnom prechádzaní (undo/redo).
- Fronty pri plánovaní úloh, spracovaní požiadaviek alebo BFS (prehľadávanie do šírky) v grafoch.
- Hašovacie tabuľky pre implementáciu slovníkov (dictionary), memoizáciu alebo indexovanie.
- Stromy (napr. segment tree, fenwick tree) pri riešení úloh s intervalovými dotazmi a aktualizáciami.
- Grafy pri modelovaní sietí, plánovaní trás, topologickom triedení závislostí.
Výber správnej dátovej štruktúry
Pri výbere zvážte:
- Časové požiadavky – ktoré operácie musia byť rýchle (vyhľadávanie, vkladanie, mazanie, prístup podľa indexu)?
- Pamäťové obmedzenia – či preferujete súvislé uloženie (pole) alebo rozptýlené (prepojený zoznam).
- Poradie a usporiadanie – potrebujete zachovávať poradie vloženia, triediť dáta alebo udržiavať rýchly prístup podľa kľúča?
- Paralelizmus a zdieľanie – niektoré štruktúry sa ľahšie zdieľajú medzi vláknami alebo sú vhodnejšie pre neblokujúce algoritmy.
Asymptotická zložitosť (príklady)
- Polia: priamy prístup O(1), vkladanie/mazanie O(n) v priemere.
- Prepojené zoznamy: vkladanie/mazanie O(1) pri danom ukazovateli, vyhľadanie O(n).
- Hašovacie tabuľky: priemer O(1) pre vkladanie/vyhľadanie, najhorší prípad O(n).
- Vyvážené stromy: O(log n) pre vkladanie/mazanie/vyhľadávanie.
Implementačné poznámky
- Používajte vstavané knižničné štruktúry jazyka, ak sú dostupné a overené (napr. map, set, vector v C++; ArrayList, HashMap v Jave; list, dict, set v Pythone).
- Pri vlastnej implementácii dbajte na správu pamäti a okrajové prípady (prázdne štruktúry, kolízie v hašovaní, balansovanie stromov).
- Testujte výkon s reálnymi dátami – asymptotika neukáže všetko; konštanty a charakter dát tiež ovplyvnia výsledky.
Zhrnutie: Dátová štruktúra je systematický spôsob ukladania údajov, ktorý spolu s algoritmami určuje, ako efektívne dokážeme dáta spracovať. Rozumný výber dátovej štruktúry je kľúčový pre rýchle a škálovateľné programy.

