You are on page 1of 22

Zložitosť

Vyjadrujeme pomocou funkcií , ktorá ukazuje ako sa bude zložitosť algoritmu správať vzhľadom na
množstvo dát. Časovú a pamäťovú Počet operácií vykonávaných v algoritme.

Časová zložitosť udáva počet operácií , ktoré sú potrebne na skončenia algoritmu a môžeme to
vyjadriť vzťahom c*f(n)

Pamäťová zložitosť udáva koľko miesta potrebujeme k vykonaniu algoritmu

N je počet záznamov ,ktoré spracúvame

C to je iba konštanta ,ktorá nám ukazuje kvalitu implementácie (použitý jazyk, prekladač, atď.)

F(n) je typ rádovej závislosti počtu operácií od množstva dát.

Často sa vyskytujúce typy zložitosti algoritmov

Cieľom je minimalizovať hornú asymptotickú zložitosť algoritmu (O). Ω

implicitne – dávame dáta do zoznamu ako arraylist a array a ideš cez indexy

explicitne – dáta sú rôzne v pamäti používajú sa smerníky


Zložitosti
Hashovacia tabuľka:

Vlož: O(1)

Zruš: O(1)

Nájdi: O(1)

-Podľa toho aká je použitá hashovacia funkcia a záleží aj od toho ako sú riešené kolízie, najlepšie
z riešení je reťazenie.

Sekvenčná utriedená tabuľka:

- Založená na poli

Vlož: O(N) - posúvať prvky v tabuľke

Zruš: O(N) – posúvať prvky v tabuľke

Nájdi: O(log N) - bisekcia

Sekvenčná neutriedená tabuľka:

Vlož: O(1) – vkladám na koniec (nezisťujem či mám duplicitný kľúč – ak áno O(N))

Zruš: O(1) (ak nezarátava m nájdi, ak áno O(N))

Nájdi: O(N)

Kosoštvorcovo utriedená tabuľka:

Vlož: O(Sqrt(N))

Zruš: O(Sqrt(N))

Nájdi: O(Sqrt(N))

Binárny vyhľadávací strom

Vlož: O(log N) až O(N) – bisekcia

Zruš: O(log N) až O(N) - bisekcia

Nájdi: O(log N) až O(N) - bisekcia

O(N) pri degenerácií – stále pridávam väčšie ako koreň alebo menšie ako koreň.

*Operácia zruš nezahŕňa vyhľadávanie prvku.

*Operácia vlož prvok nezahŕňa kontrolu unikátnosti.


Zreťazená tabuľka

Vlož: O(1)

Zruš: O(1)

Nájdi: O(N)

Treap

Vlož: O(log N)

Zruš: O(log N)

Nájdi: O(log N)

Všetko závisí od toho aké hodnoty generuje generátor.

Stromy
 Koreň (nemá otca)
 Priamy predok – otec
 Priamy potom – syn
 Vnútorný vrchol – má potomkov
 List – nemá potomkov (nemá syna)

Usporiadané – najstarší syn, mladší brat


Neusporiadané – neusporiadaní potomkovia

Plný k-cestný – má k počet synov alebo aj žiadneho syna


Kompletný – listy majú hĺbku n alebo n-1, všetky listy s hĺbkou n ležia vľavo

Perfektný k-cestný – nič mu nechýba, všetky vrcholy majú rovnakú hĺbku a všetky vnútorné vrcholy
majú stupeň k

Viaccestný strom
každý vrchol obsahuje:
Dáta, Odkaz na otca,
Odkazy na synov organizované v zozname
(zoznam lebo neviem koľko bude synov)

K cestný
nemá synov v zozname ale v poli
Binárny strom
má iba dvoch potomkov (ľavý / pravý syn)
operácie : Vytvor vlož syna odober syna existuje syn a getsyn alebo brat

Prešitý binárny strom –


Implementujeme explicitne a
Vieme skákať po spodku postupne za radom
Ak neexistuje ľavý syn, tak príslušný odkaz smeruje na InOrder predchodcu.
 Ak neexistuje pravý syn, tak príslušný odkaz smeruje na InOrder nasledovníka.

Unárny strom
Každý vrchol má vlastne iba odkaz na svojho otca

A potrebujeme pri ňom poznať listy stromu

