You are on page 1of 23

ŽILINSKÁ UNIVERZITA

FAKULTA RIADENIA A INFORMATIKY

1. Semestrálna práca

Analýza výkonu údajových štruktúr


( c++ )

CVIČIACI: Ing. Marek Kvet, PhD. VYPRACOVAL: Július Sládek


CVIČENIE: utorok 12:00 – 13:40 OS. ČÍSLO: 557199
ŠK. ROK: 2019/2020 SKUPINA: 5ZY038
UML diagram tried

Algoritmy a údajové štruktúry 1 2019/2020


Popis práce

Úlohou semestrálnej práce bolo efektívne implementovať údajové štruktúry a následne ich
otestovať, výsledky spracovať. Na testovanie som vytvoril jednoduchú konzolovú aplikáciu
v ktorej je možné vyberať z vopred definovaných scenárov, alebo taktiež možnosť vytvoriť
vlastný scenár podľa ktorého bude test vykonaný. Každý scenár ma vopred definovaný počet
opakovaní ktoré vykoná ( konštanta je nastavená na 1 000 000 opakovaní ). Operácie sú
vykonávane náhodne, pomer operácií závisí od scenára, alebo od vstupu zadaného
používateľom. Je možné testovať širokú škálu štruktúr. Výsledky testov sú zaznamenávané
a ukladané vo formáte csv vďaka čomu je spracovanie dát jednoduchšie. Pre prácu
s aplikáciou je nutné prečítať si používateľskú príručku. Pre spracovanie dát je priložená
taktiež používateľská príručka, jedná sa o jednoduchú prácu s populárnym softwarom R,
avšak je možné využiť akýkoľvek dostupný software. V dokumentácii k semestrálnej práci
nájdete taktiež spracované dáta z testovania údajových štruktúr a zároveň popis daných
štruktúr. Pre lepšie pochopenie údajových štruktúr je priložený aj UML diagram.

Zoznam použitých externých knižníc

<iostream> – použitá na výpis na konzolu

<fstream> – použitá na zápis do súborov

<string> – použitá na prácu s reťazcami

<chrono>– použitá na prácu s časom

<random>– použitá pri generovaní náhody

Algoritmy a údajové štruktúry 1 2019/2020


Implementované štruktúry

Zoznam

 ArrayList<T>
 LinkedList<T>
 DoublyCircularLinkedList<T>

Prioritný front

 PriorityQueueLinkedList<T>
 Heap<T>
 PriorityQueueTwoLists<T>

Matica

 ImplicitQueue<T>
 ExplicitQueue<T>

Set

 Set

Algoritmy a údajové štruktúry 1 2019/2020


Používateľská príručka pre prácu s aplikáciou

Po spustení aplikácie sa zobrazí hlavné menu. Výber menu je realizovaný pomocou zadávania
určitých znakov. Po zadaní znaku je potrebné potvrdiť výber enterom. V prípade zadanie
neplatného znaku ( neexistujúca možnosť ) budete presmerovaný späť do hlavného menu.
V hlavnom menu si vyberiete ktorý typ štruktúry chcete testovať.

Textové menu (modelová situácia):

• Po stlačení klávesu ‚1‘ sa zobrazí menu v ktorom je potrebné vybrať konkrétnu


implementáciu údajovej štruktúry.

• Po opätovnom stlačení klávesu ‚1‘ (ArrayList) sa zobrazí menu ‚Testovanie Arraylistu‘


V tomto menu je možné vybrať z preddefinovaných scenárov, alebo je možné si
vytvoriť vlastný scenár

• Po stlačení klávesu ‚1‘ (vybrať scenár) má používateľ na výber z rôznych scenárov


(A,B,C..). Pre potvrdenie je potrebné zadať daný znak a prípadne doplniť hodnoty
ktoré sú potrebné doplniť (napr. rozmer).

• Testovací scenár bude spustený (môže trvať niekoľko minút) a následne po ukončení
informuje používateľa o ukončení testovania. Dáta budú uložené do formátu csv. Po
každom testovaní je potrebné daný súbor premiestniť, aby nedokázalo ku
znehodnoteniu dát.

• V prípade že používateľ v menu ‚Testovanie‘ vyberie možnosť vytvoriť vlastný scenár.


Zobrazí sa menu v ktorom bude potrebné zadať pomer operacii. Pomer operacii musí
dávať celkový súčet 1. V prípade ArrayListu sa berie do úvahy pomer štyroch druhov
operacii:( vlož, zruš, nastav/sprístupni, index prvku ) . Používateľ zadáva vždy len
pomer tých operácia. Ak chce operácie zadať v pomere 30, 30, 30, 10. Je potrebné ich
zadávať nasledovne (30, 60, 90). Posledná operácia je automaticky dopočítaná do
100 (pravdepodobnosť = 1). Používanie vyžaduje dôslednosť.

• Aplikácia je intuitívna a ostatné položky fungujú obdobne.

Algoritmy a údajové štruktúry 1 2019/2020


Používateľská príručka pre spracovanie dát

