Dáta a dátové štruktúry 2. časť: nelineárne, tabuľkové a iné typy dátových štruktúr

V minulom článku sme sa venovali úvodu k dátam a lineárnym dátovým štruktúram. V tomto článku pokračujeme v téme a venujeme sa nelineárnym, tabuľkovým dátovým štruktúram a špecializovaným typom pre konkrétne úlohy.

Nelineárne dátové štruktúry

Teraz si podrobne rozoberieme nelineárne dátové štruktúry, ich základne vlastnosti, typy, výhody a nevýhody, ako aj najčastejšie prípady/príklady použitia.

Strom (Tree)

Strom je základná nelineárna dátová štruktúra, ktorá organizuje dáta hierarchicky. Skladá sa z uzlov, kde každý uzol má jeden nadradený uzol – rodiča (okrem koreňového uzla) a môže mať nula alebo viacero podriadených uzlov – potomkov. Táto štruktúra umožňuje efektívne spracovanie údajov, najmä pri hľadaní, triedení a reprezentácii vzťahov.

Znázornenie binárneho stromu. ZDROJ: hello-algo.com/en/chapter_tree/binary_tree.assets/binary_tree_definition.png
Znázornenie binárneho stromu. ZDROJ: hello-algo.com/en/chapter_tree/binary_tree.assets/binary_tree_definition.png

Základné vlastnosti stromu

Hierarchická štruktúra: Stromy sú usporiadané do hierarchických vrstiev, pričom koreň je na vrchole a uzly pod ním reprezentujú ďalšie úrovne.

Uzly a hrany: Každý uzol obsahuje dáta a odkazy na svoje podriadené uzly. Hrany reprezentujú spojenia medzi uzlami.

Koreň (root): Je najvyšší uzol stromu, ktorý nemá rodičovský uzol.

Listy: Sú uzly, ktoré nemajú žiadnych potomkov (známe aj ako koncové uzly).

Výška stromu: Počet hrán na najdlhšej ceste od koreňa k listu.

Typy stromov

Binárny strom: Každý uzol môže mať najviac dvoch potomkov – ľavý a pravý uzol.

Binárny vyhľadávací strom (BST): Binárny strom, kde ľavé podstromy obsahujú hodnoty menšie ako uzol a pravé podstromy hodnoty väčšie.

Vyvážené stromy: Stromy, ako AVL alebo červeno-čierne stromy, ktoré udržiavajú vyváženú výšku pre efektívnejšie operácie.

N-árny strom: Uzly môžu mať až N podriadených uzlov.

Trie: Špecializovaný strom na efektívne vyhľadávanie, napríklad pri práci so slovami alebo prefixmi.

Výhody použitia stromu

  • Efektívne vyhľadávanie a triedenie: Stromy, najmä binárne vyhľadávacie stromy, umožňujú rýchle vyhľadávanie a usporiadanie dát.
  • Flexibilita reprezentácie: Umožňujú modelovať hierarchické vzťahy, ako organizačné štruktúry, súborové systémy alebo taxonómiu.
  • Dynamická povaha: Stromy môžu rásť alebo sa zmenšovať bez pevne stanovenej veľkosti.

Nevýhody použitia stromu

  • Zložitejšia implementácia: Práca so stromami vyžaduje správu ukazovateľov na uzly stromov, čo môže byť náchylné na chyby.
  • Pamäťová náročnosť: Každý uzol potrebuje dodatočnú pamäť na odkazy na svoje podriadené uzly.
  • Neefektívnosť pri nevyvážených stromoch: Stromy, ktoré nie sú vyvážené, môžu degradovať na lineárnu štruktúru, čo vedie k zhoršeniu výkonu na O(n).

Použitie stromov

  • Databázové indexy: B-stromy a ich varianty sa používajú na efektívne vyhľadávanie a správu veľkých množín dát.
  • Súborové systémy: Stromy reprezentujú štruktúru priečinkov a súborov na disku.
  • Hľadanie ciest v grafoch: Stromy sú základom algoritmov na hľadanie ciest alebo pokrytie grafov.
  • Kompresia dát: Huffmanove stromy sú používané pri algoritmoch na kompresiu, ako je zip alebo gzip.

Príklad použitia

Predstavte si rodokmeň – koreň stromu predstavuje najstaršieho predka a uzly nižšie znázorňujú jeho potomkov. Táto hierarchia je priamym príkladom využitia stromu na organizáciu a prehľadnú reprezentáciu údajov.

