Professional Documents
Culture Documents
Čičmany
Čičmany
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)
C to je iba konštanta ,ktorá nám ukazuje kvalitu implementácie (použitý jazyk, prekladač, atď.)
implicitne – dávame dáta do zoznamu ako arraylist a array a ideš cez indexy
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.
- Založená na poli
Vlož: O(1) – vkladám na koniec (nezisťujem či mám duplicitný kľúč – ak áno O(N))
Nájdi: O(N)
Vlož: O(Sqrt(N))
Zruš: O(Sqrt(N))
Nájdi: O(Sqrt(N))
O(N) pri degenerácií – stále pridávam väčšie ako koreň alebo menšie ako koreň.
Vlož: O(1)
Zruš: O(1)
Nájdi: O(N)
Treap
Vlož: O(log N)
Zruš: O(log N)
Nájdi: O(log N)
Stromy
Koreň (nemá otca)
Priamy predok – otec
Priamy potom – syn
Vnútorný vrchol – má potomkov
List – nemá potomkov (nemá syna)
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
Unárny strom
Každý vrchol má vlastne iba odkaz na svojho otca
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
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
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)
Interpolačné vyhľadávanie
SEKVENČNÁ
Neutriedená
vhodné v prípade, ak sú operácie Vlož prvok a Zruš prvok zriedkavé
Vlož(kľuč) :
Zruš(kľuč):
TableItem zaobalím
Vlož : najspodnejšiu úroveň najbližšie volné a potom sa robí výmena napravo s menším a nalavo
s väčším
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
Zreťazená tabuľka
Oplatí sa len keď máme malý počet dát, inak začína byť neefektívna.
1 syna – prepojí,
Haldové usporiadanie – prvky sa ukladajú zľava a otec má rovnakú alebo vyššiu prioritu ako synovia.
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.
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.
- Založená na poli
Vlož: O(1) – vkladám na koniec (nezisťujem či mám duplicitný kľúč – ak áno O(N))
Nájdi: O(N)
Vlož: O(Sqrt(N))
Zruš: O(Sqrt(N))
Nájdi: O(Sqrt(N))
O(N) pri degenerácií – stále pridávam väčšie ako koreň alebo menšie ako koreň.
Vlož: O(1)
Zruš: O(1)
Nájdi: O(N)
Treap
Vlož: O(log N)
Zruš: O(log N)
Nájdi: O(log N)
Na množine kľúčov musí byť definované úplne usporiadanie. (všetky relačné operátory) =+-
Prirodzenosť a na mieste
Select Sort
Insert Sort
O(N2)
Na mieste, prirodzeny.
Triedenie
Efektívnejšie sorty:
Quick Sort
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.
O(N*log2N)
Radix sort
O(k*N)
-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)
-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.
Heap
ukladá dáta náhodne. Musí prehľadávať free list, nájsť dostatočne veľký blok.
Stack Overflow
Pretečenie stacku zásobníka
Rozdeľuj a panuj
Techniky založené na rekurzii
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