Pre prácu s programom R je potrebné si ho nainštalovať. Link na program R software. Tento


software je pomerne zložitý na používanie, avšak veľmi kvalitný nástroj pri analýze dát.
Obsahuje konzolu do ktorej sa vpisuje kód (ďalej script). V tomto stručnom návode nebude
vysvetlená práca so softwarom R, bude tu iba postup spracovania údajov, vďaka ktorému je
možné získať výsledky zahrnuté v semestrálnej práci (grafy, štatistiky). Jednotlivé scripty
možno kopírovať a rovno vkladať.

Štruktúra generovaných CSV vyzerá nasledovne

1. Class – rozlíšenie typu operacii( vlož = 1, zruš =2, sprístupni nastav = 3, indexPrvku = 4)atď..
2. Count – číslo vykonanej operácie
3. Size – aktuálna veľkosť testovanej štruktúry
4. Time – dĺžka trvania operácie

Inštalácia potrebných knižníc, pre prácu s grafmi

 install.packages("sqldf")
 install.packages("ggplot2")
 library(ggplot2)
 library(sqldf)

Načítanie csv súboru a farebné odlíšenie jednotlivých typov operácií

 AUS=read.csv("zoznam.csv") //(potrebne zadať názov csv súboru)


 my_color = c('red','green','blue','purple') //mapovanie farieb
 mapped_colors = my_color[AUS$class]

V nameraných dátach sa nachádza aj šum ktorému nieje možné predisť preto je potrebné
odstrániť hodnoty ktoré prevyšujú určitú hranicu tzv. ‚outliers‘ (hranicu ktorú dosiahnuť
nemôžu). Preto si z pôvodnej množiny( ďalej set) vytvoríme podmnožinu (ďalej subset). Do
tejto podmnožiny vložíme len dáte ktoré spĺňajú určitú podmienku. Je potrebné nanovo
premapovať farby a taktiež. Hodnotu potrebné určiť na základe kvalifikovaného odhadu.

 subAUS = subset(AUS, tíme<100000)

Algoritmy a údajové štruktúry 1 2019/2020


Graf je možné vykresliť ako celok. Avšak údaje nebudú čitateľné, z toho dôvodu je lepšie
rozdeliť set na viacero subsetov ( podľa počtu operácií ). Pri konkrétnom príklade sa jednalo
o štyri druhy operácií, teda set bol rozdelený na štyri ďalšie subsety. Opäť je nutné
nemapovať farby jednotlivých operácií.

 ops1 <- sqldf("select * from subAUS where class=1")


 ops2 <- sqldf("select * from subAUS where class=2")
 ops3 <- sqldf("select * from subAUS where class=3")
 ops4 <- sqldf("select * from subAUS where class=4")

Vykreslenie grafu

 ggplot() +
 geom_line(data = ops3, aes(x=count, y=time), color='blue', size =
0.8) +
 geom_line(data = ops2, aes(x=count, y=time), color='black', size =
0.8) +
 geom_line(data = ops4, aes(x=count, y=time), color='darkslategray',
size = 0.8)+
 geom_line(data = ops1, aes(x=count, y=time), color='darkgreen', size
= 0.8)

Vykreslenie ‚spriemerovaných‘ grafov bližšie informácie o metóde smooth

 ggplot() +
 geom_smooth(data = ops1, aes(x=count, y=time), color='darkgreen',
size = 0.8) +
 geom_smooth(data = ops2, aes(x=count, y=time), color='black', size =
0.8) +
 geom_smooth(data = ops3, aes(x=count, y=time), color='blue', size =
0.8)
 geom_smooth(data = ops4, aes(x=count, y=time), color='darkslategray',
size = 0.8)

vykreslenie grafu vývoja veličiny size, priemer, max, min:

 ggplot(AUS,aes(x = count, y = size)) + geom_line(color=“black“,


size=1.5)
 which.max(ops1$time) //vráti index
 which.min(ops1$time)
 ops1[index];
 mean(ops3$time)

Algoritmy a údajové štruktúry 1 2019/2020


Výsledky z testovania ADT zoznamu

ArrayList
Dáta merané v mikro-sekundách.

Obr. 1.1 ArrayList – všetky operácie

Obr. 1.2 ArrayList - vývoj veľkosti (size)

Algoritmy a údajové štruktúry 1 2019/2020


Na grafe (obr. 1.2) je vidno všetky operácie ktoré boli vykonané . Je jasne vidieť že operácia
indexOf rástla lineárne a potvrdilo sa že je to O(n) operácia. Čas ktorý táto operácia trvala bol
taký veľký že ostatné hodnoty sú voči nej úplne zanedbateľné. Na grafe (obr.1.2) je vidno ako
sa menila veľkosť (ďalej size) ArrayListu. Je vidno ako je dĺžka trvania operácie závislá na size.
Taktiež vidno že ostatné operácie sú z časti ovplyvňované size-om. Avšak je potrebné
podotknúť že nie vždy je tomu tak. Pokiaľ je to potrebné tak ArrayList musí alokovať novú
pamäť a vtedy trvá operácia dlhšie. Avšak nebol som schopný daný proces odchytiť kvôli
vysokému šumu.

