07. SPA1 - Apstraktni Tipovi Podataka

Embed Size (px)

Citation preview

  • 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