2.8 TIETO- JA TALLETUSRAKENTEET Edellä olleissa esimerkeissä algoritmien käsittelemä tieto on ollut rakenteeltaan yksinkertaista, kuten lukuja, merkkejä totuusarvoja. Esimerkiksi asetuslauseessa r:=(k*p*t)/100 r, k, p, ja t ovat yksinkertaisia (ei-rakenteisia) muuttujia. Reaalimaailmassa on tarvetta myös edellisiä monimutkaisempien tietokokonaisuuksien käsittelyyn.
Tällaiset loogisesti yhteenkuuluvat tiedot muodostavat tietorakenteen (data structure). Algoritmien pystyvät käsittelemään näitä rakenteita ja usein algoritmit kuvaavat prosesseja, jotka muuntavat yhden tietorakenteen toiseksi (esim. syöttötiedot tulostiedoksi).
Yksittäisellä tietoalkiolla on tyyppi, joka kertoo, joka kertoo millaisia arvoja tarkasteltava tietoalkio voi saada ja millaisia operaatioita alkioon voi soveltaa. Tietorakenteet muodostetaan tietoalkioista. Ohjelmointikielissä on valmiiksi määritelty kaikki yleisimmät yksinkertaiset tietotyypit. Lisäksi kielissä on välineet tietorakenteiden konstruoimiseksi.
Tavallisimpia yksinkertaisia tyyppejä: reaaliluvut (Real) kokonaisluvut (Integer) totuusarvot (Boolean) merkit (Char) ’Tyyppi’ tarkoittaa kahta asiaa: minkälaisia arvoja ko. tietoalkio voi saada ja mitkä operaatiot ovat mahdollisia.
Esimerkki: Tyyppi Integer: ohjelmointikielissä ilmoitetaan millä vaihteluvälillä kokonais- lukujen tulee olla (esim. -32678 32767 tai usein jokin tätä suurempi vv.) Lisäksi ilmoitetaan mitä kokonaisluku- operaatioita on käytössä, esim.: + - * / DIV MOD
Vastaavat arvoalueet ja operaatiot ilmoitetaan kaikille muillekin yksinkertaisille perustyypeille kunkin kielen yhteydessä.
Tietorakenteisiin liittyy kaksi ominaisuutta: abstrakti malli eli abstrakti tietotyyppi ADT (abstract data type) talletusrakenne (storage structure)
Mitä ADT tarkoittaa ? tarkastellaan mallin mukaisten alkioiden oleellisia piirteitä malli on riippumaton käytettävästä ohjelmointikielestä alkiot kuvataan niiden käytöksen avulla (operaatiot ja niiden vaikutus)
Abstraktien tietotyyppien avulla siis mallinnetaan tietoalkioita ohjelmointikielistä ja talletusrakenteista riippumattomasti. Tässä tarkastellaan seuraavia yleisimpiä adt- tyyppejä: lista, jono, pino, puu ja graafi. Niiden toteutukseen käytetään mm. seuraavia talletusrakenteita: tietue, taulukko ja linkitetty rakenne.
2.8.2 Talletusrakenteita Tietue (record) Taulukko (array tai table) Linkitetty rakenne
Tietue Loogisesti yhteenkuuluvat tiedot kootaan yhdeksi tietorakenteeksi, jolle annetaan nimi. Tietue (record) muodostuu kentistä (field). Oliokielissä likimain vastaava rakenne on luokka (class).
Tietue Esimerkki: yhdestä henkilöstä tieto- järjestelmään kerättävät tiedot voidaan koota tietueeksi. Tällöin kenttinä voisivat olla mm. sukunimi, etunimi, syntymäaika, osoite,… Joissakin kielissä tietueet määritellään RECORD/END –määreellä:
Tietue esimerkiksi henkilötietojen tietue: henkilotiedot = RECORD sukunimi: String; etunimi: String; osoite: String; saika: Date; … END
Tietue Tietueiden käsittely on yksinkertaista: olkoon kahden henkilön tiedot kahdessa eri em. tyyppisessä tietueessa A ja B. Silloin kenttiin viitattaisiin merkinnällä (pistenotaatio): A.sukunimi, B.sukunimi, A.saika jne. Kenttiä voidaan käyttää ohjelmissa kuten muuttujia.
Tietue Tietueoperaatioita: arvon sijoittaminen tietueen kenttään tietueen yksittäisen kentän käyttäminen tietueen kopiointi kokonaisena.
Taulukko Taulukko (array) määritellään ohjelman alussa tietyn kokoiseksi rakenteeksi. Se koostuu keskenään samaa tietotyyppiä olevista alkioista, ’ruuduista’. Taulukko voidaan käsittää rakennelmaksi, jossa on rivejä ja sarakkeita (ns. kaksiulotteinen taulukko).
Taulukko, jossa on 8 riviä ja 5 saraketta:
Taulukko Taulukon alkioihin (ruutuihin) päästään käsiksi indeksien avulla. Merkintä X[4,2] tarkoittaa X- nimisen taulukon 4. rivillä, 2. sarakkeessa olevaa ruutua:
Taulukko Taulukko voi olla 1-ulotteinen, 2-ulotteinen, 3-ulotteinen, ….. Edellisen sivun taulukko on 2-ulotteinen. 1-ulotteinen taulukko = vektori Indeksoitu yhdellä indeksillä, esim. V[5]
Taulukko 2-ulotteinen taulukko (matriisi), indeksointi kahdella indeksillä, esim. edellä X[4,2]
Taulukko 3-ulotteinen taulukko indeksointi kolmella indeksillä, esim. edellä X[2,4,5]
Taulukko Esimerkki (moniste s. 58): Vaihtolajittelualgoritmi. Nimilista on talletettu 1-ulotteiseen taulukkoon T. MODULE valintalajittelu (T, n) FOR i:=1, 2, …, n-1 DO FOR j:=i+1, i+2, …, n DO IF T[i] > T[j] THEN vaihda (T[i],[j]) ENDIF ENDFOR ENDMODULE
Taulukko Esimerkki (moniste s. 58): Paikkakuntien välinen etäisyystaulukko (km). Esim. kuudelle kaupungille tarvitaan 6 x 6 –kokoa oleva taulukko: Iisalmi Jyväs-kylä Kuopio Pieksä- mäki Suonen-joki Var- kaus 254 85 174 136 223 169 80 118 129 89 51 138 38 49 Suonen- joki 87 Varkaus
Taulukko MODULE LähinKaupunki(Etä, a) RETURNS a:ta lähinnä olevan kaupungin nimen lähinmatka:=100000 (* jokin iso luku alkuarvoksi *) FOR j:=Iisalmi, …, Varkaus DO IF a <> j THEN IF Etä[a,j] < lähinmatka THEN lähinmatka:=Etä[a,j] lähin:=j ENDIF ENDFOR RETURN lähin ENDMODULE
Taulukko Huom: Taulukon indekseinä käytettiin paikkakuntien nimiä (ei ole mahdollista kaikissa o-kielissä). Taulukossa kaikki etäisyydet kahteen kertaan !
Taulukko MODULE taulusumma (Taulu, m, n) RETURNS lukujen summa Esimerkki: n x m –kokoa olevan taulukon sisältämien lukujen summa: MODULE taulusumma (Taulu, m, n) RETURNS lukujen summa summa:=0 FOR i:=1, …, n DO FOR j:=1, …m DO summa:=summa+Taulu([i,j] ENDFOR RETURN summa ENDMODULE
Linkitetty rakenne Yleensä linkitetty rakenne on yhteenkuuluvien tietueiden muodostama kokoelma. Tietueet liitetään eli linkitetään toisiinsa erityisten osoitin- eli linkki- kentän avulla. Rakennelma toteutetaan tietokoneen keskusmuistissa, osoittimet ovat siten tietokoneen muistipaikkojen numeerisia arvoja. Linkitetyn rakenteen tietoalkio sisältää siis varsinaisen datan ja osoittimen seuraajaan. (Joskus osoittimia on useampia kuin yksi).
Linkitetty rakenne data 1 … data n osoitin seuraajaan Tietoalkion rakenne on periaatteessa seuraavanlainen, käytetään yhtä osoitinta:
Linkitetty rakenne L … Yllä on yksiosoittiminen eli yhteen suuntaan ketjutettu (lineaarinen) lista L. Rakenne on rekursiivinen: jokaista alkiota seuraa lista, tosin alkuperäistä pienempi. Poikkeuksena viimeinen alkio: sillä ei ole seuraajaa (”maadoitusmerkki”).
Linkitetty rakenne L … L’ Yllä on kaksiosoittiminen eli kahteen suuntaan ketjutettu (lineaarinen) lista L.
Linkitetty rakenne L … Ylläolevassa listassa on käytössä rengas- rakenne: viimeisestä alkiosta on osoitin listan alkuun. LISTOJEN TOTEUTUSTA TARKASTELLAAN KOHDASSA 2.8.3.2.
Linkitetty rakenne, mitä hyötyä: alkioiden poisto ja lisäys helppoa dynaaminen rakenne: alkioita otetaan listaan vain tarpeen mukaan (vrt. esim. vektorit, jotka yleensä tulee määritellä kiinteän kokoisiksi). Esimerkiksi POISTO listan keskeltä: L 1 2 3 … … L 1 3 … …