Stromy sú jednou z najdôležitejších dátových štruktúr v informatike. Ich schopnosť modelovať zložité vzťahy a efektívne manipulovať s hierarchickými dátami z nich robí neoddeliteľnú súčasť moderných algoritmov a aplikácií.

Graf (Graph)

Graf je nelineárna dátová štruktúra, ktorá reprezentuje objekty (uzly, nazývané vrcholy) a vzťahy medzi nimi (nazývané hrany). Táto štruktúra je mimoriadne univerzálna a používa sa na modelovanie rôznych situácií, ako sú sociálne siete, dopravné mapy alebo vzťahy medzi entitami v databázach.

Existujú rôzne druhy grafov, na obrázku vľavo neorientovaný, vpravo orientovaný. ZDROJ: hello-algo.com/en/chapter_graph/graph.assets/directed_graph.png
Existujú rôzne druhy grafov, na obrázku vľavo neorientovaný, vpravo orientovaný. ZDROJ: hello-algo.com/en/chapter_graph/graph.assets/directed_graph.png

Základné vlastnosti grafu

Vrcholy (Nodes): Základné časti grafu, ktoré reprezentujú objekty alebo entity.

Hrany (Edges): Spojenia medzi vrcholmi, ktoré reprezentujú vzťahy alebo interakcie.

Orientácia: Graf môže byť orientovaný (smerované hrany, napr. jednosmerná ulica) alebo neorientovaný (bez smerovania, napr. obojsmerná cesta).

Váha hrán: Niektoré grafy obsahujú váhy na hranách, ktoré reprezentujú hodnoty ako vzdialenosti, náklady alebo čas.

Typy grafov

Neorientovaný graf (Undirected Graph): Hrany nemajú smer, spojenie medzi dvoma vrcholmi je vzájomné.

Orientovaný graf (Directed Graph alebo Digraph): Hrany majú smer a spájajú vrcholy v určitom poradí.

Vážený graf (Weighted Graph): Hrany majú pridelenú hodnotu (váhu).

Cyklový graf (Cyclic Graph): Obsahuje uzavreté cesty (cykly).

Acyklický graf (Acyclic Graph): Neobsahuje žiadne cykly.

Strom (Tree Graph alebo Tree): Špeciálny prípad acyklického grafu, kde je každý vrchol prístupný cez jednu cestu.

Súvislý graf (Connected Graph): Medzi každými dvoma vrcholmi existuje cesta.

Výhody použitia grafov

  • Flexibilita reprezentácie: Grafy sú vhodné na modelovanie akýchkoľvek vzťahov, od sieťových topológií po interakcie medzi ľuďmi.
  • Efektívne vyhľadávanie: Množstvo algoritmov je optimalizovaných na prácu s grafmi, ako je Dijkstrov algoritmus na hľadanie najkratšej cesty.
  • Možnosť vizualizácie: Grafy sú intuitívne na pochopenie a vizuálnu interpretáciu, čo zjednodušuje analýzu dát.

Nevýhody použitia grafov

  • Pamäťová náročnosť: Ukladanie veľkých grafov, najmä ak sú husté, môže byť veľmi pamäťovo náročné.
  • Zložitosť operácií: Implementácia a správa grafov môže byť zložitá, najmä pri dynamických zmenách.
  • Potenciálna neefektivita: Niektoré algoritmy na grafy majú vysokú časovú zložitosť, čo môže byť problematické pre veľké grafy.

Použitie grafov

  • Sociálne siete: Modelovanie vzťahov medzi používateľmi, ako sú priateľstvá alebo sledovania.
  • Navigácia a doprava: Reprezentácia ciest, železníc alebo leteckých trás.
  • Optimalizácia procesov: Hľadanie najefektívnejšej cesty, minimálneho nákladového stromu alebo maximálneho prietoku.
  • Webové prehľadávače: Vyhľadávače používajú grafy na indexovanie a analýzu spojení medzi webovými stránkami.
  • Biológia a chemické štruktúry: Reprezentácia molekúl, génových sietí alebo evolučných vzťahov.

Príklad použitia

Predstavme si mestskú dopravnú sieť. Každé miesto (zastávka) je vrchol a spojenie medzi zastávkami je hrana. Ak chceme nájsť najrýchlejšiu cestu medzi dvoma miestami, použijeme algoritmus, ktorý prechádza graf a identifikuje najkratšiu trasu.