Obr.1.3 ArrayList – operácie, bez indexOf

Na grafe (obr1.3) je aj napriek vysokému šumu vidno že operácie nastav/sprístupni nie sú


závislé na size. Operácia indexOf bola vynechaná keďže kvôli jej vysokým hodnotám
skresľovala ostatné operácie.

Algoritmy a údajové štruktúry 1 2019/2020


Obr. 1.4 ArrayList – operácie bez, indexOf spriemerované

Na grafe (obr.1.4) je vidieť spriemerované dáta z grafu (Obr.1.3). Aspoň z časti to redukuje
šum. Dáta boli merané v mikro-sekundách, trvania operácií sú pomerne vysoké. Príčinou sú
pravdepodobne range checky. Pri operáciách je vidno že sa jedná o mix opierací O(n) a O(1).

Algoritmy a údajové štruktúry 1 2019/2020


LinkedList
Dáta boli merané v nanosekundách.

Obr.(1.5) LinkedList – Všetky operácie

Graf nieje dobre čitateľní kvôli vysokému šumu. Takže je potrebné ho upraviť.

Obr.(1.6) Všetky operácie spriemerované

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(1.7) LinkedList – vývoj veľkosti size

Na grafoch je vidno že indexOf je O(n) a viacmennej presne kopíruje, size. Pri ostatným
operáciách Je taktiež vidno ako je LinkedList ovplyvnený size-om, ale nieje to úplne tak.
Taktiež je vidno jeho skvelý vlastnosť a to je vkladanie. Pokiaľ sa vkladá na začiatok Linkedlist
je zložitosť O(1). Taktiež mazanie zo začiatku je veľmi rýchle. Je to veľmi rýchla štruktúra. Za
výhodu považujem že je to explicitná štruktúra. Teda nepotrebuje súvislý blok pamäti.

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(1.8) LinkedList – LinkedList iba s operáciou vlož a sprístupni/nastav

Na grafe (Obr.1.8) je možno vidieť operáciu nastav sprístupni, ktorá bola vykonávaná iba
s operáciou vlož. Os Y musela byť zlogaritmovaná aby bolo vidieť nejaký výsledok. Na
začiatku krásne vidno ako rapídne narastalo trvanie týchto operácii s neustále narastajúcim
size-om.

DoublyCircularLinkedList

Obr. (1.9)
DoublyCircularLinkedList – všetky operácie

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(2.0) DoublyCircularLinkedLIst – všetky operácie spriemerované

Obr.(2.1) DoublyCircularLinkedLIst – - vývoj veľkosti (size)

Algoritmy a údajové štruktúry 1 2019/2020


Výsledky z testovania ADT prioritného frontu

PriorityQueueLinkedList

Obr.(2.2) PriorityQueueLinkedList – operácie peak a pop

Obr.(2.3)
PriorityQueueLinkedList – operácie push

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(2.4) PriorityQueueLinkedList – vývoj veľkosti (size)

Pri PriorityQueueLinkedList-e je vidieť závislosť operácie peek() a pop na size. Dáta sú


zašumené, na reprezentáciu som zvolil bodové grafy. Operácia pop push je rýchla O(1) čo je
možné vidieť aj z grafu. Štruktúra je veľmi rýchla.

Algoritmy a údajové štruktúry 1 2019/2020


Heap

Obr.(2.5) Heap– operácie peek push

Obr.(2.6) Heap– operácie pop

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(2.7) Heap– vývoj veľkosti size

Pri operacii pop boli časy natoľko veľké že os Y musela byť zlogaritmovaná, aby bolo možné
zobraziť dáta. Taktiež musela byť operácia pop vložená na samostatný graf. Operácie peek
push sú pomerne konštantné a omnoho rýchlejšie.

Algoritmy a údajové štruktúry 1 2019/2020


PriorityQueueTwoLists

Minimálna kapacita listu 4

Obr.(2.8) PriorityQueueTwoLists– všetky operácie

Obr.(2.9) PriorityQueueTwoLists– všetky operácie spriemerované

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(3.0) PriorityQueueTwoLists– vývoj veľkosti size

Minimálna kapacita listu 100

Obr.(3.1) PriorityQueueTwoLists– všetky operácie

Algoritmy a údajové štruktúry 1 2019/2020


Obr.(3.2) PriorityQueueTwoLists– všetky operácie spriemerované

Obr.(3.3) PriorityQueueTwoLists– vývoj veľkosti size

Je jasne vidieť že front s kapacitou 4 je omnoho rýchlejší ako front s kapacitou 100.

Algoritmy a údajové štruktúry 1 2019/2020


Set
100 prvkov

Obr.(3.4) Set– operácia vlož a zruš

Size bola neustále konštantná (pevne zadaná). Operácie prienik a je podmnožinou sú O(n).
Operácia vlož a zruš O(1);

Algoritmy a údajové štruktúry 1 2019/2020

You might also like