Podcast o Binárny vyhľadávací strom

Binárny Vyhľadávací Strom: Komplexný Rozbor pre Študentov

Podcast

Binárne Vyhľadávacie Stromy: Od Základov po Maturitu0:00 / 12:49
0:001:00 zostáva
MarekČo je tá jedna operácia pri binárnych vyhľadávacích stromoch, ktorá na skúške potrápi osem z desiatich študentov? A ako sa postarať o to, aby si ju už nikdy, ale naozaj nikdy, neurobil zle?
TerezaPresne tak. Existuje jeden zákerný scenár, ktorý vyzerá zložito, ale keď pochopíš jeho logiku, stane sa tvojou tajnou zbraňou. A my si dnes ukážeme presne to.
Kapitoly

Binárne Vyhľadávacie Stromy: Od Základov po Maturitu

Délka: 12 minut

Kapitoly

Úvodná finta

Čo je to BST?

Zlaté pravidlo BST

Vyhľadávanie a vkladanie

To najťažšie: Mazanie

Pozor na rovnováhu

Prechody stromom

Interaktívna simulácia

Zhrnutie a záver

Přepis

Marek: Čo je tá jedna operácia pri binárnych vyhľadávacích stromoch, ktorá na skúške potrápi osem z desiatich študentov? A ako sa postarať o to, aby si ju už nikdy, ale naozaj nikdy, neurobil zle?

Tereza: Presne tak. Existuje jeden zákerný scenár, ktorý vyzerá zložito, ale keď pochopíš jeho logiku, stane sa tvojou tajnou zbraňou. A my si dnes ukážeme presne to.

Marek: Počúvate Studyfi Podcast. Poďme rovno na to. Tereza, začnime úplne od základov. Čo to vlastne je ten binárny vyhľadávací strom, alebo teda BST?

Tereza: Jasné. Predstav si BST ako takú veľmi organizovanú knižnicu pre dáta. Je to dátová štruktúra, ktorá nám umožňuje extrémne rýchlo vyhľadávať, vkladať a mazať informácie. Kľúčové je to slovo „vyhľadávací“.

Marek: Organizovaná knižnica... to sa mi páči. Ale používa to zvláštne pojmy, však? Uzol, koreň, list... znie to skôr ako hodina biológie.

Tereza: Máš pravdu, ale je to celkom intuitívne. Uzol je jednoducho jeden prvok v strome, ktorý drží nejakú hodnotu. Koreň je ten najvyšší uzol, úplný začiatok. Nemá nad sebou žiadneho rodiča.

Marek: Okej, takže koreň je ako riaditeľ školy. A čo sú potomkovia a rodičia?

Tereza: Presne tak. Každý uzol môže mať pod sebou ďalšie uzly – to sú jeho potomkovia. A naopak, uzol nad nimi je ich rodič. V binárnom strome má každý rodič maximálne dvoch potomkov: ľavého a pravého.

Marek: A list? To bude asi uzol, ktorý už nemá žiadnych potomkov, však? Je na konci vetvy.

Tereza: Presne! Je to konečná stanica. A ešte jedna vec: akýkoľvek uzol a všetci jeho potomkovia tvoria takzvaný podstrom. Je to ako strom v strome.

Marek: Dobre, v tom mám jasno. Ale čo robí binárny *vyhľadávací* strom takým špeciálnym? Aký je rozdiel oproti len tak nejakému binárnemu stromu?

Tereza: A to je tá najdôležitejšia otázka! Kľúčom je jedno zlaté pravidlo. Pre každý jeden uzol v strome platí, že všetky hodnoty v jeho ľavom podstrome sú menšie ako hodnota samotného uzla.

Marek: A v pravom sú teda... väčšie?

Tereza: Áno! Všetky hodnoty v pravom podstrome sú vždy väčšie. Ľavý je menší, pravý je väčší. To je všetko. Toto pravidlo musí platiť pre celý strom, vrátane všetkých jeho podstromov.

Marek: Aha! Takže ak mám v koreni číslo 50 a hľadám 25, viem na sto percent, že musím ísť doľava. Nemusím vôbec kontrolovať pravú stranu stromu.

Tereza: Presne tak! A práve si objavil, prečo sú BST tak efektívne. Na každom kroku zredukuješ problém na polovicu. Namiesto prehľadávania všetkého sa len rozhoduješ: idem vľavo alebo vpravo? Je to ako hra „hádam, na čo myslím“, ale so super stratégiou.

Marek: Super, to dáva dokonalý zmysel. Poďme si teda prejsť tie základné operácie. Ako presne vyzerá vyhľadávanie?

Tereza: Je to presne to, čo si opísal. Začneš pri koreni. Porovnáš hľadanú hodnotu s hodnotou uzla. Ak sa zhodujú, super, našiel si ju. Ak je menšia, ideš k ľavému potomkovi. Ak je väčšia, k pravému.

