Professional Documents
Culture Documents
Seminarski Rad: Algoritmi I Strukture Podataka
Seminarski Rad: Algoritmi I Strukture Podataka
SADRŽAJ
UVOD............................................................................................................................3
1.1.4. Istorija..........................................................................................................9
1.2. Stek....................................................................................................................11
1.2.3. Sigurnost....................................................................................................15
1.3. Red....................................................................................................................16
1.3.1. Implementacija...........................................................................................17
1.4. Stablo.................................................................................................................20
1.6. Grafovi..............................................................................................................25
ZAKLJUČAK..............................................................................................................29
LITERATURA.............................................................................................................30
2
2
UVOD
Formalno apstraktni tipovi podataka se mogu definisati kao klasa objekata čije je
logičko ponasanje definisano kao skup vrijednsoti i skup operacija. Apstraktni tipovi
podataka su kao algebarska struktura u matematici. Ponašanje varira u zavisnosti od
konkretne implementacije. U praksi mnogi uobičajni tipovi podataka nisu apstraktni tipovi,
jer apstrakcija nije savršena i korisnici moraju biti svjesni problema poput aritmetičkog
prelijevanja koji nastaju zbog reprezentacije. Na primjer cijeli brojevi se često čuvaju kao
vrijednost fiksne širine (32-bitni ili 64-bitni binarni brojevi), i na taj način doživljavaju
cijelokupni preliv ako je premašena vrijednost.
3
2
1. Izjava o podacima
2. Izjava o radu
4
2
Na slici 1 prikazna je povezana lista čiji čvorovi sadrže dva polja: cjelobrojna
vrijednost i veza do sljedećeg čvora. Zadnji čvor povezan je s terminatorom koji služi za
označavanje kraja popisa.
5
2
Koriste više memorije nego nizova zbog memorije koju koriste njihovi
pokazivači.
Čvorovi na povezanom popisu moraju se pročitati od početka, jer su povezane
liste inherentno sekvencijalni pristup.
Čvorovi se pohranjuju bez prestanka, uveliko povećavajući vremenske periode
potrebne za pristup pojedinim elementima unutar liste, posebno sa CPU
predmemorijom.
Poteškoće se pojavljuju na povezanim listama kada je u pitanju obrnuto
kretanje. Na primjer, pojedinačno povezani popisi su nezadovoljni za
pomicanje unazad, a dok su dvostruko povezani popisi nešto lakši za čitanje,
memorija se troši za dodjelu prostora za stražnji pokazivač.
6
2
Lista jednostruko povezanih čvorova sadrži čvorove koji imaju polje podataka kao i
polje 'next', što upućuje na sljedeći čvor u liniji čvorova. Operacije koje se mogu izvesti na
jednostruko povezanim listama uključuju umetanje, brisanje i prelaz.
Sljedeći kod (na narednoj strani) pokazuje kako dodati novi čvor s podacima na kraj
jednostruko povezane liste.
7
2
Kod dvostruko povezanih lista, svaki čvor, osim veze sljedećeg čvora, sadrži i drugo
polje veze koje upućuje na prethodni čvor u nizu. Dvije veze mogu se nazvati "naprijed (" s) i
"nazad", ili "sljedeće" i "prev" ("prethodno"). Na slici 2. prikazana je dvostruko povezana
lista čiji čvorovi sadrže tri polja: cjelobrojna vrijednost, veza prema sljedećem čvoru i veza
nazad na prethodni čvor.
Slika 2.
Kod višestruko povezanih lista, svaki čvor sadrži dva ili više polja veza, a svako se
polje koristi za povezivanje istog skupa zapisa podataka različitim redoslijedom istog skupa
(npr. Po imenu, odjelu, datumu rođenja, itd.). Iako se dvostruko povezane liste mogu gledati
kao posebni slučajevi višestruko povezane liste, činjenica da su dva i više naloga međusobno
suprotna vodi u jednostavnije i efikasnije algoritme, pa se obično tretiraju kao zaseban slučaj.
8
2
1.1.4. Istorija
Povezane liste razvili su 1955–1956 Allen Newell, Cliff Shaw i Herbert A. Simon iz
RAND Corporation kao primarnu strukturu podataka za njihov jezik za obradu informacija.
IPL su autori iskoristili za razvoj nekoliko ranih programa umjetne inteligencije, uključujući
Logic Theory Machine, General Problem Solver i računalni program šaha. Izvještaji o
njihovom radu pojavili su se u IRE Transakcijama o teoriji informacija 1956. godine, te
nekoliko zbornika konferencija od 1957. do 1959. godine, uključujući Zbornik radova
Zapadne zajedničke računarske konferencije 1957. i 1958. te Obradu informacija (Zbornik
radova prve UNESCO-ove međunarodne konferencije o obradi informacija. ) 1959.
Sada klasični dijagram koji se sastoji od blokova koji predstavljaju čvorove liste sa
strelicama usmjerenim na uzastopne čvorove popisa pojavljuje se u "Programiranju teorije
logičke teorije" Newela i Shawa u Proc. WJCC, februar 1957. Newell i Simon su 1975.
godine nagrađeni nagradom ACM Turing za "doprinose u umjetnoj inteligenciji, psihologiji
ljudske spoznaje i obradi lista". Problem mašinskog prevođenja za obradu prirodnog jezika
natjerao je Victora Yngvea iz Massachusetts Institute of Technology (MIT) da koristi
povezane liste kao strukturu podataka u svom programskom jeziku COMIT za kompjuterska
istraživanja u području lingvistike. Izvještaj o ovom jeziku pod nazivom "Programski jezik za
mehaničko prevođenje" pojavio se u "Mechanical Translation" 1958. godine. LISP, koji važi
za procesor liste, kreirao je John McCarthy 1958. godine, dok je bio na MIT-u, a 1960.
objavio je njegov dizajn u radu u komunikacijama ACM-a, pod naslovom „Rekurzivne
funkcije simboličkih izraza i njihovo računanje pomoću stroja, ". Jedna od glavnih struktura
podataka LISP-a je povezana lista.
9
2
a u aprilu 1964. Nekoliko operativnih sistema koje su razvili tehnički konsultanti sistema
(izvorno West Lafayette Indiana, a kasnije i Chapel Hill, Severna Karolina) koristili su
pojedinačno povezane liste kao strukture datoteka.
Unos u imenik ukazao je na prvi sektor datoteke, a sljedeći dijelovi datoteke smješteni
su prelazeći pokazivače. Sistemi koji koriste ovu tehniku uključuju Flex (za Motorola 6800
CPU), mini-Flex (isti CPU) i Flex9 (za Motorola 6809 CPU). Varijanta koju je TSC razvio za
tržište Smoke Signal Broadcasting u Kaliforniji koristi dvostruko povezane liste na isti način.
TSS / 360 operativni sistem, razvijen od strane IBM-a za uređaje System 360/370, koristio je
dvostruko povezanu listu za svoj katalog datoteka. Struktura direktorija bila je slična Unix-u,
gdje direktorij može sadržavati datoteke i ostale direktorijume i proširiti se na bilo koju
dubinu.
Operacije na listama
FirstL(L) - procedura koja nam vraća prvi element liste, tj. element sa
indeksom 0. Ako je ona prazna vraća nam grešku
EndL(L) - Služi za vraćanje pozicije iza zadnjeg elementa liste
NextL(p,L) – Funkcija koja vraća sljedbenika unesenog elementa p. Ako je
p=EndL(L) javlja nam grešku.
PreviousL(p,L) – Funkcija koja vraća prethodnika unesenog elementa p. Ako
je p=FirstL(L) javlja nam grešku
LocateL(x,L) – Procedura koja vraća prvi element sa vrijednošću x. Ako on ne
postoji vraća se EndL(L).
InsertL(x,p,L) – Dodaje novi element sa vrijednošću x na poziciju p. Svi
elementi koji su u listi na poziciji većim ili jednakim p se pomiču za jedno
mjesto dalje.
DeleteL(p,L) – Briše se element na poziciji p iz liste. Svi elementi koji su se
nalazili iza tog elementa u listi se pomiču za jedno mjesto unaprijed.
RetrieveL(p,L) – Funkcija koja vraća vrijednost elementa na poziciji p.
10
2
1.2. Stek
U računarskoj nauci, stek je apstraktni tip podataka koji služi kao zbirka elemenata, s
dvije glavne glavne operacije:
Redoslijed kojim se elementi spuštaju iz niza daje alternativni naziv LIFO (zadnji
ulaz, prvi izlaz). Uz to, operacija zavirivanja može dati pristup vrhu bez modifikovanja.
Naziv "stek" za ovu vrstu strukture dolazi od analogije skupu fizičkih predmeta složenih
jedan na drugi. Ova struktura olakšava uklanjanje predmeta s vrha steka, dok će dolazak do
predmeta dubljeg sloga možda zahtijevati prvo uklanjanje više drugih predmeta. Smatra se
linearnom strukturom podataka, ili apstraktnije sekvencijalnom kolekcijom, push i pop
operacije se javljaju samo na jednom kraju strukture, naziva se vrhom steka. Ova struktura
podataka omogućuje implementaciju steka kao pojedinačno povezane liste i pokazivača na
gornji element. Sklop se može primijeniti tako da ima ograničeni kapacitet. Ako je stek pun i
ne sadrži dovoljno prostora da prihvati entitet koji treba gurnuti, onda se smatra da je stek u
preljevnom stanju. Skočna operacija uklanja stavku s vrha hrpe. Za provedbu pretraživanja
dubine prvo je potreban stek. Na slici 3 prikazan je jednostavan primjer vremena izvođenja
steka uz pomoć push i pop operacija.
11
Slika 3.
2
Postoje mnoge varijacije osnovnog principa slaganja. Svaki stek ima fiksnu lokaciju,
u memoriji, na kojoj započinje. Kako se stavke podataka dodaju u stek, pokazivač steka se
pomiče kako bi ukazao na trenutni opseg steka koji se širi dalje od ishodišta.
Pokazivači na hrpu mogu ukazivati na ishodište niza ili na ograničeni raspon adresa
bilo iznad ili ispod ishodišta (ovisno o smjeru u kojem stek raste); međutim, pokazivač steka
ne može prijeći ishodište. Drugim riječima, ako je izvor steka na adresi 1000, a stek raste
prema dolje (prema adresama 999, 998 i tako dalje), pokazivač steka nikada se ne smije
povećavati preko 1000 (na 1001, 1002, itd.). Ako iskačuća operacija na steku uzrokuje
pomicanje pokazivača steka pored izvora steka, događa se prelivanje steka. Ako operacija
guranja uzrokuje da se pokazivač steka uvećava ili smanjuje iznad maksimalnog opsega,
dolazi do prelijevanja steka.
Neka okruženja koja se u velikoj mjeri oslanjaju na stekove mogu pružiti dodatne
operacije, na primjer:
Duplikat: gornja stavka iskače, a zatim ponovo (dva puta) gura, tako da je dodatna
kopija bivše gornje stavke sada na vrhu, a original ispod nje.
12
2
Pogled: najviša stavka se pregleda (ili vraća), ali pokazivač i veličina steka se ne
mijenjaju (što znači da stavka ostaje na stogu). To se u mnogim člancima naziva i vrhunskim
radom.
Desnim rotiranjem pomaknućete prvi element na treće mjesto, drugi na prvo, a treći
na drugo. Evo dvije ekvivalentne vizualizacije ovog procesa:
jabuka banana
banana ===desna rotacija==> krastavac
krastavac jabuka
krastavac jabuka
banana ===lijeva rotacija==> krastavac
jabuka banana
13
2
stavku u hrpi. Ako stek pokazuje na trenutnu najgornju stavku, pokazivač na stek biće
ažuriran prije nego što se nova stavka gurne na stek; ako pokazuje na sljedeće dostupno
mjesto u steku, biće ažurirano nakon što se nova stavka gurne na stek. Iskakanje hrpe
jednostavno je obrnuto od guranja. Uklanja se najviša stavka u hrpi i ažurira se pokazivač za
stek, obrnutim redoslijedom od onog koji se koristi u operaciji guranja.
Mnogi dizajni CPU-a tipa CISC, uključujući x86, Z80 i 6502, imaju namjenski
registar koji se koristi kao pokazivač steka snopa poziva s namjenskim uputama za poziv,
povratak, push i pop koji implicitno ažuriraju namjenski registar, povećavajući tako gustoću
koda. Neki CISC procesori, poput PDP-11 i 68000, također imaju posebne načine adresiranja
za implementaciju stekova, obično s poluodvojenim pokazivačem steka (kao što je A7 u
68000). Suprotno tome, većina RISC dizajna CPU-a nema namjenske upute za stek i zato se
većina, ako ne i svi registri, prema potrebi mogu koristiti kao pokazivači na stek.
Sun SPARC, AMD Am29000 i Intel i960 su svi primjeri arhitektura koje koriste
prozore registra unutar registarskog steka kao drugu strategiju za izbjegavanje upotrebe spore
glavne memorije za argumente funkcija i povratne vrijednosti.
Postoji i niz malih mikroprocesora koji implementiraju stek direktno u hardver, a neki
mikrokontroleri imaju stek fiksne dubine kojem nije moguće direktno pristupiti. Primjeri su
14
2
PIC mikrokontroleri, Computer Cowboys MuP21, linija Harris RTX i Novix NC4016. Mnogi
mikroprocesori zasnovani na steku korišteni su za implementaciju programskog jezika Forth
na razini mikrokoda. Snopovi su takođe korišteni kao osnova za niz glavnih računara i mini
računara. Takve mašine nazivale su se strojevima za slaganje, a najpoznatiji je Burroughs
B5000.
1.2.3. Sigurnost
Neka računarska okruženja koriste stekove na načine koji ih mogu učiniti ranjivima
na sigurnosne provale i napade. Programeri koji rade u takvim okruženjima moraju voditi
posebnu brigu kako bi izbjegli zamke ovih implementacija.
Zlonamjerne strane mogu pokušati srušiti napad koji koristi prednost ove vrste
implementacije pružanjem prevelikog unosa podataka programu koji ne provjerava dužinu
unosa. Takav program može kopirati podatke u cijelosti na mjesto u steku i na taj način može
promijeniti povratne adrese za procedure koje su ga pozvale. Napadač može eksperimentisati
kako bi pronašao određenu vrstu podataka koji se mogu pružiti takvom programu, tako da se
povratna adresa trenutne procedure resetuje tako da upućuje na područje unutar samog steka
(i unutar podataka koje pruža napadač), koja zauzvrat sadrži upute koje izvode neovlaštene
operacije.
15
2
1.3. Red
Operacije reda čine ga podacima prvi u prvom (FIFO). U FIFO strukturi podataka,
prvi element dodan u red biće prvi koji će se ukloniti. To je ekvivalent zahtjevu da se nakon
dodavanja novog elementa svi elementi koji su dodani prije moraju ukloniti prije nego što se
novi element može ukloniti. Red je primjer linearne strukture podataka ili sažetiji
sekvencijalne kolekcije. Redovi su uobičajeni u računarskim programima, gdje se
implementiraju kao strukture podataka zajedno s pristupnim rutinama, kao apstraktna
struktura podataka ili u objektno orijentisanim jezicima kao klase. Uobičajene
implementacije su kružni međuspremnici i povezane liste.
16
2
1.3.1. Implementacija
Nizovi fiksne dužine ograničeni su kapacitetom, ali nije istina da stavke treba kopirati
prema glavi reda. Jednostavan trik pretvaranja niza u zatvoreni krug i puštanja glave i repa da
beskrajno lebde u tom krugu čini nepotrebnim ikada premještanje predmeta pohranjenih u
nizu. Ako je n veličina polja, tada će računski indeksi po modulu n niz pretvoriti u krug. Ovo
je i dalje konceptualno najjednostavniji način konstruiranja reda na jeziku visoke razine, ali
doduše pomalo usporava stvari, jer se indeksi polja moraju usporediti s nulom i veličinom
polja, koja je usporediva s vremenom potrebno za provjeru je li indeks niza izvan granica, što
neki jezici i čine, ali ovo će sigurno biti metoda odabira za brzu implementaciju ili za bilo
koji jezik visoke razine koji nema sintaksu pokazivača. Veličina polja mora se deklarisati
prije vremena, ali neke implementacije jednostavno udvostručuju deklarisanu veličinu niza
kada dođe do prelijevanja. Većina modernih jezika s objektima ili pokazivačima može
implementirati ili imati biblioteke za dinamičke liste. Takve strukture podataka osim
ograničenja memorije možda nisu navele fiksno ograničenje kapaciteta. Prelivanje reda je
rezultat pokušaja dodavanja elementa u puni red, a do prekomjernog reda dolazi kada
pokušavate ukloniti element iz praznog reda.
Povezana lista
Dvostruko povezana lista ima O umetanje i brisanje na oba kraja, pa je to
prirodni izbor za redove.
17
2
Redovi se mogu implementirati kao zasebni tip podataka, ili se možda smatraju
posebnim slučajem dvostrukog reda (dequeue), a ne primjenjuju se zasebno. Na primjer, Perl
i Ruby dopuštaju guranje i iskakanje niza s oba kraja, tako da se funkcije push i unshift mogu
stavljati u red i uklanjati iz liste (ili, obrnuto, mogu se koristiti shift i pop), iako u nekim
slučajevima ove operacije nisu efikasne.
18
Slika 4. Primjer
2
Ovo pitanje je veoma važno jer određuje implementaciju. Ako je odgovor na pitanje:
češće ubacivanje, implementacija je veoma jednostavna - koristi se običan niz, a vrijednost
upita određuju se prolaskom kroz sve elemente, tj. vremenska složenost je O (k) . Ista
vremenska složenost je za izbacivanje elementa. Vremenska složenost ubacivanja je naravno
O (1).
n - broj ubacivanja, q - broj upita, k - ukupan broj elemenata ubačenih u strukturu
19
2
1.4. Stablo
Alternativno, stablo se može apstraktno definisati kao cjelina (globalno) kao uređeno
stablo, s vrijednošću dodijeljenom svakom čvoru. Obe ove perspektive su korisne: dok se
stablo može matematički analizirati u cjelini, kada je zapravo predstavljeno kao struktura
podataka, obično se predstavlja i s njim radi odvojeno čvorom (umjesto kao skup čvorova i
lista susjednosti ivica između čvorova , kao što može predstavljati digraf, na primjer). Na
primjer, gledajući stablo u cjelini, može se govoriti o "roditeljskom čvoru" datog čvora, ali
uopšteno kao struktura podataka dati čvor sadrži samo popis svojih podređenih, ali ne sadrži
referencu na njegov roditelj (ako postoji).
20
2
preorder
inorder
postorder
Preorder je način obilaska stabla u kojem prvo posjećujemo korijen stabla, a zatim
podstabala krećući se s lijeva na desno. Postorder način obilaska posjećuje najprije
podstabala s lijeva na desno te na kraju korijen, a inorder najprije posjećuje najljevije
podstablo zatim korijen te zatim preostala podstabla krećući se takođe s lijeva na desno.
21
2
U računarstvu, binarno stablo je struktura podataka stabla u kojoj svaki čvor ima
najviše dvoje djece, koja se nazivaju lijevim i desnim djetetom. Rekurzivna definicija koja
koristi pojmove samo teorije skupova je da je (neprazno) binarno stablo korpa (L, S, R), gdje
su L i R binarna stabla ili prazan skup, a S je jednostruki skup koji sadrži korijen. Neki autori
dopuštaju da i binarno stablo bude prazan skup.
1. Prvo, kao sredstvo za pristup čvorovima na osnovu neke vrijednosti ili oznake
povezane sa svakim čvorom. Binarna stabla označena na ovaj način koriste se
za implementaciju binarnih stabala pretraživanja i binarnih gomila, a koriste se
za efikasno pretraživanje i sortiranje. Oznaka nekorijenskih čvorova kao
22
2
lijevog ili desnog djeteta, čak i kada je prisutno samo jedno dijete, bitna je u
nekim od ovih aplikacija, posebno je značajna u binarnim stablima
pretraživanja. Međutim, raspored određenih čvorova u stablo nije dio
konceptualnih informacija. Na primjer, u normalnom binarnom stablu
pretraživanja postavljanje čvorova gotovo u potpunosti ovisi o redoslijedu
kojim su dodani i može se preurediti (na primjer balansiranjem) bez promjene
značenja.
2. Drugo, kao prikaz podataka sa relevantnom bifurkacijskom strukturom. U
takvim slučajevima, određeni raspored čvorova ispod i / ili lijevo ili desno od
drugih čvorova dio je informacija (to jest, promjenom bi se promijenilo
značenje). Uobičajeni primjeri javljaju se kod Huffmanovog kodiranja i
kladograma. Svakodnevna podjela dokumenata na poglavlja, odjeljke,
odlomke i tako dalje analogan je primjer s n-arima, a ne s binarnim stablima.
23
2
Ideja raspršivanja je distribucija unosa (parovi ključ / vrijednost) kroz niz segmenata.
S obzirom na ključ, algoritam izračunava indeks koji sugeriše gdje se unos može naći:
24
2
hash = hashfunc(key)
index = hash % array_size
U ovoj metodi, hash je neovisan o veličini polja, a zatim se smanjuje na indeks (broj
između 0 i array_size - 1) koristeći modulo operator (%). U slučaju da je veličina polja snaga
dva, ostatak rada svodi se na maskiranje, što poboljšava brzinu, ali može povećati probleme s
lošom heš funkcijom.
1.6. Grafovi
Struktura podataka grafa može takođe pridružiti svakoj ivici neku vrijednost ivice,
kao što je simbolična oznaka ili numerički atribut (trošak, kapacitet, dužina, itd.).
Na slici ispod prikazan je usmjereni graf s tri vrha (plavi krugovi) i tri ivice (crne
strelice).
25
2
Lista susjedstva
Vrhovi se pohranjuju kao zapisi ili objekti, a svaki vrh pohranjuje listu susjednih
vrhova. Ova struktura podataka omogućuje pohranu dodatnih podataka na temenima. Dodatni
podaci mogu se pohraniti ako su ivice takođe pohranjene kao objekti, u tom slučaju svaki vrh
sprema svoje incidentne ivice, a svaka ivica pohranjuje svoje incidentne vrhove.
Matrica susjedstva
26
2
Matrica incidencije
Dobro dizajnirani softver ima minimalnu spregu. ADT promoviše slabu spregu.
Kohezija određuje koliko su dobro integrisane komponente softvera. ADT inherentno
promoviše maksimalnu koheziju.
27
2
Lokalizacija promjene- Kod koji koristi ADT objekt neće trebati uređivati ako se
promijeni implementacija ADT-a. Budući da sve promjene u implementaciji moraju i dalje
biti u skladu sa platformom, a budući da se kod koji koristi ADT objekt može odnositi samo
na svojstva i sposobnosti koje su navedene, promjene se mogu izvršiti bez potrebe za bilo
kakvim promjenama u kodu gdje se koristi ADT .
Neke operacije koje su često specifične za ADT (možda pod drugim imenima) jesu:
- compare (s, t), koji ispituje jesu li stanja dvije instance ekvivalentna u nekom smislu;
- print (s) ili show (s), koji proizvode čitljiv prikaz stanja instance.
Besplatna operacija obično nije relevantna ili značajna, jer su ADT-ovi teorijski
entiteti koji ne "koriste memoriju". Međutim, možda će biti potrebno kada treba analizirati
memoriju koju koristi algoritam koji koristi ADT. U tom su slučaju potrebni dodatni aksiomi
koji određuju koliko memorije koristi svaka ADT instanca, u funkciji svog stanja, i koliko se
toga besplatno vraća u spremište.
28
2
ZAKLJUČAK
Apstraktni tip podataka (ADT) je tip za objekte čije je ponašanje definisano skupom
vrijednosti i skupom operacija.
Definicija ADT-a samo spominje koje operacije treba izvršiti, ali ne i kako će se te
operacije provesti. Ne navodi kako će se podaci organizovati u memoriji i koji će se algoritmi
koristiti za provedbu operacija. Zove se „apstraktno“ jer daje pogled na provedbu neovisan.
Proces pružanja samo osnovnog i skrivanja detalja poznat je pod nazivom apstrakcija.
Korisnik tipa podataka ne mora znati kako se taj tip podataka implementira, na
primjer, koristili smo primitivne vrijednosti kao što su int, float, char tipovi podataka samo sa
znanjem da taj tip podataka može raditi i izvoditi se bez ikakvog ideja kako se provode.
Dakle, korisnik samo treba znati šta tip podataka može učiniti, ali ne i kako će se
implementirati. Zamislimo ADT kao crnu kutiju koja skriva unutrašnju strukturu i dizajn tipa
podataka.
Na samom kraju, najbitnije je shvatiti za šta konkretno služi ADT. Apstraktne tipove
podataka osmišljava sam programer, omogućuju jasnije i čišće oblikovanje programske
arhitekture, povećavaju razumljivost aplikacija i njihovo lakše održavanje.
29
2
LITERATURA
30