Algoritem je navodilo, kako rešimo nek določen problem. Običajno je zapisan kot seznam korakov, ki nas pripeljejo do rešitve problema. V tem pogledu lahko najdemo analogijo z iskanjem poti iz labirinta (kar je seveda spet problem). Nekdo, ki se pred takimi problemi prvič znajde, bo imel več težav, kot nekdo z izkušnjami. Zato naj bi veljalo, da se lotimo najprej bolj preprostih problemov (oziroma programov) in se šele kasneje lotimo bolj zamotanih. Kasneje se bomo navadili tudi, da lahko v naše programe vključujemo delčke kode starejših, že uporabljenih programov.
Pomislimo nato, kako bi nalogo razdelili v manjše naloge oziroma faze ali korake. Pomislimo na kuharske recepte, kjer potekajo stvari prav tako korak za korakom. |
Naučimo se osnovnih postopkov za razvoj rešitve problema. Nič v tem poglavju ne terja prav uporabe računalnika za rešitev problema. Ta pnačin lahko uporabimo za reševanje številnih problemov, vključno s tistimi, ki nimajo nič skupnega z računalniki.
Če je pred mano nek problem, ki ga moram rešiti, si pri tem pomagam s primernim orodjem. To samo po sebi ne reši problema. Še vedno sem jaz tisti, ki moram opraviti nalogo. Običajno v sebi sestavim načrt, kako bom nalogo opravil. Tako tudi računalnik sam od sebe ne reši problema. Jaz sem tisti, ki moram računalnik uporabiti kot orodje.
Vsako reševanje problema se začne z načrtom. Ta načrt imenujmo algoritem.
Algoritem je načrt za reševanje problema.
Obstaja veliko načinov za zapis algoritma. Nekateri so zelo neformalni,
nekateri so precej formalne in matematične narave, nekateri pa so precej
grafični. Navodila za priključitev DVD predvajalnika na televizor so
algoritem. Matematična formula, kot je πr2, je poseben primer
algoritma. Oblika ni posebej pomembna, če zagotavlja dober način za
opisovanje in preverjanje logike načrta.
Razvoj algoritma (načrta) je ključni korak pri reševanju problema. Ko
imamo algoritem, ga lahko prevedemo v računalniški program v nekem
programskem jeziku. Naš proces razvoja algoritmov je sestavljen iz petih
glavnih korakov.
1. korak: Problem opišimo.
2. korak: Problem analizirajmo.
3. korak: Razvijmo grob načrt (algoritem) za rešitev probklema.
4. korak: Če je potrebno, izboljšajmo algoritem z dodajanjem podrobnosti.
5. korak: Preverimo algoritem.
Ta korak je veliko težji, kot se zdi. V nadaljevanju označimo z besedo naročnik nekoga, ki želi najti rešitev za problem, in z besedo razvijalec nekoga, ki najde način za rešitev problema. Razvijalec mora ustvariti algoritem, ki bo rešil naročnikov problem.
Naročnik je odgovoren za opis problema, vendar je to pogosto najšibkejši del procesa. Povsem običajno je, da opis problema trpi zaradi ene ali več naslednjih vrst napak:
Te napake so redko posledica nepazljivosti naročnika. Bolj verjetno so posledica dejstva, da so naravni jeziki (angleščina, francoščina, korejščina itd.) precej nenatančni. Del odgovornosti razvijalca je tudi odkrivanje napak v opisu problema in delo z naročnikom za odpravo teh napak.
Namen tega koraka je določiti začetno in končno točko za reševanje problema. Ta proces je analogen matematiku, ki določa, kaj je podano in kaj mora biti dokazano. Dober opis problema olajša izvedbo tega koraka.
Pri določanju izhodišča moramo najprej poiskati odgovore na naslednja vprašanja:
Pri določanju končne točke moramo opisati značilnosti rešitve. Z drugimi besedami, kako bomo vedeli, kdaj končamo? Postavljanje naslednjih vprašanj pogosto pomaga določiti končno točko.
Algoritem
je načrt za reševanje problema, vendar načrti prihajajo v več stopnjah
podrobnosti. Ponavadi je bolje, da začnemo z grobim algoritmom
(algoritmom na visokem nivoju), ki vključuje večji del rešitve, vendar
pustimo podrobnosti pozneje.
Oglejmo si koncept grobega (visokonivojskega) algoritma na vsakodnevnem primeru:
Problem: Poslati moram pozdrav svojemu prijatelju Janezu.
Končno
moramo algoritem pregledati. Kaj iščemo? Najprej se moramo
pomikati po algoritmu korak za korakom, da ugotovimo, ali bo rešil
prvotni problem ali ne. Ko smo prepričani, da algoritem zagotavlja
rešitev problema, začnemo preverjati druge stvari.
Naslednja vprašanja so tipično tista, na katere moramo odgovoriti pri preverjanju algoritma. Tako tudi razvijamo spretnosti, ki jih bomo lahko uporabili pri naslednjih problemih.
Primer: algoritem, ki izračuna obseg kroga s polmerom 5 cm metra (formula 2*π * 5), reši zelo specifičen problem, vendar algoritem, ki izračuna obseg katerega koli kroga (formula 2*π *r), rešuje splošnejši problem.
Ugotovitev: Vsaka formula vključuje množenje dveh podatkov.
Imamo 9 kvadrov različnih dolžin.
Pomešani so, radi bi jih razvrstili po velikosti
Kvadre bomo risali kot pravokotnike v različnih barvah.
|
Najprej poglejmo korake, ki so potrebni za razporejanje dveh posamičnih kvadrov:
Animacija na levi prikazuje razvoj grobega algoritma |
|
Sedaj znamo razporediti dva kvadra. Kaj pa, če jih je v vrsti več? Kvadre spet pomešajmo in naredimo algoritem, da bo največji kvader potisnjen skrajno desno, ostali pa ostanejo tam, kjer so. Algoritem bi sedaj bil tak:
Na koncu bo največji kvader končal na skrajni desni |
|
Dodatna izboljšava: Tako smo doslej potisnili (razvrstili) največji kvader skrajno desno. Ostali so še nerazporejeni. Ponovimo postopek s preostalimi kvadri in to tolikokrat, koilikor je še nerazporejenih kvadrov. Vsakokrat potisnemo največji kvader v preostanku skupine skrajno desno. |
Ugotovimo, da razviti algoritem reši naš problem. Kvadri so na koncu urejeni po velikosti od najmanjšega na levi do največjega na desni.
A imeli smo opravka le z 9 kvadri. Če bi jih bilo veliko, bi bil ta algoritem preveč zamuden. Uporabiti bi morali boljše strategije.
Podoben problem srečamo na primer, če je naša naloga sestaviti vse pare v veliikeeem kupu pomešanih nogavic :) Le kako bi se lotili te naloge? |