Grafy sú nenahraditeľné pri riešení komplexných problémov, kde je kľúčové pochopiť a vedieť analyzovať vzťahy medzi objektmi. Vďaka svojej všestrannosti a bohatým možnostiam ich aplikovania sa stali základom mnohých oblastí modernej informatiky.

Tabuľkové dátové štruktúry

Teraz si podrobne rozoberieme tabuľkové dátové štruktúry, ich základne vlastnosti, typy, výhody a nevýhody, ako aj najčastejšie prípady/príklady použitia.

Hašovacia tabuľka (Hash Table)

Hašovacia tabuľka je dátová štruktúra, ktorá implementuje asociatívne pole, v ktorom sa hodnoty (dáta) ukladajú a vyhľadávajú na základe unikátneho kľúča. Používa hašovaciu funkciu, ktorá prevádza kľúč na index v poli, čím umožňuje efektívne ukladanie a prístup k údajom.

Princíp fungovania hašovacej funkcie a tabuľky, ZDROJ: hello-algo.com/en/chapter_hashing/hash_map.assets/hash_function.png
Princíp fungovania hašovacej funkcie a tabuľky, ZDROJ: hello-algo.com/en/chapter_hashing/hash_map.assets/hash_function.png

Základné vlastnosti hašovacej tabuľky

Hašovacia funkcia: Kľúč sa pomocou tejto funkcie prevádza na index v príslušnom poli. Kvalita hašovacej funkcie určuje výkon tabuľky.

Unikátne kľúče: Každý záznam v tabuľke je priradený unikátnemu kľúču.

Kolízie: Ak dva rôzne kľúče generujú rovnaký index, dochádza ku kolízii, ktorá sa rieši špecifickými technikami (napr. separátnym reťazením).

Riešenie kolízií

Separátne reťazenie: Každý index v tabuľke obsahuje zoznam alebo inú štruktúru, do ktorej sa ukladajú všetky hodnoty s rovnakým indexom.

Otvorené adresovanie: Ak nastane kolízia, hľadá sa iný voľný slot podľa určitého vzoru (napr. lineárne alebo kvadratické sondovanie).

Výhody použitia hašovacej tabuľky

  • Rýchlosť operácií: V ideálnom prípade majú operácie vyhľadávania, vkladania a mazania časovú zložitosť O(1).
  • Efektívne využitie pamäte: Tabuľka dynamicky spravuje priestor podľa počtu uložených prvkov.
  • Jednoduchý prístup k údajom: Umožňuje efektívne párovanie a rýchle vyhľadávanie na základe kľúčov.

Nevýhody použitia hašovacej tabuľky

  • Závislosť od hašovacej funkcie: Slabá funkcia môže viesť k častým kolíziám a znížiť výkon.
  • Pamäťová náročnosť: Pri vysokom počte kľúčov môže byť potrebné veľké množstvo pamäte.
  • Neusporiadané dáta: Tabuľka nezachováva poradie záznamov, čo môže byť nevýhodné pri niektorých aplikáciách.

Použitie hašovacej tabuľky

  • Rýchle vyhľadávanie: Používa sa na implementáciu máp, slovníkov a asociatívnych polí vo väčšine programovacích jazykov.
  • Caching: Tabuľky sú základom vyrovnávacích pamätí, kde je rýchly prístup ku často používaným údajom kľúčový.
  • Detekcia duplicít: Rýchlo zistí, či určitý prvok už existuje, čo je užitočné napríklad pri filtroch, ako je Bloomov filter.
  • Databázové indexy: Používa sa na optimalizáciu prístupu k údajom v databázach.
  • Šifrovanie: Hašovacie funkcie sú kľúčové pri generovaní unikátnych kontrolných súčtov.

Príklad použitia

Predstavme si telefónny zoznam, v ktorom chceme rýchlo vyhľadať číslo osoby na základe jej mena. Meno osoby slúži ako kľúč, ktorý sa pomocou hašovacej funkcie prevedie na index. Na tomto indexe je uložené príslušné telefónne číslo.

Hašovacie tabuľky sú výkonnou a efektívnou štruktúrou pre širokú škálu aplikácií, kde je prioritou rýchly prístup k údajom. Ich schopnosť efektívne spracovávať veľké množstvá dát ich robí nenahraditeľnými v celej oblasti IT.

