Professional Documents
Culture Documents
Suchalova Silvia AUS1
Suchalova Silvia AUS1
Žiline
Fakulta riadenia a informatiky
Silvia Šúchalová
5ZY 035
2019/2020
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
1.1 ArrayList
ArrayList je štruktúra, ktorá uchováva prvky toho istého dátové typu. Prvky majú
svoju konkrétnu pozíciu v zozname, ktorá je reprezentovaná indexom. Implementovaná
je implicitne, čiže pomocou poľa. To znamená, že najskôr sa vyalokuje súvislý blok pamäti
o určitej veľkosti (Array), a následne sa doň vkladajú prvky. Na to, aby sme vedeli
s ArrayListom pracovať, potrebujeme mať implementované operácie.
Vlož prvý: operácia má zložitosť O(n), pretože treba posúvať prvky v pamäti o jednu
pozíciu doľava, aby sme uvoľnili miesto pre vloženie prvku na prvý, resp. nultý index. Pri
alokácii pamäti dosiahneme zložitosť O(m*n)
Vlož posledný: pokiaľ ArraList nedosiahol veľkosť Arrayu, tak zložitosť je O(1), pretože
sa vloží prvok na koniec zoznamu bez žiadneho posúvania prvkov/alokovania pamäti
(inak O(n))
Vlož na index: zložitosť operácie je O(n), kvôli presúvaniu prvkov pre vyhradenie
miesta vkladanému prvku. Ak ale treba ešte alokovať nové miesto, tak nastáva zložitosť
O(m*n)
Zruš prvý: nadobúda zložitosť O(n) kvôli posunu prvkov doprava pri odstránení prvku
z nultého indexu
Zruš posledný: ľahký prístup na index posledného prvku, čo znamená zložitosť O(1)
Zruš na indexe: podobne ako pri „zruš prvý“ len zo stredu ArrayListu, O(n)
Sprístupni: rýchly prístup priamo na index, O(1)
Nastav: taktiež rýchly prístup na index a len nastavenie prvku, O(1)
Index prvku: kvôli tomu, že hľadáme index podľa prvku, nemáme priamy prístup na
indexy, je potrebné prehľadávať ArrayList, čo zaručuje zložitosť O(n)
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
1.2 LinkedList
Vyznačuje sa tým, že prvky nie sú (nemusia byť) uložené v pamäti súvisle za sebou,
ale sú zreťazené (odkaz na nasledovníka). Zoznam si udržiava v sebe prístup na prvý
a posledný prvok v zozname. Na začiatku nie je alokované žiadne miesto pre prvky,
pretože ide o dynamickú štruktúru a alokuje si pamäť podľa potreby. Operácie nad
LinkedListom:
Vlož prvý: zmení sa len ukazovateľ z aktuálne prvého na vkladaný prvok, O(1)
Vlož posledný: v našom prípade si ukladáme aj ukazovateľ na posledný prvok, takže
pridanie prvku na koniec zreťazenia má zložitosť O(1)
Vlož na index: reprezentuje zložitosť O(n), pretože musí prehľadať zoznam a nájsť
správne miesto pre vloženie prvku. Následne sa zmenia nasledovníci u predchádzajúceho
prvku na vkladaný prvok a vkladaný prvok bude mať nasledovníka, ktorého mal
predchádzajúci prvok
Zruš prvý: zmena ukazovateľa z prvého prvku na jeho nasledovníka, O(1)
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
Zruš posledný: keďže posledný prvok si nepamätá predchodcu, musí sa zoznam prejsť
od začiatku zreťazenia, nájsť posledný prvok, nastaviť ho na posledný a to nadobúda
zložitosť O(n)
Zruš na indexe: je nutné prechádzať zoznamom pre odstránenie prvku, O(n)
Sprístupni: potrebné prechádzanie zoznamom na nájdenie prvku, O(n)
Nastav: taktiež prechádzanie zoznamom pre nájdenie indexu a nastavenia prvku,
O(n)
Index prvku: porovnávanie hodnôt v zozname, ktorý sa prechádza od začiatku
zreťazenia, O(n)
začiatku), alebo do druhej polovice zoznamu (prehľadávanie od konca), pri vložení nutné
aktualizovať predchodcov a nasledovníkov, O(n/2)
Zruš prvý: zmena ukazovateľa z prvého prvku na jeho nasledovníka a nasledovníkovi
nastaviť nového predchodcu, O(1)
Zruš posledný: zmena ukazovateľa z posledného na predchodcu a predchodcovi
nastaviť nového nasledovníka, O(1)
Zruš na indexe: princíp rovnaký ako pri „vlož na index“, O(n/2)
Sprístupni: princíp rovnaký ako pri „vlož na index“, tu nie je nutné nastavovať
predchodcov ani nasledovníkov, O(n/2)
Nastav: princíp rovnaký ako pri „vlož na index“, plus nastavenie prvku na novú
hodnotu, O(n/2)
Index prvku: princíp rovnaký ako pri „vlož na index“, rozdiel je v tom, že sa hľadá
index podľa prvku, O(n/2)
Vlož: prvky sa vkladajú vždy na koniec zoznamu, takže nadobúda zložitosť O(1)
Vyber: kvôli prehľadávaniu zoznamu a nájdeniu prvku podľa priority má zložitosť O(n)
Ukáž: taktiež zložitosť O(n), kvôli prehľadávaniu zoznamu a nájdeniu konkrétnej
priority
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
Vlož: prvky sa vkladajú na poslednú úroveň na prvú voľnú pozíciu zľava, z kade sa
pomocou metódy swap vymieňa so svojim otcom, pokým nie je splnená podmienka
spomínaná vyššie. Toto predstavuje zložitosť O(log n), pretože výmena prebehne
maximálne toľkokrát, koľko je úrovní
Vyber: vyberie sa prvok s maximálnou prioritou (koreň), ktorý sa nahradí posledným
prvkom z poľa a následne znovu pomocou metódy swap sa vymieňajú vrcholy, pokým nie
je splnená podmienka. Zase platí, že zložitosť nadobúda O(log n), pretože výmena
prebehne maximálne toľkokrát, koľko je úrovní
Ukáž: vyznačuje sa zložitosťou O(1), pretože prvok s najvyššou prioritou sa nachádza
na nultom indexe v poli
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
Vlož: ak vkladáme do kratšieho zoznamu, ktorý ešte nie je zaplnený, tak zložitosť je
O(1). Ak ale vkladáme do kratšieho zoznamu, ktorý je zaplnený a prvok je nutné z neho
vytesniť do dlhšieho zoznamu kvôli vyššej priorite vkladaného prvku, tak nastáva zložitosť
O(√n)
Vyber: táto operácia má podobnú filozofiu ako „vlož“. Pokiaľ vyberáme z kratšieho
zoznamu, ktorý ešte nie je prázdny, tak zložitosť je O(1). Ak ale už je prázdny, potrebuje
sa doplniť z dlhšieho zoznamu prvkami s najvyššou prioritou, a tento presun niečo stojí,
čo už naberá na zložitosti O(√n)
Ukáž: rýchle sprístupnenie prvku s najvyššou prioritou v kratšom zozname, O(1)
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
Po spustení aplikácie nám ponúka konzola jednoduché menu, kde je možné si vybrať,
aké ADT chceme testovať, potom štruktúru a následne si zvolíme scenár. Scenáre zo
zadania pre jednotlivé štruktúry sú vopred pripravené cez .csv súbor, ktorý sa pri
spustení načíta. Po načítaní sa každý typ ADT uloží na príslušnú pozíciu Arrayu, kde každá
pozícia obsahuje ArrayList scenárov.
Každá ADT má svoju testovaciu triedu, a tieto triedy dedia od spoločného predka
triedy Test metódy. Metóda vykonajTest(T paObjekt, Scenar* paScenar, int cisloTestu)
zaručuje, že do paObjekt príde štruktúra daného ADT zvolená v konzole, a do paScenaru
príde zvolený scenár. Táto metóda už v konkrétnych potomkoch vykonáva výber skupiny
metód na základe ich výskytu. Metóda starajúca sa o tento čin sa nachádza v triede
Scenar. Na základe vygenerovanej hodnoty v rozpätí od 0 po sumu výskytov sa
kontroluje, či aktuálny výskyt plus nasledovný výskyt skupiny nepresiahne vygenerovanú
hodnotu. Ak presiahne, tak sa nevyberie nasledujúca skupina, ale aktuálna. Po zvolenej
skupine sa vyberie konkrétna operácia v triede HodnotaScenara, kde sú operácie volené
náhodne.
Po výbere operácie sa môže ísť vykonať test operácie. Na to slúži metóda, ktorú tiež
potomkovia dedia od predka Test, vykonanieKonkretnejMetody(), kde ako parameter
prichádza zvolená metóda a štruktúra. Operácie sú testované z časového hľadiska v
nanosekundách pomocou knižnice <chrono>. Výsledok každej operácie sa ukladá na
príslušnú pozíciu podľa operácie do atribútu „doba“ typu Array, ktorý je tvorený
ArrayListom typu long long.
Čo sa týka zapisovania dát do .csv súboru, tak vždy od spustení aplikácie sa budú .csv
súbory číslovať od nuly po počet testov, koľko sa ich vykoná za bez aplikácie. Do súboru sú
dáta zapisované po riadkoch. Prvý riadok vždy indikuje, aké operácie sa vykonali (typ
operácie), a pod každou operáciou sú zapísané príslušné dáta zodpovedajúce operácii.
Následne sa zapisujú číselné dáta, ktoré sú oddelené bodkočiarkou ako pri čítaní.
LinkedList scenár B trval celkovo 117 749 ms. Najväčšie časové zastúpenie má
operácia „index prvku“, 35 572 ms, aj napriek tomu, že má v scenári najmenší výskyt.
Ostatné skupiny majú výskyt rovnaký, takže porovnávanie je viac rovnocenné. Najmenší
časový podiel predstavuje operácia „vlož posledný“ s 91 ms.
Žilinská univerzita v Žiline
Fakulta riadenia a informatiky
LinkedList scenár C trval celkovo 126 013 ms. Tu sa dá rovnocenne porovnávať prvá
a druhá skupina scenára, kde najväčší časový podiel získava operácia „zruš posledný“ so
46 572 ms. Najrýchlejšia operácia s časom 127 ms je „vlož posledný“.
OC LinkedList scenár A trval celkovo 20 9761 ms. Najväčší časový podiel má operácia
„index prvku“ s 83 068 ms pri najmenšom výskyte v scenári. Najmenší má operácia „zruš
prvý“ so 101 ms.
OC LinkedList scenár B trval celkovo 93 592 ms. Ako v predchádzajúcom scenári, aj
teraz má „index prvku“ najväčší časový podiel so 44 987 ms a najmenší je „vlož posledný“
so 113 ms.
OC LinkedList scenár C trval celkovo 50 741 ms. Do tretice, aj tentokrát má „index
prvku“ najväčší časový podiel s 21 054 ms. Najmenší časový podiel zastupuje operácia
„vlož posledný“ so 117 ms.
Ľavostranná halda scenár B trval celkovo 653 450 ms. Časové zastúpenie je rovnaké
ako pri ľavostrannej halde scenár A, čiže najväčšie má operácia „vyber“ s 330 103 ms,
a najmenšie „ukáž“ s 3 574 ms.
Dvojzoznam scenár A s kapacitou krátkeho zoznamu 700 trval celkovo 115 802 ms.
Najväčší časový podiel má operácia „vlož“ s 101 199 ms. Najmenší časový podiel získava
operácia „ukáž“ s 2 100 ms.
Dvojzoznam scenár B s kapacitou krátkeho zoznamu 700 trval celkovo 183 075ms.
Najdlhšie trvajúcou operáciou je „vlož“ s 157 946 ms, a najkratšie trvajúcou je operácia
„ukáž“ s 6 557ms.
Nesúvislá matica o veľkosti 1000x2000 s výskytom scenárov sprístupni 50, nastav 50,
trvala celkovo 26 789. Operácia „nastav“ má časový podiel 13 188 ms, a operácia
„sprístupni“ 13 601 ms.
Veľkosť bázovej množiny má vplyv na časovú zložku operácií. V každom scenári môžeme
zhodnotiť, že operácia „rozdiel“ je najhoršou operáciou, a operácia „je rovná“ je najlepšia
operácia. Do horšej skupiny operácií môžeme považovať operácie „rozdiel“, „prienik“,
„zjednotenie“. Medzi lepšie by sa radili „vlož“, „vyber“, „patrí“.