Pages

Saturday, May 12, 2012

Algoritmi (klasični)

Zašto je poznavanje algoritama bitno? Postoji više razloga zašto je bitno. Pravim entuzijastima bitno je napisati nešto što nitko do sad nije napisao i da radi brže i bolje. Komercijalno algoritmi su bitni da uz što manju potrošnju resursa, program može raditi brže od konkurencije. Općenito postoji puno algoritama koji se koriste za različite svrhe. Ipak jedna skupina algoritama koju možemo nazvati generičkim algoritmima (klasičnim), su algoritmi koji se mogu primijeniti na velik skup problema koji se javljaju u "svakodnevnom" programiranju.

Jedan od takvih problema je sortiranje. Ako se zna kako najbrže sortirati niz brojeva, onda uvijek kada se pojavi problem sortiranja možemo primijeniti taj algoritam, i možemo biti sigurni da je to najbolje što se može napraviti. Još važnija činjenica je da se algoritmi mogu prilagoditi za probleme koje inicijalno ne rješavaju. I tu se zapravo krije prava ljepota algoritama.

Ako se pogleda algoritam za sortiranje "Merge sort" ispod haube, vidi se da se tu krije "Podjeli i vladaj" (engl. "Divide and conquer") algoritam. Ova, nazovimo ju paradigma veoma je popularna u rješavanju problema, i to bi trebao biti jedan od osnovnih alata svakog programera.

Svi programeri bi kroz svoju edukaciju morali proći kroz klasične algoritme, ali to najčešće nije slučaj. Zašto? Ne znam, ima puno uzroka. Jedan je zasigurno nezainteresiranost za matematiku koja stoji iza toga, odnosno neopravdani strah. Drugi razlog mogao bi biti što se formalno u obrazovanju ne daje prevelika pažnja proučavaju klasičnih algoritama. Kasnije, ovo može prouzročiti puno problema, jer pisanje vlastitih ad-hoc algoritama gotovo uvijek rezultira puno gorim rješenjem od optimalnog. Puno ljudi neće se složiti da u biti tehnologija u kojoj se pišu programi nije važna. Naravno da programski jezik utječe na kvalitetu aplikacije, ali stvarna moć aplikacije je u kvalitetnoj izvedbi algoritma.

E sad smo se dotakli i implementacije algoritma. Veoma važno je pisati brze algoritme dobro. Da bi se algoritmi pisali dobro potrebno je dobro poznavati jezik u kojem se algoritam piše ili pisati u programskom jeziku koji jako dobro optimira kod. Danas visoki programski jezici jako dobro optimiraju kod, što zapravo programeru pruža da više vremena utroši na apstraktno rješavanje umjesto da ga troši na detalje koji na prvi pogled nisu bitni ali na kraju se uspostavi da su itekako bitni. 

Ovaj post je uvod u tutorial koji će biti dio bloga. Tutorial će biti uvod u algoritme i strukture podataka koje se mogu generički primijeniti na puno problema. Početi će od samih osnova i prikaza kako se na drugačiji način može vidjeti problem. Pokušat ću sve tutoriale prevesti na engleski jezik. Ako nekog zanima više od toga preporučujem knjigu Domagoja Kusalića: Napredno programiranje i algoritmi u C-u i C++-u. Za sve one koji konkretno žele rješavati probleme evo nekih dobrih stranica:

http://www.topcoder.com/
http://www.spoj.pl/
http://p4.tel.fer.hr/~agrbin/pimp/login
http://www.z-training.net/training.php

Naravno tu je i stranica HSIN-a s velikim skupom zadataka.

Najvažnija stvar kod bilo kakvog proučavanja (učenja) je pristup bez straha, uzeti si dovoljno vremena, volje i upornosti da se savladaju različiti problemi koji će se pojaviti.
May the Force be with you.

No comments:

Post a Comment