Transformácia viaccestného stromu na binárny strom


Princíp pravý syn – ďalší súrodenci.

Ako referencie používať čísla nie pointre (globálny) pri kopírovaní pomôže
Prehliadky:
filozofia ako sa spracujú vrcholy , názov metódy už zmeníme

PreOrder od koreňa
- V priamom poradí
- Prehliadka do hĺbky
- Najskôr vrchol, potom všetkých synov (cele vetvy)
- Rekurzia , volá sa v metóde
- Keby sme chceli nerekurzívne tak v staku to vieme samy pushovať a potom popovať
- Nevyalokujeme toľko rámcov v callstaku ak by bolo veľa vtedy by sme si to robili sami na
halde

PostOrder od listov
- Prehliadky v spätnom poradí
- Prehliadky do hĺbky
- Najskôr synov, potom vrchol
(ak nemáš syna vypíš)
- Čiže iba v kóde by sme dali výpis za for

InOrder (binarny strom)


- Prehliadka do hĺbky
- Najskôr ľavého syna potom seba a nakoniec pravého
- Iba pri binárnom strome

LevelOrder
- Prehliadka po úrovniach
- Prehliadka do šírky, využíva front
- Nedá sa rekurzívne
Tabuľky
Z pohľadu ÚDŠ to je nejaký abstraktný dátový typ , kde sú záznamy s rovnakou štruktúrou

Prvok je charakterizovaný dátami a jednoznačným kľúčom.

Každý kľúč v tabuľke je unikátny

Kľúč môže byť


Prirodzený – niektorý z atribútov má vlastnosť kľúča (unikátny) (rod. Číslo)

Umelý – tvorí umelo definovaný atribút (nejaké ID) skupina kľúčov

IMPLICITNE IMPLEMENTACIE
TABULIEK
SEKVENČNÁ
Utriedená
Vlož(kľuč) : musí posunúť prvky a vložiť O(n) kvôli posunu

Zruš(kľuč): Nájde index prvku s kľúčom a posunutie prvkov od nájdeného indexu o 1 doľava O(n)

Nájdi(kľuč): využíva bisekciu (polenie intervalov, interpolačné vyhľadávanie)

Interpolačné vyhľadávanie

- Použité v  implicitných sekvenčných utriedených štruktúrach ,pole arraylist


- Pracuje na princípe polenia intrevalov pričom na začiatku je interval celé pole
- Pokúsi sa nájsť prvok v strede intervalu, ak sa nepodarí, zopakuje hľadanie na ľavom ( ak je
kľúč menší ako kľúč v strede) alebo na pravom (v opačnom prípade)
- Vylúči polovicu prvkov – logaritmická zložitosť
-

SEKVENČNÁ
Neutriedená
vhodné v prípade, ak sú operácie Vlož prvok a Zruš prvok zriedkavé

Vlož(kľuč) :

na koniec zoznamu , nezabudnúť skontrolovať unikátnosť O(n)

Zruš(kľuč):

vymení prvok s posledným a ten odstráni O(n)+1


Nájdi(kľuč):

postupne prechádza všetky prvky hľadá prvok s kľúčom.

TableItem zaobalím

Kosoštvorcovo utriedená tabuľka


Čiastočne utriedená štruktúra

Predchodcovia prvku (ľavý horný a ľavý doľný) majú menšiu


hodnotu kľúča,

Nasledovníci (pravý horný, pravý dolný) majú väčšiu hodnotu


kľúča)

Vlož : najspodnejšiu úroveň najbližšie volné a potom sa robí výmena napravo s menším a nalavo
s väčším

Vyhladaj: od korena a porovnaj pravé a lavé s tým čo sa hladá (SQRT^N)

Odstráň : daj ho na koniec vymeň a potom porovnávať

ADS tabuľká s rozptýlenými záznamami


Iba v polu lebo počítča klúč

Je to tabuľka ktorú tvorí pole nejakých prvoch spájajúcich kľúč s dátami

Adresa sa vypočíta hashovacou funkciou H

Vzkladanie mazanie a hľadanie prvkov pomocou H


Riešenie Kolízií
Kolízie na jednom mieste ak by ich hashe boli rovnaké ale kľúče iné

Opätovné hashovanie
Viac hashovacích funkcií

