Kuinka suunnitella algoritmeja?

Algoritmien suunnitteluun ei ole selkeää reseptiä, vaan kyseessä on taito, joka kehittyy harjoittelun myötä. Tällä sivulla on kuitenkin joitakin vinkkejä, joista voi olla apua.

Lähtökohta

Hyvä lähtökohta algoritmin suunnitteluun on tieto siitä, että seuraavat tekniikat riittävät minkä tahansa algoritmin suunnitteluun:

  • muuttujat
  • ehdot (if)
  • silmukat (for ja while)
  • taulukot

Tämä tarkoittaa, että algoritmin suunnittelussa ei voi tarvita tietoa jostain kehittyneestä ohjelmointitekniikasta, jota ilman algoritmia ei voi toteuttaa. Esimerkiksi ei ole olemassa mitään algoritmia, jota ei voisi toteuttaa ilman rekursiota tai olioita.

Ajankäyttö

On myös hyvä tiedostaa, että tehokkaan algoritmin keksiminen voi viedä paljon aikaa. Miettiminen voi kestää useita tunteja tai päiviä (ei toki yhtäjaksoisesti).

Tärkeä osa algoritmien suunnittelua ovat harhapolut: mieleen tulee idea, miten algoritmin voisi toteuttaa, mutta idea osoittautuu vääräksi. Tämä kuuluu asiaan, ja myös harhapolut antavat tietoa ongelmasta, vaikka ne eivät sillä kertaa johtaneet ratkaisuun.

Saattaa myös olla, että et keksi algoritmia koskaan, ainakaan kurssin aikana. Tämä ei haittaa, koska kurssilla on eritasoisia tehtäviä ja osa on hyvin vaikeita.

Suunnittelu

Useimmat suosivat perinteisiä välineitä algoritmien suunnittelussa. Vaikka tällä kurssilla algoritmit toteutetaan tietokoneella, hyvä tapa suunnitella niitä on käyttää kynää ja paperia.

Algoritmin suunnittelu lähtee usein liikkeelle pienistä tapauksista, joita voi mukavasti hahmotella kynällä ja paperilla. Voit asettua itse algoritmin rooliin: kun sinulle annetaan ongelman syöte, miten ratkaisisit sen?

Suunnittelu vie usein huomattavan osan kokonaisajasta tehtävän ratkaisussa. Sitten kun tietää melko hyvin, miten algoritmi tulee toimimaan, sitä on mukava alkaa toteuttaa koodaamalla. Jotkin yksityiskohdat toki tarkentuvat vielä koodatessa.

Usein ei ole menestyksekäs tapa toimia käänteisesti eli ryhtyä koodaamaan heti, vaikka ei tiedä, mitä pitäisi koodata.

Itsenäisyys

Kurssin tärkeä tavoite on saavuttaa itsenäistä taitoa algoritmien suunnittelussa. On selvää, että tämä tavoite ei toteudu, jos saa algoritmien ideat jostain valmiina (esim. kaverilta tai netistä).

Huomaa, että algoritmien suunnittelun oppiminen on toisenlaista kuin ohjelmointikielen ominaisuuksien oppiminen. Jos haluat muuttaa Javassa merkkijonon kokonaisluvuksi, mutta et tiedä tai muista, miten sen voi tehdä, ei ole mitään pahaa etsiä suoraa ratkaisua netistä. Tällaisessa asiassa ei ole mitään syvällistä itse keksittävää, vaan Javassa on jokin tietty tapa hoitaa asia, joka pitää vain tietää.

Algoritmien suunnittelussa tilanne on kuitenkin täysin toinen, koska olennaista on oppia miettimään itse. Jos kaveri kertoo algoritmin idean tai löydät ratkaisun netistä, tämä ei kehitä omaa ajatteluasi.