Marek: A opakujem to, kým ju nenájdem... alebo kým nenarazím na slepú uličku, teda na prázdny odkaz, však?

Tereza: Bingo. Ak sa dostaneš na miesto, kde by mal byť potomok, ale nie je tam nič (teda null), znamená to, že hľadaná hodnota v strome jednoducho neexistuje.

Marek: Logické. A čo vkladanie? Stavil by som sa, že to bude veľmi podobné.

Tereza: Tvoja stávka by bola výherná. Vkladanie je v podstate vyhľadávanie miesta, kam nový prvok patrí. Prechádzaš stromom podľa zlatého pravidla – menší vľavo, väčší vpravo – až kým nenarazíš na prázdne miesto. A presne tam vytvoríš nový uzol s vkladanou hodnotou.

Marek: Takže v podstate hľadám, kde by prvok *mal byť*, a keď zistím, že tam nie je, tak ho tam pridám. Čo ak by som chcel vložiť hodnotu, ktorá už v strome je? Napríklad dvakrát číslo 30?

Tereza: Dobrá otázka. Štandardne sa v BST duplicitné hodnoty nepovoľujú. Ak by si sa pokúsil vložiť existujúcu hodnotu, operácia by sa jednoducho ignorovala. Strom zostane nezmenený.

Marek: Dobre, a teraz sa dostávame k tomu, čo si spomínala na začiatku. Tá operácia, ktorá všetkých tak trápi. Mazanie.

Tereza: Áno. Toto je ten moment, kedy treba dávať pozor. Mazanie je zložitejšie, pretože musíme odstrániť uzol a zároveň zabezpečiť, aby zlaté pravidlo zostalo neporušené. Máme tri možné prípady.

Marek: Okej, poďme na prvý. Ten bude asi najľahší, nie?

Tereza: Presne. Prípad číslo jedna: uzol, ktorý chceme zmazať, je list. To znamená, že nemá žiadnych potomkov. Tu je to hračka. Jednoducho ho odstránime a jeho rodičovi povieme, že na tom mieste už nič nie je. Problém vyriešený.

Marek: To znie fajn. Aký je druhý prípad?

Tereza: Druhý prípad: uzol, ktorý mažeme, má jedného potomka. Či už ľavého alebo pravého. Aj toto je stále celkom jednoduché. Ten mazaný uzol jednoducho „preskočíme“ a jeho rodiča napojíme priamo na jeho jediného potomka. Predstav si to ako výmenu jedného článku v reťazi.

Marek: Dobre, zatiaľ to zvládam. A teraz... ten obávaný tretí prípad.

Tereza: A teraz ten zlatý klinec programu. Prípad tri: uzol, ktorý chceme zmazať, má dvoch potomkov. Tu je ten háčik. Nemôžeme ho len tak vyhodiť, lebo by sme stratili celú jednu vetvu stromu a nevedeli by sme, kam ju pripojiť.

Marek: A čo teda urobíme? Ako to vyriešime bez toho, aby sme všetko pokazili?

Tereza: Musíme nájsť vhodného náhradníka za ten mazaný uzol. A tu prichádza ten „aha“ moment. Náhradníkom musí byť buď prvok, ktorý je *hneď ďalší v poradí* (tzv. inorder successor), alebo prvok, ktorý je *hneď pred ním* (inorder predecessor).

Marek: Počkaj, ako ho nájdem? Kde ho hľadať?

Tereza: Je to jednoduchšie, než to znie. Ak chceš nájsť nástupcu, teda najbližšiu väčšiu hodnotu, urobíš jeden krok doprava (do pravého podstromu) a potom ideš stále, stále doľava, až kým sa dá. Ten najľavejší prvok v pravom podstrome je tvoj náhradník.

Marek: Jeden krok doprava a potom úplne doľava... zapamätám si. A čo potom?

Tereza: Potom hodnotu tohto náhradníka skopíruješ na miesto uzla, ktorý chceš vymazať. A nakoniec vymažeš toho náhradníka z jeho pôvodného miesta. A to už je hračka, lebo ten náhradník bude mať buď nula alebo jedného potomka, takže sme späť v prípade 1 alebo 2.

Marek: Chápem! Takže my vlastne nezmažeme priamo ten uzol s dvoma potomkami. My len prepíšeme jeho hodnotu hodnotou jeho nástupcu a potom zmažeme toho nástupcu, čo je už oveľa jednoduchšie. Geniálne!

Tereza: Presne tak! To je celé tajomstvo, ktoré potrápi 80% študentov. Nejde o zmazanie, ale o nahradenie a následné zmazanie jednoduchšieho prípadu. Ak si toto zapamätáš, máš vyhraté.

Marek: Super, toto bol naozaj skvelý tip. Ale počul som, že pri BST môže nastať ešte jeden problém. Čo ak sa strom stane... nevyváženým?

