1 / 28

18. Abstraktit tietotyypit

18. Abstraktit tietotyypit. Sisällys. Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. Johdanto.

sanaa
Download Presentation

18. Abstraktit tietotyypit

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 18. Abstraktit tietotyypit

  2. Sisällys • Johdanto abstrakteihin tietotyyppeihin. • Pino ja jono. • Linkitetty lista. • Pino linkitetyllä listalla toteutettuna.

  3. Johdanto • Javan omat tietotyypit ovat jo tuttuja: alkeistietotyypit (esimerkiksi int ja double) ja viitetietotyypit (luokat, rajapinnat ja taulukot). • Abstrakti tietotyyppi (abstract data type) on tietotyypin kuvaus, jossa ei oteta kantaa tyypin toteutukseen tai edes toteutuskieleen. • Ympäristö tuntee vain liittymän, jolla abstraktia tietotyyppiä käytetään.

  4. Johdanto • Abstrakti tietotyyppi koostuu • operaatioista: tyypin liittymä ympäristöön ja • tietorakenteesta: tyypin sisäinen tiedonesitystapa. • Tietorakenne (data structure) voitava vaihtaa ilman, että operaatioiden otsikkoja tarvitsee muuttaa. • Abstraktin tietotyypin käyttäjä ei ole kiinnostunut tietorakenteesta vaan nimenomaan tietotyypin tarjoamista operaatioista.

  5. Johdanto • Esim. Abstraktin tietotyypin Aika käyttäjää ei niinkään kiinnosta ajan esitystapa tietotyypin sisällä, vaan se kuinka voidaan vaikkapa laskea kahden ajankohdan välinen aika. • Usein abstraktin tietotyypin tietorakenne sisältää useita tietoja, jolloin yksittäistä tietoa sanotaan alkioksi.

  6. Johdanto • Abstraktin tietotyypin idea on hyvin samankaltainen kuin luokkien, mutta abstraktit tietotyypit ovat olio-ohjelmointia vanhempi keksintö. • Olio-ohjelmointi tarjoaa mainion tavan toteuttaa abstrakteja tietotyyppejä • operaatiot metodeiksi ja • tietorakenne private-tyyppiseksi attribuutiksi. • Abstrakti tietotyyppi voidaan siis toteuttaa näppärästi kapseloituna luokkana.

  7. Pino • Pino (stack) on abstrakti tietotyyppi, jossa • lisättävä alkio menee aina pinon päälle ja • poistettava alkio otetaan aina pinon päältä. • Last-In-First-Out (LIFO) periaate. • Lisäykset ja poistot alkio kerrallaan. • Analogiana voi ajatella korttipakkaa pasianssissa: • Pakkaan voidaan lisätä kortti vain päälle (ei pakan väliin tai pohjalle). • Pakasta voidaan ottaa vain päällimmäinen kortti (ei pakan välistä tai pohjalta).

  8. Pinon operaatioita • lisää(Alkio a): lisää alkion a pinon päälle, mikäli pinoon mahtuu vielä uusi alkio. • poista(): palauttaa ja poistaa pinon päällimmäisen alkion, mikäli pinossa on alkioita. • koko(): alkioiden lukumäärä (≥ 0) pinossa. • onkoTyhjä(): palauttaa totuusarvon true, jos pino on tyhjä ja totuusarvon false, jos pinossa ainakin yksi alkio. • ylin(): palauttaa päällimmäisen alkion sitä poistamatta, mikäli pinossa on alkioita. • Tietorakenne: esimerkiksi taulukko tai linkitetty lista.

  9. Luodaan tyhjä, maksimissaan 5 alkiota sisältävä pino. lisää(A) koko() = 1 onkoTyhjä() = false Esimerkki lisää(C) koko() = 3 lisää(D) koko() = 4 lisää(B) koko() = 2

  10. lisää(E) Pino täynnä: koko() = 5 Esimerkki poista() = A Pino tyhjä: koko() = 0 onkoTyhjä() = true poista() = D koko() = 3 poista() = C koko() = 2 poista() = B koko() = 1 poista() = E koko() = 4 ylin() = D koko() = 4

  11. Jono • Jono (queue) on abstrakti tietotyyppi, jossa • lisättävä alkio menee aina jonon loppuun ja • poistettava alkio otetaan aina jonon alusta. • First-In-First-Out (FIFO) periaate. • Lisäykset ja poistot alkio kerrallaan. • Esim. Ruokalan jono, jossa ensiksi tullutta asiakasta palvellaan ensiksi ja uudet asiakkaat sijoittuvat kiltisti jonon loppuun.

  12. Jonon operaatioita • lisää(Alkio a): lisää alkion a jonon loppuun, mikäli jonossa on vielä tilaa. • poista(): palauttaa ja poistaa ensimmäisen alkion jonosta, mikäli jono ei ole tyhjä. • koko(): alkioiden lukumäärä (≥ 0) jonossa. • onkoTyhjä(): palauttaa totuusarvon true, jos jono on tyhjä ja totuusarvon false, jos jonossa ainakin yksi alkio. • keula(): palauttaa jonon ensimmäisen alkion sitä poistamatta, mikäli jono ei ole tyhjä. • Tietorakenne: esimerkiksi taulukko tai linkitetty lista.

  13. Luodaan tyhjä, maksimissaan 5 alkiota sisältävä jono. lisää(A), koko() = 1, onkoTyhjä() = false lisää(B), koko() = 2 lisää(C), koko() = 3, lisää(D), koko() = 4 Esimerkki

  14. lisää(E), Jono täynnä: koko() = 5 poista() = A, koko() = 4, keula() = B, koko() = 4 poista() = B, koko() = 3, poista() = C, koko() = 2, poista() = D, koko() = 1 poista() = E, Jono tyhjä: koko() = 0, onkoTyhjä() = true Esimerkki

  15. Linkitetty lista • Linkitetty lista (linked list) on tietorakenne, joka koostuu toisiinsa viittaavista solmuista(node). • Taulukon tapaan listan alkioilla on järjestys ja alkioihin voidaan yleensä myös viitata nollasta alkavan indeksin avulla. • Taulukosta poiketen linkitetty lista on dynaaminen tietorakenne, joka käyttää aina muistia täsmälleen tarvittavan määrän: Alkioiden lisääminen ja poistaminen muuttaa listan kokoa. • Yksinkertaisin muoto yhteen suuntaan linkitetty lista.

  16. Solmu = tietoalkio + viite seuraavaan solmuun. public class Solmu { private Object alkio; private Solmu seuraava; public Solmu(Object uusi) { alkio = uusi; seuraava = null; } ... } String sana1 = new String("kissa"); Solmu s = new Solmu(sana1); Yhteen suuntaan linkitetty lista (YSLL) s seuraava Solmu-olio null alkio "kissa" sana1

  17. paa hanta seuraava seuraava seuraava Solmu-olio Solmu-olio Solmu-olio alkio alkio alkio "kissa" "istuu" "katolla" Yhteen suuntaan linkitetty lista (YSLL) • Pää (head) on listan ensimmäinen solmu. • Häntä (tail) on listan viimeinen solmu. • Viimeinen viite osoittaa null-arvoon. • Esim. Kolmisolmuinen YSLL, jonka tietoalkiot ovat merkkijonoja. null

  18. Yhteen suuntaan linkitetty lista (YSLL) • Operaatiot määritellään lähteestä riippuen hieman eri tavoin. • Toteutukseenkin useita lähestymistapoja: Esimerkiksi käytetäänkö vartijasolmuja vai ei? • Nyt pyritään mahdollisimman yksinkertaiseen ratkaisuun.

  19. lisääAlkuun(Alkio a): Lisää listalle uuden pään, joka sisältää alkion a. lisääLoppuun(Alkio a): Lisää listalle uuden hännän, joka sisältää alkion a. lisää(int indeksi, Alkio a): Lisää annettuun listan kohtaan uuden solmun, joka sisältää alkion a. poistaAlusta(): Poistaa listan pään ja palauttaa pään alkion. poistaLopusta(): Poistaa listan hännän ja palauttaa hännän alkion. poista(int indeksi): Poistaa solmun annetusta kohdasta ja palauttaa poistetun solmun alkion. YSLL:n operaatiot

  20. alkio(int indeksi): Palauttaa annetussa kohdassa olevan solmun alkion. korvaa(int indeksi, Alkio a) Korvaa annetussa kohdassa olevan solmun tietoalkion annetulla alkiolla a. koko(): Palauttaa listan solmujen lukumäärän. onkoTyhjä(): Palauttaa totuusarvon true, mikäli listassa ei ole solmuja, ja totuusarvon false, mikäli listassa on yksi tai useampi solmu. YSLL:n operaatiot

  21. Lista ennen lisäystä: // Luodaan uusi solmu. Solmu uusi = new Solmu(alkio); // Uusi solmu osoittamaan päähän. uusi.seuraava(paa); // Uusi solmu listan pääksi. paa = uusi; hanta hanta uusi hanta null null null null "katolla" "musta" "katolla" "katolla" paa paa uusi "kissa" "kissa" "musta" paa uusi "kissa" "musta" Listan alkuun lisääminen

  22. // Haetaan edeltävä solmu. Solmu edeltava = haeSolmu(paikka-1); // Paikassa oleva solmu. Solmu paikassa = edeltava.seuraava(); Lista ennen lisäystä: // Luodaan uusi solmu. Solmu uusi = new Solmu(alkio); uusi hanta hanta null null null paa edeltava edeltava paa paa "istuu" "katolla" "katolla" "musta" "musta" "musta" paikassa hanta null "kissa" "kissa" "kissa" "katolla" Listan keskelle (paikkaan 2) lisääminen

  23. // Asetetaan uusi solmu // viittaamaan paikan solmuun. uusi.seuraava(paikassa); // Asetetaan edellinen solmu // viittaamaan uuteen solmuun. edeltava.seuraava(uusi); edeltava paa paa "musta" "musta" edeltava paikassa paikassa hanta hanta uusi uusi null null "kissa" "katolla" "katolla" "istuu" "istuu" "kissa" Listan keskelle (paikkaan 2) lisääminen

  24. Lista ennen poistoa: // Asetetaan apuviite häntään, jotta poistettavaa solmua ei hukata. Solmu poistettava = hanta; hanta paa paa null "katolla" "kissa" "istuu" "istuu" "kissa" "musta" "musta" hanta poistettava null "katolla" Listan lopusta poistaminen

  25. // Edellisestä solmusta uusi häntä. hanta = haeSolmu(koko - 2); // Poistetaan viite vanhaan häntään. hanta.seuraava(null); paa paa poistettava hanta hanta null "kissa" "istuu" "istuu" "kissa" "musta" "musta" "katolla" poistettava null "katolla" Listan lopusta poistaminen

  26. Lista ennen poistoa: // Haetaan poistettavaa solmua edeltävä solmu. Solmu edeltava = haeSolmu(paikka - 1); hanta hanta null null paa "istuu" "istuu" "musta" paa edeltava "musta" "kissa" "kissa" Listan keskeltä (paikasta 1) poistaminen

  27. // Poistettava solmu. Solmu poistettava = edeltava.seuraava(); // Asetetaan edellinen solmu viittaamaan poistettavaa solmua // seuraavaan solmuun, jolloin poistettava solmu linkitetään pois. edeltava.seuraava(poistettava.seuraava()); hanta null poistettava poistettava paa edeltava "istuu" "musta" hanta paa edeltava null "kissa" "kissa" "istuu" "musta" Listan keskeltä (paikasta 1) poistaminen

  28. <<interface>> Lista AbstraktiLista # koko: Integer + lisaaAlkuun(alkio: Object) : Void + lisaaLoppuun(alkio: Object) : Void +lisaa(paikka: Integer, alkio: Object) : Boolean + poistaAlusta() : Object + poistaLopusta() : Object + poista(paikka: Integer) : Object + alkio(paikka: Integer) : Object + koko(): Integer + onkoTyhja() : Boolean seuraava LinkitettyLista 2 paa, hanta Solmu 0..1 AbstraktiLista-luokka toteuttaa Lista-rajapinnan mahdollisimman minimaalisella tavalla. Varsinainen toteutus tapahtuu konkreettisessa LinkitettyLista-luokassa. 1 LinkitettyLista-luokka

More Related