Otvorená adresácia -
Sondovanie – pozrieme susedov
sekvenčné 123
lineárne 1*d,2*d.3*d
kvadratické 1^2 2 ^2 3^2

Zreťazovanie , podzoznami
Vkladám tabuľky a do nich až dáta
Preplňovania oblasť
Rozdelené na 2 časti
Primárna oblast a preplňovacia oblasť

Zložitosť operácií
EXPLICITNE IMPLEMENTACIE TABULIEK
Z pohľadu ÚŠ to je nejaký abstraktný dátový typ , kde sú záznamy s rovnakou štruktúrou

Prvok je charakterizovaný dátami a jednoznačným kľúčom.

Každý kľúč sa môže v tabuľke vyskytovať iba raz.

Kľúč môže byť

- Prirodzený – niektorý z atribútov má vlastnosť kľúča (unikátny) (rod. Číslo)


- Umelý – tvorí umelo definovaný atribút (nejaké ID) skupina kľúčov

Zreťazená tabuľka

Nemá význam držať tabuľku utriedenú.

Tabuľka implementovaná zoznamom.

Oplatí sa len keď máme malý počet dát, inak začína byť neefektívna.

Nemáme indexy , nedá sa bisekcia

Binárny vyhľadávací strom BVS


Je to tabuľka ! Nie strom !

Každý vrchol stromu obsahuje navyše informácie o kľúči a dátach.

Pre každý vrchol v BVS platí:

- V ľavom podstrome sa nachádzajú vrcholy ktoré su menšie ako koreň


- V pravom podstrome sa nachádzajú vrcholy ktoré sú väčšie ako koreň

Môže degenerovať!!!! (Ak nemá správne dáta.) samé nižšie nižšie ..

Nájdi prvok - ide sa od koreňa

Vlož prvok – ako list na koniec

Vymaž, ak prvok je list iba vymažem

1 syna – prepojí,

ak 2 synov, prehliadkov in order

In order následovník – raz do prava a potom doľava kým môžem

In order predchodca – raz do ľava a potom doprava kým môžem

Môžem si vybrať in order predchodca alebo in order nasledovník.


Treap

EXPLICITNE IMPLEMENTACIE TABULIEK


Je binárny vyhľadávacím stromom s haldovým usporiadaním.

Haldové usporiadanie – prvky sa ukladajú zľava a otec má rovnakú alebo vyššiu prioritu ako synovia.

Snaží sa strom balancovať – aby nedegeneroval.

Každý vrchol okrem ukazovateľov na otca a synov, bude obsahovať prioritu. –

cena za väčšiu pamäťovú zložitosť – zefektívnenie zložitosti.

Prioritu vlastne dáva ddátam náhodne treap – na obrovskom intervale náhodne. (neriešime prioritu
– nemusí byť unikátna)

Treap nezaručuje že bude perfektne usporiadaný – všetko záleží od toho aké hodnoty dostane
z generátora.

Vlož: Ak má prvok väčšiu prioritu ako jeho otec, rotujem v smere otca.

Nájdi: totožná s BVS

Zruš: Nastavím vymazávanému prvku prioritu na INF a prerotovať ho až na list.

Pridávanie do treapu

Rotácie v treape

A musíme rotovať
V ľavom podstrome V, je určite menší kľuč, takže musím pri rotácií dať V do pravého pod

V pravom podstrome je určite väčší kľúč takže V musím dať ako ľavého syna.
Zložitosti
Hashovacia tabuľka:

Vlož: O(1)

Zruš: O(1)

Nájdi: O(1)

-Podľa toho aká je použitá hashovacia funkcia a záleží aj od toho ako sú riešené kolízie, najlepšie
z riešení je reťazenie.

Sekvenčná utriedená tabuľka:

- Založená na poli

Vlož: O(N) - posúvať prvky v tabuľke

Zruš: O(N) – posúvať prvky v tabuľke

Nájdi: O(log N) - bisekcia

Sekvenčná neutriedená tabuľka:

Vlož: O(1) – vkladám na koniec (nezisťujem či mám duplicitný kľúč – ak áno O(N))

Zruš: O(1) (ak nezarátava m nájdi, ak áno O(N))

Nájdi: O(N)

Kosoštvorcovo utriedená tabuľka:

Vlož: O(Sqrt(N))