Ďalšie dátové štruktúry

Ešte by som rád stručne spomenul aspoň niektoré menej známe dátové štruktúry, s ktorými sa môžeme v IT stretnúť.

Heap (Halda)

Binárny strom, ktorý spĺňa nasledovnú podmienku (každý rodičovský uzol je väčší alebo menší ako jeho potomkovia). Používa sa na implementáciu prioritných radov alebo v algoritme Heap Sort, ktorý sme si na našom blogu už predstavili.

Trie (Prefixový strom)

Trie je stromová tabuľková štruktúra optimalizovaná na vyhľadávanie reťazcov, kde každý uzol reprezentuje časť kľúča. Používa sa v textových procesoroch, automatickom dopĺňaní alebo pri vyhľadávaní v databázach.

Disjoint Set

Slúži na reprezentáciu a spravovanie množín s disjunktnými prvkami. Používa sa pri grafových algoritmoch, ako je Kruskalov algoritmus.

Segment Tree (Intervalový strom)

Strom navrhnutý na efektívne riešenie problémov spojených s intervalmi a rozsahmi údajov. Je vhodný pre rýchle operácie na určenie sumy, minima alebo maxima v rozsahu.

Fenwick Tree

Efektívna štruktúra na aktualizáciu a vyhľadávanie súčtov v postupnostiach. Používa sa v úlohách, ktoré počítajú rozsahy.

K-D Tree (K-Dimenzionálny strom)

Špecializovaný strom na organizáciu bodov v K-rozmernom priestore. Využíva sa v algoritmoch pre spracovanie obrazu, počítačové videnie a databázové vyhľadávanie.

Suffix Tree

Reprezentuje všetky sufixy daného reťazca. Efektívny je najmä pri hľadaní podreťazcov a textových algoritmoch.

Matrix Table (Maticová tabuľka)

Maticové tabuľky sú dvojrozmerné alebo viacrozmerné polia, ktoré ukladajú dáta v riadkoch a stĺpcoch. Používa sa napr. v lineárnej algebre pre prácu s maticami.

Adjacency Matrix (Matica susedností)

Dvojrozmerná matica, kde riadky a stĺpce reprezentujú vrcholy grafu a hodnoty v matici indikujú existenciu hrán medzi vrcholmi. Používa sa na efektívne reprezentovanie hustých grafov a na rýchle zisťovanie existencie hrany medzi dvoma vrcholmi.

Adjacency List  (Zoznam susedností)

Zoznam, kde každý vrchol grafu obsahuje zoznam všetkých svojich susedných vrcholov. Ideálny na reprezentáciu riedkych grafov, pretože šetrí pamäť v porovnaní s maticou susednosti.

Sparse Matrix (Riedka matica)

Štruktúra na ukladanie matíc s väčšinou nulových hodnôt, kde sa ukladajú iba nenulové hodnoty a ich polohy. Používa sa v oblastiach, ako je strojové učenie, analýza grafov a modelovanie veľkých riedkych dátových štruktúr.

Scatter Table (Rozptylová tabuľka)

Tabuľková štruktúra podobná hašovacej tabuľke, ktorá rieši kolízie alternatívnym spôsobom rozptyľovania kľúčov.  Efektívna na spracovanie veľkého objemu dát s nižším rizikom zhlukovania pri kolíziách v hašovacích štruktúrach.

Záver

Dátové štruktúry predstavujú kľúčový pilier informatiky, umožňujúci efektívnu organizáciu, spracovanie a analýzu dát. Či už ide o nelineárne štruktúry, ako stromy a grafy, tabuľkové štruktúry, ako hašovacie tabuľky, alebo špecializované typy pre konkrétne úlohy, každá z nich má svoje jedinečné vlastnosti a využitie.

Výber správnej dátovej štruktúry závisí od povahy problému, požiadaviek na výkon a obmedzení zdrojov. Tento prehľad poskytuje základný náhľad do sveta dátových štruktúr a ich rôznorodého uplatnenia, ktoré siaha od jednoduchých databázových aplikácií po zložité algoritmy a moderné technológie. Porozumenie týmto konceptom je kľúčom k efektívnemu riešeniu praktických problémov v IT a technológii.

Ak hľadáš prácu a si Java programátor, prezri si naše benefity pre zamestnancov a reaguj na najnovšie ponuky práce.

O autorovi

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Daj nám o sebe vedieť