Tereza: Áno, to je veľmi dôležitý bod. Výkonnosť všetkých operácií závisí od výšky stromu. V ideálnom, pekne vyváženom strome, kde sú vetvy zhruba rovnako dlhé, sú operácie super rýchle. Ich zložitosť je O(log n).

Marek: Čo je extrémne efektívne. Ale čo sa stane, ak vyvážený nie je?

Tereza: Predstav si, že by si do prázdneho stromu vkladal čísla pekne po poriadku: 10, 20, 30, 40, 50. Čo sa stane?

Marek: No... 20 je väčšie ako 10, pôjde doprava. 30 je väčšie ako 20, pôjde doprava. 40 je väčšie ako 30... ono to vytvorí len jednu dlhú čiaru, však?

Tereza: Presne! Z krásneho rozvetveného stromu sa stane degenerovaný strom, ktorý vyzerá ako obyčajný zoznam. A v takom prípade sa časová zložitosť operácií zhorší na O(n). Stratili sme celú výhodu BST.

Marek: Takže z rýchleho vyhľadávania sa stane pomalé prehľadávanie prvok po prvku. Preto existujú tie pokročilejšie stromy, ako AVL alebo červeno-čierne, ktoré sa samy vyvažujú, že?

Tereza: Presne tak. Tie sú nadstavbou BST a riešia presne tento problém. Ale pre pochopenie základov je kľúčové vedieť, prečo je vyváženie dôležité.

Marek: Výborne. Na záver si ešte poďme povedať, ako môžeme stromom prechádzať. Počul som o troch spôsoboch: inorder, preorder a postorder.

Tereza: Áno, to sú tri základné metódy, ako systematicky navštíviť každý jeden uzol v strome. Líšia sa len v poradí, v akom navštívia uzol, jeho ľavý podstrom a pravý podstrom.

Marek: Ktorý je ktorý?

Tereza: Najdôležitejší pre BST je inorder prechod. Jeho pravidlo je: najprv ľavý podstrom, potom koreň, potom pravý podstrom. A teraz hádaj, čo sa stane, keď urobíš inorder prechod na BST?

Marek: Hm... ľavý je menší, potom koreň, potom pravý... ono to vypíše všetky prvky usporiadané od najmenšieho po najväčší!

Tereza: Presne! To je ďalšia magická vlastnosť BST. Inorder ti dá perfektne zoradený zoznam. Je to skvelý spôsob, ako si overiť, či je tvoj strom správny.

Marek: A tie ostatné dva? Preorder a postorder?

Tereza: Preorder ide v poradí: koreň, potom ľavý, potom pravý podstrom. To sa hodí napríklad na vytvorenie kópie stromu. A postorder robí presný opak: najprv ľavý, potom pravý podstrom, a až na úplný záver navštívi koreň. To sa často používa pri mazaní celého stromu, lebo začínaš od listov.

Marek: Takže to bola teória... ale úprimne, kým si to človek neosahá, je to trochu abstraktné. Existuje nejaký spôsob, ako to vidieť v praxi?

Tereza: Absolútne! A to nás privádza k najlepšej časti – k interaktívnym simuláciám. Sú to fantastické nástroje, kde si môžeš všetko vizuálne odskúšať.

Marek: Super, takže môžem len tak klikať a vkladať čísla?

Tereza: Presne tak. Skús vkladať čísla náhodne a uvidíš, ako strom pekne rastie. Potom ale skús vkladať čísla pekne po poriadku – vzostupne. Všimneš si niečo zvláštne.

Marek: Čo konkrétne?

Tereza: Strom sa zvrhne na obyčajný zoznam. Bude úplne vychýlený na jednu stranu. Je to ako stavať vežu z Jengy a všetky kocky dávať len na kraj.

Marek: To by som určite prehral. A čo mazanie?

Tereza: Mazanie je tiež skvelé na pozorovanie. Môžeš odstrániť list, uzol s jedným potomkom, alebo ten najzložitejší prípad – uzol s dvoma potomkami. Simulácia ti ukáže, ako sa strom preskupí, aby zachoval svoje pravidlá.

Marek: Kľúčový poznatok teda je... že simulácie nám pomôžu pochopiť, prečo je vyváženie stromu kritické pre tú slávnu rýchlosť O(log n).

Tereza: Presne tak. Dúfam, že vám to všetko dáva zmysel. Binárne stromy sú mocný nástroj.

Marek: Určite áno. Týmto sme na konci dnešného dielu. Ďakujeme, že ste s nami študovali. Tereza, ďakujem za skvelé vysvetlenia.

Tereza: Aj ja ďakujem, bolo mi potešením. Majte sa!

Marek: Počujeme sa nabudúce v Studyfi Podcaste. Učte sa efektívne!