07. spa1 - apstraktni tipovi podataka
TRANSCRIPT
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
1/33
APSTRAKTNI TIPOVIPODATAKA
Strukture podataka i algoritmi 1
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
2/33
Ugraeni tipovi u Javi
Type Values Operations
boolean false, true || && !
char Unicode characters (as for int)
int negative, zero, positive
whole numbers
+ - * / %
< > == etc.
float negative, zero, positive
floating-point numbers
+ - * / %
< > == etc.
String sequences of
characters
+ length
charAt etc.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
3/33
Uvoenje novih tipova
Da bismo definisali novi tip, potrebno je definisatinjegove vrednosti, reprezentaciju podataka ioperacije.
U Javi koristimo deklaraciju klase:Atributi (polja) odreuju vrednosti i reprezentaciju podataka.
Konstruktorii metodisu operacije.
Svaki objekat: ima svoje vrednosti atributa
je kreiran nekim konstruktorom moe biti izmenjen pozivom nekog svog metoda.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
4/33
4
Primer: tip podataka Person(1)
Deklaracija klase:
publicclassPerson {
publicString surname, forename;publicintyearOfBirth;
publicPerson (String sname, String fname,intyear) {
this.surname = sname; }
publicchangeName (String newName) {
this.surname = newName;}
}
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
5/33
Primer: tip podataka Person(2)
Primena u aplikaciji:Person p1 =
newPerson("Curie", "Pierre", 1859);
Person p2 =
newPerson("Sklodowska", "Marie", 1867);
p2.changeName(p1.surname);
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
6/33
Primer: tip podataka Date(1)
Deklaracija klase:
publicclassDate {
// Each Datevalue is a past, present, or future date.
// This date is represented by a year number y, a month number// m(112), and a day-in-month number d(131):
publicinty, m, d;
publicDate (inty, intm, intd) {
// Construct a date with year y, month m, and day-in-month d.
if(m < 1 || ) throw;this.y = y; this.m = m; this.d = d;
}
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
7/33
Primer: tip podataka Date(2)
Deklaracija klase (nastavak):publicvoidadvance (intn) {
// Advance this date by ndays (where n 0).inty = this.y, m = this.m,
d = this.d + n;
for(;;) {intlast = ; // no. of days in m/yif(d
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
8/33
Primer: tip podataka Date(3)
Primena u aplikaciji:
Date today = newDate(2001, 2, 14);
today.advance(16);
System.out.println(today.y + '-' +today.m
+ '-' + today.d);
Ovo bi trebalo da odtampa 2001-3-2.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
9/33
Primer: tip podataka Date (4)
Problem: Ovakva struktura podataka dozvoljavanekonzistentne podatke (npr., m= 0; ili m= 2 i d=
30).
Konstruktori i metodi bi trebali da budu implementiranida ne dozvoljavaju ovakve vrednosti. Npr:
Date today = newDate(2001, 2, 30);
bi trebalo da baci izuzetak.
Ali ta ako se poljima pristupa direktno?Date today = newDate(2001, 2, 14);
today.d += 16;
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
10/33
Primer: tip podataka Date(1)
Drugaija reprezentacija podataka:publicclassDate {
// Each Datevalue is a past, present, or future date.
// This date is represented by a day-in-epoch number d//
(where 0 represents 1 January 2000):
publicintd;
publicDate (inty, intm, intd) { }
publicvoidadvance (intn) { }
}
Ovakvom imlementacijom metod advanceje bri, aliDate()je sporiji.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
11/33
Primer: tip podataka Date(2)
Postojei kod aplikacije:Date today = newDate(2001, 2, 14);
today.advance(16);
System.out.println(today.y+ '-' + today.m
+ '-' + today.d);
GekaPogrena vrednost Geka
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
12/33
public ili private reprezentacija
podataka Ako je reprezentacija podataka public:
Kod aplikacije moe da kreira nekonzistentne
vrednosti.
Postojei kod aplikacije moe postati sintaksnoneispravan ako se promeni reprezentacija.
Ako je reprezentacija podataka private:
+ Aplikacija ne moe da kreira nekonzistentne
vrednosti.
+ Postojei kod aplikacije ne moe postati sintaksno
neispravan ako se promeni reprezentacija.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
13/33
Apstraktni tipovi podataka
Apstraktni tip podataka(abstract data type- ADT)je opisan: Skupom vrednosti
Skupom operacija.
Nije opisan reprezentacijom podataka.
Reprezentacija podataka je private, tako daaplikacija nema pristup podacima. (To mogu samooperacije.)
Reprezentacija podataka je promenljiva, bez efektana kod aplikacije. (Samo operacije moraju bitiouvane.)
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
14/33
Specifikacija ADT-a (1)
Za svaki ADT treba da postoji dogovor-ugovor koji: specificira skup vrednosti ADT-a
specificira svaku operaciju ADT-a(tj., ime operacije, parametre i tipove parametara, tippovratne vrednosti i ponaanje operacije).
U ugovoru se ne specificira reprezentacija podatakaniti algoritmi za implementaciju operacija.
Ponaanje operacije opisuje efekat vidljiv od stranekoda aplikacije.
Primer ponaanja: pretraiti niz. Primer algoritama sa takvim ponaanjem: linearna pretraga,
binarna pretraga...
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
15/33
Specifikacija ADT-a (2)
Programer ADT-a preuzima odgovornost daimplementira ADT koji zadovoljava ugovor.
Programer aplikacije radi sa ADT-om jedino prekooperacija specificiranih u ugovoru.
Podela odgovornosti: Programera ADT-a ne zanima u kakvim aplikacijama e se
ADT koristiti.
Programer aplikacije ne mora da zna kako je ADTimplementiran.
Podela odgovornosti je kljuni koncept kod dizajniranjai implementacije velikih sistema.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
16/33
Primer: ugovor za DateADT (1)
1) Vrednosti moraju biti svi prethodni, sadanji i
budui datumi.
2) Konstruisati datum iz godine y, meseca mi dana d.
3) Porediti datume.
4) Ispisati datum u nekom razumljivom formatu, npr.y-m-d.
5) Uveati datum za ndana.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
17/33
Primer: ugovor za DateADT (2)
Ugovor kao okvir klase:publicclassDate {
// Each Datevalue is a past, present, or future date.
private;
publicDate (inty, intm, intd);
// Construct a date with year y, month m, and day-in-month d.
publicintcompareTo (Date that);
// Return1 if this date is earlier than that,
// or 0 if this date is equal to that,
// or +1 if this date is later than that.publicString toString ();
// Return this date rendered in ISO format.
publicvoidadvance (intn);
// Advance this date by ndays (where n 0).
}
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
18/33
Primer: ugovor za DateADT (3)
Kod aplikacije:
Date today = ;
Date easter = newDate(2001, 4, 15);
today.advance(16);
if(today.compareTo(easter)< 0)
System.out.println(today.toString());
Kod koji se ne kompajlira:today.d+= 16;
System.out.println(today.y+ '-' + today.m
+ '-' + today.d);
grekagreka
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
19/33
Implementacija ADT-a
Implementacija ADT-a podrazumeva:
Odabir polgodne reprezentacije podataka
Odabir algoritma za svaku operaciju.
Reprezentacija podataka mora biti privatna.
Reprezentacija podataka mora da pokrije sve
mogue vrednosti.
Algoritmi moraju biti konzistentni sa reprezentacijompodataka.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
20/33
Primer: prva implementacija Date
ADT-a (1)
Deklaracija klase:publicclassDate {
// Each Datevalue is a past, present, or future date.
// This date is represented by a year number y, a month number
// m, and a day-in-month number d:privateinty, m, d;
publicDate (inty, intm, intd) {
// Construct a date with year y, month m, and day-in-month d.this.y = y; this.m = m; this.d = d;
}
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
21/33
Primer: prva implementacija Date
ADT-a(2)
publicintcompareTo (Date that) {
// Return1 if this date is earlier than that,
// or 0 if this date is equal to that,
// or +1 if this date is later than that.return(this.y < that.y ? -1 :
this.y > that.y ? +1 :
this.m < that.m ? -1 :
this.m > that.m ? +1 :
this.d < that.d ? -1 :
this.d > that.d ? +1 : 0);
}
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
22/33
Primer: prva implementacija Date
ADT-a (3)
publicString toString () {
// Return this date rendered in ISO format.
return(this.y + '-' + this.m + '-'
+ this.d);
}
publicvoidadvance (intn) {
// Advance this date by ndays (where n 0).
}
}
komplikovano
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
23/33
Primer: druga implementacija DateADT-a (1)
Deklaracija klase:
publicclassDate {
// Each Datevalue is a past, present, or future date.
// This date is represented by a day-in-epoch number d
// (where 0 represents 1 January 2000):privateintd;
publicDate (inty, intm, intd) {
// Construct a date with year y, month m, and day-in-month d.
;
this.d = ;}
komplikovano
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
24/33
Primer: druga implementacija DateADT-a (2)
publicintcompareTo (Date that) {
// Return1 if this date is earlier than that,
// or 0 if this date is equal to that,// or +1 if this date is later than that.return(this.d < that.d ? -1 :
this.d > that.d ? +1 : 0);
}
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
25/33
Primer: druga implementacija DateADT-a (3)
publicString toString () {
// Return this date rendered in ISO format.inty, m, d;
;return(y + '-' + m + '-' + d);
}
publicvoidadvance (intn) {
// Advance this date by ndays (where n 0).this.d += n;
}
}
komplikovano
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
26/33
Dizajn ADT-a (1)
Operacije su dovoljne ako zadovoljavaju svezahteve ADT-a.
Da li aplikacija moe biti korektno napisana
korienjem iskljuivo poziva operacija?
Operacija je neophodnaako nije viak uzahtevima ADT-a.
Da li operacija moe biti izbegnuta?
Dobro dizajniran ADT sadri operacije koje suneophodne i dovoljne za ispunjenje zahteva.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
27/33
Primer: dizajn DateADT-a (1)
publicclassDate {
private;
publicDate (inty, intm, intd);
publicintcompareTo (Date that);
publicString toString ();
publicvoidadvance (intn);
}
Sve operacije su dovoljne.
Sve operacije su neophodne.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
28/33
Primer: dizajn DateADT-a (2)
publicclassDate {
private;
publicDate (inty, intm, intd);
publicintgetYear ();publicintgetMonth ();
publicintgetDay ();
}
Ove operacije su dovoljne. (Operacije poreenja iispisa datuma su nezgrapnije ali i dalje mogue).
Sve operacije su neophodne.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
29/33
Primer: dizajn DateADT-a (3)
publicclassDate {
private;publicDate (inty, intm, intd);
publicintcompareTo (Date that);publicString toString ();publicvoidadvance (intn);publicvoidadvance1Day ();
} Operacija advance1Daynije neophodna.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
30/33
Dizajn ADT-a (2)
constructorje operacija koja kreira vrednost ADT-a. accessorje operacija koja koristi vrednost ADT-a da bi
izraunala vrednost nekog drugog tipa.
transformerje operacija koja rauna novu vrednostpostojeeg ADT-a.
Dobro dizajniran ADT sadri barem jedan constructor,accessor i transformer. Constructor-i i transformer-izajedno mogu da generiu sve vrednosti ADT-a.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
31/33
Dizajn ADT-a (3)
Transformer je: mutativeako prepisuje staru vrednost ADT-a nekom
novom vrednou
applicativeako vraa novu vrednost ADT-a, bez
menjanja stare vrednostinpr. metode saberi i saberiNa kod polinoma.
Vrednosti ADT-a mogu biti:
mutableako ADT obezbeuje barem jedanmutative transformer
immutableako ADT ne obezbeuje ni jedanmutative transformer.
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
32/33
Primer: dizajn DateADT-a (1)
publicclassDate {
private;
publicDate (inty, intm, intd);
publicintcompareTo (Date that);publicString toString ();
publicvoidadvance (intn);
}
constructor
mutative
transformer
accessoraccessor
-
7/24/2019 07. SPA1 - Apstraktni Tipovi Podataka
33/33
Primer: dizajn DateADT-a (2)
publicclassDate {
private;
publicDate (inty, intm, intd);
publicintcompareTo (Date that);publicString toString ();
publicDate plus (intn);
}
constructor
applicative
transformer
accessoraccessor