Algoritmit ja tietorakenteet


Algoritmi kuvaa asetetun ongelman tai tehtävän ratkaisun yksiselitteisesti. Usein algoritmi voidaan osittaa niin että sen osat voidaan edelleen kuvata algoritmeilla. Algoritmit yleensä saavat syötteen ja tuottavat tulosteen, syötteen ja tulosteen sisältämien tietorakenteiden ja tietosisältöjen ero heijastelee algoritmin toimintaa. Vaikka juuri tuloste usein edustaa tehtävän/ongelman ratkaisua, niin algoritmeilla voi olla sivuvaikutuksia, jotka ratkaisevat tehtävän. Kuvassa 1 on esitetty algoritmin proseduraalinen toteutus, jossa tietorakenteet ja niihin kohdistettavat käsittelyt ovat tietokoneen muistiavaruudessa fyysisesti erillisinä. Vuorovaikutteisissa algoritmeissa, kuten komentotulkit, käyttöliittymät ym. syöte- ja tulostejoukot korvautuvat tosiaikaisilla syöte- ja tulostevirroilla, joiden kohteena ja lähteenä yleensä on käyttäjä.

kuva 1: Proseduuri P1 käsittelee tietorakenteita d1 ja d2.


Rinnakkaisalgoritmit edustavat erästä algoritmien erityisluokkaa, ne perustuvat useisiin samanaikaisesti suorittuviin prosesseihin. Alkeisrutiinien tasolla nämäkin usein perustuvat syöte-käsittely-tuloste -mallin mukaisiin algoritmeihin - moduleihin, joissa tietosisällön muutokset heijastelevat niihin sovellettuja käsittelyjä.
Proseduraalisten ohjelmointikielten kehitys ja leviäminen liittyi algoritmien tutkimuksen suosioon. Pienimuistisissa ja yksiprosessorisissa (merkkipohjaisissa) tietokoneympäristöissä hyvin määriteltyjen algoritmien pohjalta ohjelmoidut proseduurit olivat riittävän pelkistettyjä, jotta niiden tila- ja aikavaatimukset olivat arvioitavissa ja jopa todistettavissa. Proseduraalisen ohjelmoinnin tekniikat kehittyivät niin, että ohjelmat voitiin osittaa itsenäisiksi prosesseiksi, joilla oli omaan suoritusaikaansa sidottuja tietorakenteita ulkoisten, parametreina välitettävien syötteiden ja tulosteiden lisäksi, (kuva 2). Proseduraalisen ajattelun joustavuutta osoittaa se, että ensimmäiset rinnakkaisohjelmointikielet perustuivat rinnakkaisiin keskenään tietorakenteiden välityksellä kommunikoiviin prosesseihin.
Esimerkkinä modulaarisen suunnittelun voimasta Unix - käyttöjärjestelmäfilosofia, joka on rakennettu peruspalvelut toteuttavan ytimen ympärille organisoiduille proseduurikirjastoille. Kunkin käyttäjän sovellukset rakennetaan peruspalveluiden ja kirjastojen päälle omaksi ohjelmakerroksekseen - pyrkimyksenä maksimaalinen siirrettävyys. Eri järjestelmiin kirjastot on voitu toteuttaa laitteiston vaatimukset ja mahdollisuudet huomioiden. Kirjastojen kehittäminen ja ylläpito voidaan hallita, kun ositus on sopivalla karkeustasolla.


kuva 2: Proseduurit P ja Q on ositettu moduleihin, jotka käsittelevät tietorakenteita d1 ja d2. Tietorakenteet voivat olla moduleille paikallisia, ts. ne ovat olemassa vain proseduurin suorituksen ajan



Ohjelmien modulaarisuuden lisääntyminen antaa mahdollisuuden yksittäisten prosessien ja osatoimintojen arviointiin. Samanaikaisesti monimutkaistuvat tietorakenteet vaativat entistä huolellisempaa analyyttista suunnittelua. Proseduraalisessa ohjelmoinnissa tätä epäsuhtaa pyritään korjaamaan abstraktien tietotyyppien (ADT) avulla. Modulaarisen ohjelmoinnin kehityksen huippuna voidaan pitää Modula-2 kieltä, esimerkiksi (Cooper) erityisesti kappaleet 11-14.
Proseduurit voivat käsitellä vain ennalta määritellyn tyyppistä tietoa - numero-, merkki- tai käyttäjän määrittelemiä syötteitä ja tulosteita. Rakenteellisista tietotyypeistä muodostetaan osoiteviittausten avulla mukautuvia, tietoalkioita sisältäviä struktuureita ja määritellään niiden käsittelemisen kuvaavat proseduurit. Osoitteiden avulla vaihtuvakokoiseksi tai -muotoiseksi ketjutettavia rakenteita sanotaan dynaamisiksi tietorakenteiksi; tietorakenteen ja siihen sovellettavien käsittelyiden yhdistelmää sanotaan abstraktiksi tietotyypiksi, esim. (kuva 3). Proseduraalisessa ohjelmoinnissa ohjelmien laatuun ja vaatimuksiin vaikuttaa ratkaisevasti oikeiden abstraktioiden valinta.
Pascal ohjelmointikielen kehittäjä Niklaus Wirth nimesi abstrakteja tietotyyppejä käsittelevän kirjansa: Algoritmit + tietorakenteet = ohjelmat. Hän kuvaa kirjassaan abstraktien tietotyyppien perusvalikoiman pascal-kieliset toteutukset. Perusrakenteista tärkeimpinä mainittakoon listat, puut ja verkot. Epäsuoran viittauksen ansiosta rakenteisiin voidaan tallettaa mielivaltainen määrä tietoalkioita toisin kuin kiinteämuotoisiin rakenteellisiin tietotyyppeihin.

kuva 3: Listatyypin graafinen esitys.


Ohjelmien modulaarisuuden kehitys johti top-down suunnittelumetodin suosion kasvuun erityisesti ohjelmoinnin opetuksessa. Edward Yourdon kehitteli ratkaisukokonaisuudesta yksityiskohtiin etenevää analyyttistä ja osittavaa ohjelmien kehitys- ja suunnittelumetodia. Yourdonin strukturoidusta ohjelmansuunnittelumetodista katso esimerkiksi (Page-Jones). Kokonaisuudesta yksityiskohtiin eteneminen yhdistettynä jokaisen suunnittelutason samanaikaiseen testaamiseen oli hänen mukaansa ohjelmien laadun ja projektien ajoituksen paras tae.
Top-down suunnittelussa sovellettavaa ositusta voidaan myös tarkastella geneettisen algoritmin näkökulmasta: miten ongelma ositetaan niin, että ratkaisun toteuttavat modulit ovat versioitavissa ja kuvattavissa perimää edustavien geenien avulla?
Jos algoritmin toteuttavaa proseduuria käsitellään kuten perimää edustavaa merkkijonoa, kromosomia, niin risteytys tai mutaatio voi tuottaa vain sattumalta syntaktisesti merkityksellisen merkkijonon - semantiikasta puhumattakaan; siis suomeksi sanottuna toimivan ohjelman. Biologisen mallin mukaisen risteytyksen sijasta on käytettävä sovelluskohtaisia perimää muokkaavia rutiineja, jos halutaan välttyä mielettömiltä versioilta.


Edellinen Sisältö Seuraava