Zruš: O(Sqrt(N))

Nájdi: O(Sqrt(N))

Binárny vyhľadávací strom

Vlož: O(log N) až O(N) – bisekcia

Zruš: O(log N) až O(N) - bisekcia

Nájdi: O(log N) až O(N) - bisekcia

O(N) pri degenerácií – stále pridávam väčšie ako koreň alebo menšie ako koreň.

*Operácia zruš nezahŕňa vyhľadávanie prvku.

*Operácia vlož prvok nezahŕňa kontrolu unikátnosti.


Zreťazená tabuľka

Vlož: O(1)

Zruš: O(1)

Nájdi: O(N)

Treap

Vlož: O(log N)

Zruš: O(log N)

Nájdi: O(log N)

Všetko závisí od toho aké hodnoty generuje generátor.


Triedenie tabuliek
Proces pre usporiadania množiny objektov v špecifickom poradí.

Na množine kľúčov musí byť definované úplne usporiadanie. (všetky relačné operátory) =+-

Priama skvenčná tabulka alebo súbor 1ková zložitosť

Podľa umiestnenia tabuľky, môže byť triedenie:

 vnútorné – celá tabuľka je v operačnej pamäti počítača alebo

 vonkajšie – tabuľka je mimo operačnej pamäti počítača (súbor na disku).

Prirodzenosť a na mieste

Viac filtrov stabilný algoritmus

Select Sort

Na mieste - neutralny O(N2)

Triedenie priamym výberom

Vždy musí byť N2 vyberieme najlepší a dáme na začiatok

Insert Sort

O(N2)

Na mieste, prirodzeny.

Triedenie

Naozaj insertom musíme to celé posúvať neprechádzam do konca !

A strčím na spravne miesto


Bubble Sort

O(N2) – najhoršie keď sú od najväčšieho po najmenší.

- prirodzený, stabilný , Na mieste,(kedem byte a bool)


- Porovnávame susedné a značíme si či sme spravili výmenu ked bude false končíme
- Iba po jednom prvku a na začiatku nastavím vždy false

Efektívnejšie sorty:
Quick Sort

O(N*log2N) – O(N2)Nedá sa povedať či je prirodzený alebo neprirodzený. Na mieste

Zložitosť závisi od výberu pivota. Ak sa vyberie medián, zložitosť je logaritmická ak maximum alebo
minimum, zložitosť je N2.

Prehádžeme všetko naľavo a napravo

Pivot min + max div 2


Heap Sort

O(N*log2N)

Stojí na ľavostrannej halde. Dávam do haldy vyberám a triedim.

Nieje na mieste, neutrálny.

Radix sort

O(k*N)

Podľa 1, 10, 100 – FIFO.

-nieje na mieste

-neutrálny

Merge Sort

O(N*log2N)

Dvojice, štvorice, osmice..... atď porovnávam 2 prioritné fronty medzi sebou, menší prvý prvok
vyberám.

-nieje na mieste

-neutrálny

Shell Sort

O(N1,2)

Rozdelím si množinu prvkov do 3 tabuliek.

-nie je na mieste

-neutrálny
Stack vs Heap(halda)
Stack skladá dáta na seba, posúva stack pointer a ukladá dáta zaradom.

prvý dáš a prvý vyberáš nehľadáš

Stack je o dosť rýchlejší ako heap.

Stack sa vymaže sám po ukončení aplikácie.

Blok v stacku – rámec.

New – malloc ( memory allocation)

Heap

Udržiava dynamicky vytvorené premené (new calloc malloc ).

ukladá dáta náhodne. Musí prehľadávať free list, nájsť dostatočne veľký blok.

Heap musíme ručne vymazávať a uvoľnovať pamäť.

Adresou, odkazom(najefektivnejsi), poslem objekt.

Stack Overflow
Pretečenie stacku zásobníka

Rozdeľuj a panuj
Techniky založené na rekurzii

Napríklad pri bisekcií


Pamovacia funkcia
Dvojrozmerné

Prešité pole
Implementácia poľa pomocou zoznamov (explicitná implementácia)

Používa sa pre implementáciu riedkych polí , ktoré obsahujú málo prvkov , teda nenulových prvkov
Backtracking

Techniky založené na rekurzii , napríklad preorder pri stromoch

You might also like