31.12.2014 Views

Seminarski rad: UĊenje algoritama u Pythonu - phy.hr - Prijava

Seminarski rad: UĊenje algoritama u Pythonu - phy.hr - Prijava

Seminarski rad: UĊenje algoritama u Pythonu - phy.hr - Prijava

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Seminarski</strong> <strong>rad</strong>:<br />

Učenje <strong>algoritama</strong> u<br />

<strong>Pythonu</strong><br />

Autor izvornog teksta koji sam koristio: Pai H.<br />

Chou (University of California, Irvine)<br />

U kojoj mjeri je Python pogodan za učenje iz<strong>rad</strong>e<br />

<strong>algoritama</strong><br />

Ž e l j k o Č e j v a n o v i ć<br />

P r o f . F i z i k e i T e h n i k e , F - 3 2 4 5<br />

3 . g o d .<br />

z e l j k o c e j @ g m a i l . c o m<br />

5 / 3 / 2 0 1 1


Sadržaj:<br />

0. Sažetak.......................................................................................2<br />

1. Uvod............................................................................................2<br />

2. Uvodna lekcija: Sortiranje............................................................3<br />

3. HeapSort (gomila) poredaj i prioritet redovi.................................4<br />

4. Binarna stabla i Hufmann kodiranje............................................5<br />

5. Grafikon Algoritmi........................................................................7<br />

6. Zaključak i zašto je Python pogodan za učenje iz<strong>rad</strong>e<br />

<strong>algoritama</strong>!.................................................................................9<br />

7. Literatura.....................................................................................9<br />

1


Sažetak<br />

Dizajn i analiza <strong>algoritama</strong> su temeljne teme u računalnoj znanosti i obrazovanju na<br />

tehničkim fakultetima. Mnogi tečajevi <strong>algoritama</strong> uključuju programske zadatke kako bi<br />

učenici bolje razumjeli algoritme. Nažalost, korištenje t<strong>rad</strong>icionalnih programskih jezika<br />

prisiljava studente da se bave detaljima strukture podataka i prateće rutine, a ne dizajnom<br />

<strong>algoritama</strong>. Python predstavlja algoritam-orijentirani jezik<br />

koji je jako potreban u<br />

obrazovanju. Prednosti Pythona su njegovi udžbenici poput sintakse i interaktivnost<br />

koja potiče eksperimentiranje. Još važnije, Python se može koristiti za<br />

zastupanje agregatne strukture podataka kao što su grafovi i mreže protoka u sažetom<br />

tekstualnom obliku, koji ne samo da potiče studente da eksperimentiraju s algoritmima,<br />

ali takoĎer dramatično smanjuje vrijeme razvoja. Ove značajke su provedene u studiju<br />

<strong>algoritama</strong> naravno s uspješnim rezultatima.<br />

1. Uvod<br />

Algoritmi su najvažniji alati za svakoga tko mora riješiti probleme pisanja računalnih<br />

programa. Algoritmi se koriste ne samo od strane računalnih znanstvenika i inženjera<br />

računala, nego i mnogi u drugim inženjerskim disciplinama i znanosti. Kao rezultat toga,<br />

studenti raznih smjerova koriste tečajeve <strong>algoritama</strong>.<br />

Iako je moguće proučavati algoritme samo čitajući knjige i gledajuće rješene primjere, učenici<br />

će ih najbolje shvatiti tako da sami provedu neki algoritam. Kao rezultat toga, to<br />

nije neuobičajeno za tečajeve <strong>algoritama</strong><br />

da uključuju programske<br />

zadatke. Udžbenici koji uključuju programiranje kao sastavni dio algoritma obrazovanja<br />

takoĎer su od autora tražili da zadovolji taj zahtjev [4]. Gotovo svi tečajevi i udžbenici su se<br />

do sada provodili u t<strong>rad</strong>icionalnim jezikom kao što su C ili C+ + i Java (nedavno je<br />

stekao popularnost) [5]. Argument za korištenje tih jezika je uglavnom praktična, jer su<br />

studenti vjerojatno već iskusni u tim jezicima i to im daje praktične vještine.<br />

1.1 Programiranje vs Algoritam Design (dizajn <strong>algoritama</strong>)<br />

Nažalost, iskustva su pokazala da programski zadaci u klasi algoritma ne moraju uvijek<br />

biti pedagoški korisni. Iako je većina <strong>algoritama</strong> od nekoliko redaka do pola<br />

stranice u udžbeniku, njihove implementacije često zahtijevaju stotine redaka u C-u<br />

ili Javi. Jedan od razloga je da ti jezici zahtijevaju deklaraciju globalnih varijabli,<br />

lokalne varijable i parametre prije nego što oni mogu koristiti. Drugi razlog, što je još<br />

važnije, je da su mnogi strukturama podataka kao što su popisi, povezane strukture<br />

podataka, kao i specijalizirana polja moraju biti projektirani i izvedeni za podršku<br />

<strong>algoritama</strong>, i složenost ovih vježbi brzo raste kad agregatne strukture podataka kao što<br />

su grafikoni ili protok mreža uključeni. U stvari, većina objektno orijentiranih programera će<br />

potrošiti većinu svojih napora u projektiranju klase i sučelja, i trošiti relativno<br />

malo vremena za punjenje u kodu za metode. Kao rezultat toga, ovi zadaci za<br />

programiranje će prisiliti studente da provedu mnogo vremena uz pitanja o<br />

programiranju, nego pitanjima za algoritme. Zbog ovoga bi mogli imati problema studenti koji<br />

nisu informatićkog smjera.<br />

2


Neki instruktori pokušavaju ublažiti ovaj teret dajući studentima knjižicu rutine za strukture<br />

podataka. MeĎutim, još<br />

uvijek<br />

postoje mnogi problemi koji su svojstveni ovim jezicima, uključujući ulaz/izlaz i ponovno. Npr.<br />

, biblioteka može pružiti API za izg<strong>rad</strong>nju stabla ili grafa zazivajući algoritam iz strukture<br />

podataka. Studenti moraju shvatiti njihov slučaj uzastopna poziva na dodavanje<br />

jednog čvora na vrijeme graf, ili pročitati opis grafikona iz datoteke. Bivši pristup može<br />

biti neugodan, jer izvorni kod ne sliči strukturi podataka, ali smisao je vezan za API.<br />

Potonji pristup, koji koristi prilagoĎeni jezik za zastupanje graf, može biti više koncizan,ali to<br />

zahtijeva vježbanje rutine, što može smanjiti ponovnu uporabu i proširivost. Znaći, kada<br />

shvatimo graf, možemo mijenjati neke postavke kako bi ga promijenili.<br />

1.2 Python Edge (rub)<br />

Python adrese tih problema i čini uvjerljiv jezik za algoritme obrazovanje. Prvo, njegove<br />

uvlake-based sintaksa je toliko slična većini udžbenika da čak i studenti, bez puno<br />

programiranja nemaju problema kodiranja <strong>algoritama</strong> samo slijedeći<br />

knjigu. Zbog<br />

toga, popularnost s drugim jezicima je dvojbena, osobito s obzirom na činjenicu da<br />

njegov interaktivni način potiče studente da eksperimentiraju s njim bez dugog<br />

ciklusa. Drugo, Python pruža temeljne strukture podataka kao što su popisi, torke, rječnici i<br />

može se koristiti izravno algoritmima. Čak je i složenija struktura podataka kao što<br />

su drveće i grafikoni sažeti u čitljivom obliku.<br />

Postoji nekoliko prednosti: test slučajeva za algoritme mogu biti<br />

napisani<br />

direktno u <strong>Pythonu</strong> bez poziva svih podataka, strukturu izg<strong>rad</strong>nje API, i bez da se oslanjaju<br />

na bilo koji konvertor. U bilo kojem trenutku, podatkovne strukture mogu se takoĎer<br />

prikazati u tekstualnom obliku koji je čitljiv za ljude i za Python.<br />

2. Uvodna Lekcija: Sortiranje<br />

Većina udžbenika poćinje sa sortiranjem kao način da uvedu algoritme i složene analize.<br />

Naša strategija je da prikažemo algoritme rame uz rame s Python kodom kako bi pokazali<br />

njihovu sličnost. Mi smo započeli s InsertionSort, koja kao rezultat prikazuje niz s desna na<br />

lijevo:<br />

Algoritam iz udžbenika [1]<br />

Insertion-Sort(A) (umetanje-poredaj)<br />

1 for j


Python kod<br />

def InsertionSort(A):<br />

for j in range(1, len(A)):<br />

key = A[j]<br />

i = j - 1<br />

while (i >=0) and (A[i] > key):<br />

A[i+1] = A[i]<br />

i = i - 1<br />

A[i+1] = key<br />

Kada učenici vide sličnost, većina njihovog straha prema programiranju jednostavno nestaje.<br />

Ona takoĎer pomaže da pokažu interaktivne prirode Python. Mi koristimo računalo-projektor i<br />

zapravo tip u programu, što je samo 8 linija dugo. Najbolji<br />

dio je, možemo<br />

testirati algoritam jednostavno, upišete u slučaju teksta u obliku popisa:<br />

>>> x = [2,7,3,8,1] # create test case (stvoriti test slučaj)<br />

>>> InsertionSort(x) # call routine (poziva rutinu)<br />

>>> x # look at result (pogled na rezultat)<br />

[1, 2, 3, 7, 8]<br />

U smislu, Python daje udžbenik važnosti jer algoritmi predstavljaju<br />

u<br />

udžbeniku nisu višesamo pseudocode ili koraka teorijskih interesa samo, mogu vidjeti kako<br />

se lako ga jezapravo izvršiti algoritme koristeći podatke koje oni generiraju. U stvari, mi takoĎ<br />

erpokazuju da je isti broj, bez izmjena, <strong>rad</strong>i sasvim u redu s drugim tipovima<br />

podataka,uključujući i žice, torke, itd. Sortiranje je dobra polazna primjer, jer ne samo<br />

dakonstruira karte izravno, bez komplikacija sa memory management (biti riječi<br />

kasnije),ali parametar semantika takoĎer odgovara: duži donosi vrijednosti, dok su polja don<br />

osireferencu.<br />

3. HeapSort (gomila) poredaj i prioritet redovi<br />

Naš uvod nastavlja s HeapSort poredajem i prioritet redovima. Heap je struktura<br />

podataka koja predstavlja gotovo uravnoteženo binarno stablo koristeći niz A[1 .. n], gdje se<br />

lijevo i desno nalazi<br />

dječji element A[i] smješten na A[2i], A[2i+1], odnosno, i A[i]> = A[2i], A[2i+1]. HeapSort g<strong>rad</strong>i<br />

sortirani niz redova iz stražnjeg dijela polja prema naprijed jedan element u vrijeme<br />

vaĎenja najvećeg elementa iz skupine. U početku sortirani dio je prazan, i poziv na<br />

BuildHeap pretvara A[1 .. n] u skupini. Budući da iz skupine stavlja najveći element u A[1],<br />

u prvoj iteraciji smo ga izvaditi i staviti ga u A[n], koji je njegov ispravan sortirani položaj.<br />

Sljedeća iteracija ekstrakti drugi najveći element (iz A[1] opet) i stavlja ga u A[n-1], i sl., a to<br />

se nastavlja sve dok se sve ne sortira. Imajte na umu da se Heapify zove kao dio<br />

svakog koraka ekstrakcije. To je zato što ako mi razmijenimo A[1] i A[h], a zatim A[1 .. h-<br />

1] više ne zadovoljava <strong>hr</strong>pu nekretnina, ali budući da je još uvijek "skoro" <strong>hr</strong>pa -<br />

to jest, sve osim korijena položaj je još uvijek ispod gomile - to<br />

4


može biti fiksno učinkovito u O(lg h) vrijeme pozivom Heapify bez mogućnosti obnavljanja u<br />

gomili O(h) na vrijeme.<br />

Jedna od razlika je da algoritam u udžbeniku poprima 1-na<br />

temelju niza pokazatelja,dok Python pretpostavlja 0-temeljen polja. Python kod je:<br />

def Parent(i): return i/2<br />

def Left(i): return 2*i<br />

def Right(i): return 2*i+1<br />

def Heapify(A, i, n): # A is "almost a heap" (except root); fix it so all of A is a heap<br />

l = Left(i)<br />

r = Right(i)<br />

if l A[i]: largest = l<br />

else: largest = i<br />

if r A[largest]:<br />

largest = r<br />

if largest != i:<br />

A[i], A[largest] = A[largest], A[i]<br />

Heapify(A, largest, n)<br />

def HeapLength(A): return len(A)-1<br />

def BuildHeap(A): # build a heap A from an unsorted array<br />

n = HeapLength(A)<br />

for i in range(n/2,0,-1):<br />

Heapify(A,i,n)<br />

def HeapSort(A): # use a heap to build sorted array from the end<br />

BuildHeap(A)<br />

HeapSize=HeapLength(A)<br />

for i in range(HeapSize,1,-1):<br />

A[1],A[i]=A[i],A[1] # largest element is a root of heap, put it at the end of array<br />

HeapSize=HeapSize-1 # s<strong>hr</strong>ink heap size by 1 to get next largest element<br />

Heapify(A,1,HeapSize)<br />

Gomila i prioritet redovi su usko povezani, jer gomila može implementirati prioritetne redove<br />

učinkovito sa O(lg n)-vrijeme umetanja i vaĎenja. Jedna od razlika je, meĎutim,<br />

dinamička memorija upravljanja: u gomilu vrsta, veličina polja ostaje ista, dok u prioritet<br />

redovima veličina reda raste i smanjuje. Koristimo ovu priliku da se uvedu dvije konstrukti.<br />

Prvo, mi pokazuju da A.append () i A.pop () može se koristiti za rast i smanjiti liste A, dok<br />

su len (A) vraća trenutnu duljinu popisa. Drugo, u slučaju ispod granice (i prelijevanje po<br />

želji), pokazuju studentima kako podići i uhvatiti izuzetak. Ovi konstrukti ne mogu biti<br />

jedinstveni za Python, no Python olakšava eksperiment.<br />

4. Binarna stabla i Huffman kodiranje<br />

Huffman algoritam proizvodi prefiks-free, promjenjive duljine kodne riječi na<br />

temelju frekvencije svakog lika. Često se koriste slova kodirana pomoću kraćeg niza<br />

bitova, a manje često korištenih pomoću dužeg niza<br />

5


itova. Pohlepni algoritam koristi prioritet red za izdvajanje dva čvora (list ili interni), s<br />

najnižim frekvencijama, dodjeljuje novi čvor čija težina je zbroj dva, i umeće novi čvor<br />

natrag u red prioriteta. Algoritam završava kad prioritet red uklanja zadnji čvor, koji<br />

postaje korijen stabla Huffman. Niz bitova za svako slovo može biti proizveden od<br />

strane poprijeko Huffman binarno stablo, gdje je uzimanje lijevoga kraka rezultat u '0',i desna<br />

grana rezultat u '1'.<br />

Na primjer, pretpostavimo da je naš ulaz skup znakova s pripadajućim frekvencija:<br />

'a': 45%<br />

'b': 13%<br />

'c': 12%<br />

'd': 16%<br />

'e': 9%<br />

'f': 5%<br />

Huffman algoritam konstruira stablo usporeĎujući dva elementa s najmanje<br />

frekvencije, stvara novi unutarnji čvor čija je frekvencija jednaka njihovom<br />

zbroju, u red prioriteta. Rezultat je stablo (sl. 1) koje definira promjenljive duljine koda<br />

za svaki znak. Lijevo grane su označene 0, a desno grane su označeni 1, a Huffman kod<br />

za znak se jednostavno niz stazu natpiše iz korijena do listova. Npr., kodiranje:<br />

'a': 0<br />

'b': 1 0 0<br />

'c': 1 0 1<br />

'd': 1 1 0<br />

'e': 1 1 1 0<br />

'f': 1 1 1 1<br />

Slika 1 Primjer Huffman stabla<br />

Budući da smo već prioritet red, ono što nam nedostaje je specijalizirano binarno<br />

stablo. Zahtjevi su:<br />

čvor nultog stupnja mora biti u stanju da predstavlja pismo, bude kodirana, a njegova<br />

učestalost.<br />

unutarnji čvor mora imati dvoje djece, i ona takoĎer mora imati težinu koja je jednaka<br />

zbroju za svoju djecu.<br />

red prvenstva mora biti u stanju „enqueue“ i „dequeue“ i lišće i unutarnje čvorove i<br />

usporediti ih na temelju težine<br />

6


Ako smo za provedbu ovog s t<strong>rad</strong>icionalnim jezikom kao što je C ili Java, trebali bismo<br />

naučiti kako definirati strukturu ili klasu s nazivom polja težina; list čvorova,<br />

potrebno karakter polje, dok unutarnji čvorovi zahtijevaju leftchild i rightchild polja. Budući da<br />

je prioritet red, mora biti u mogućnosti da ih usporedi, to će biti potrebno<br />

modificirati prioritet reda i pozvati odgovarajuću metodu usporedbe umjesto koristeći<br />

izgraĎen-u odnosu na operatora, i oba lišća i unutarnji čvorovi moraju biti ili u istoj klasi<br />

ili biti podrazred u istoj bazi klase koja implementira usporedna metoda.<br />

MeĎutim, ni postojeće ispravljanje pogrešaka nema znanja da može automatski ispisati<br />

čvorove zajedno kao stablo, i stoga je rutina pisati naredbu print, što zapravo može biti<br />

prilično lukav i biti još jedan veliki izvor bugova.<br />

Python implementacija može biti učinjeno elegantno, bez potrebe za pisanjem dodatne<br />

rutine ili definiranje nove klase ili strukture za stabla čvorova. Predstavljaje binarnih stabla u<br />

<strong>Pythonu</strong>, u duhu sličan Lisp:<br />

Leaf čvorovi su zastupljeni kao (frekvencija, karakter) torke:<br />

[(45, 'a'), (13, 'b'), (12, 'c'), (16, 'd'), (9, 'e'), (5,<br />

'f')].<br />

Unutarnji čvorovi su zastupljeni kao u nalog 3 torke: (frekvencija, lijevo, desno): Na<br />

primjer, u donjem desnom podstablu na slici 1 može se prikazati kao<br />

(14, (5, 'f'), (9, 'e'))<br />

koja predstavlja unutarnji čvor čija težina je 14%, čija je lijevo dijete (5, 'F'), te čije je<br />

pravo dijete (9, 'e').<br />

Stablo je konstruirano funkcionalno s torka stvaranje, bez potrebe da se koristi bilo koji<br />

čvor stabla strukture podataka, i nema potrebe da manipuliraju lijevo/desno. Štoviše, to<br />

je lako koristiti s postojećim prioritetnim redom strukture podataka, bez izmjena! To je zato<br />

što se<br />

torke može usporediti na leksikografski poredak koristeći istu<br />

usporedbu operatora. Na taj način, unutarnji čvorovi i lišće može biti u odnosu, iako<br />

oni kodiraju različite informacije. Razlika izmeĎu njih je da je len () = 2 za leaf (list), i = 3 za<br />

unutarnji čvor.<br />

5. Grafikon Algoritmi<br />

Graf ima više prikaza, a većina <strong>algoritama</strong> može pretpostaviti ili susjedstva liste ili matrice<br />

susjedstva<br />

reprezentacije.<br />

Za provedbu graf u t<strong>rad</strong>icionalnom sustavu programskog jezika kao što su C ili Java, prvo bi<br />

morao definirati strukture podataka za vrhove, za rubove, a za graf, koji služi kao front-end<br />

za stvaranje i brisanje svoje vrhove i rubove. Dizajn takvih podataka struktura lako može<br />

dominirati kodiranje vrijeme i nije lako za višekratnu upotrebu, uglavnom zato što ti tipovi<br />

podataka moraju biti projektirani kao „kontejneri“. Iako paketi poput LEDA [3] kako bi se<br />

poboljšao pokušaj ponovne upotrebe objektno orijentiranog izvorni kod u C++ predloške, oni<br />

i dalje zahtijevaju da učenici usvoje cijeli paket prije nego što mogu početi <strong>rad</strong>iti nešto<br />

korisno. Kontejneri su često dizajnirani za zaobilaženje problema s jakim, statički tipkanje, ali<br />

to zahtijeva reimplementaciju dinamičkog tipa provjere u kraj-korisnik kod. Čak i gori<br />

nedostatak da je uporaba C-pokazivača ili Java-reference čini neugodan da biste vidjeli ove<br />

predmete. Iako „debugger“ može prikazati te objekte u nekom tekstualnom obliku, to<br />

prikazuje previše informacija ili nije izravno od koristi u programu.<br />

Python nudi mnoge prednosti kao što je naglašeno od strane strukture grafa podataka. Mi<br />

7


koristimo vrlo kompaktan, rječnik-of-rječnika (DD) provedbu zastupljenosti susjedstvo popis<br />

grafa. Uglavnom graf je prikazan kao Python rječnik, čije su tipke niz imena vrhova, a svaki<br />

vertex ime preslikanog na svoje susjedstvo popis. Npr., graf prikazan na slici. 2:<br />

Sl.2: Primjer usmjereni graf<br />

To može biti zastupljena sa sljedećim Python kodom:<br />

H = {'A': ['C', 'D'], 'B': ['D', 'A'], 'C': ['D', 'E'],<br />

'D': ['E'], 'E': [] }<br />

Gore predstavlja jednostavan, usmjereni, neponderirani graf. Ako ponderirani graf<br />

kao što sl. 3 prikazuje, onda možemo jednostavno zamijeniti liste susjedstva vrha s<br />

rječnicima koji su na karti susjedna vrha njihove težine:<br />

Sl. 3: Primjer grafa ponderirane (težine)<br />

L = {'A': {'C':2, 'D':6}, 'B': {'D':8, 'A':3},<br />

'C': {'D':7, 'E':5}, 'D': {'E':-2}, 'E': {}}<br />

Popis vrhova V je jednostavno H.keys () ili L.keys (). Susjedstvo popis H [v] zaneponderirani<br />

m grafikone, i L [v]. tipke () za ponderirani grafova. Težina ruba mase w(u, v) je L[u] [v]. Da bi<br />

se olakšalo programiranje, možemo završiti pojedinosti provedbe unutar objekta.<br />

Grafikon klase:<br />

def __init__(self, g):<br />

self.g = g<br />

def V(self):<br />

return self.g.keys()<br />

def Adj(self,v):<br />

return self.g[v].keys()<br />

def w(self,u,v):<br />

return self.g[u][v]<br />

Možemo stvoriti grafikon objekt sa G = Graf (L). Prednosti s tim pristupom uključuju<br />

kompaktni tekstualni oblik i proširivost. Prvo, stvarno ne postoje strukture podataka<br />

za projektiranje. Tekstualni prikaz grafa je Python izvršna. Student može upisati u ovoj<br />

strukturi interaktivno ili u tekstualnoj datoteci bez korištenja posebnih graf-urednika. Struktura<br />

8


podataka se može ispitati samo tako da upišete svoje ime. To onda može biti<br />

cut/lijepiti na drugi prozor Python tumača ili na drugi Python program, bez ikakvih sintaktičkih<br />

izmjena.<br />

Još važnije, ovaj prikaz je iznimno proširiv. Različiti algoritmi koriste dodatne atribute, ali se<br />

mogu dodati prema potrebi. Npr., jedan izvor, najkraći put <strong>algoritama</strong> ili breadth-first/depthfirst<br />

traversals zahtijevaju dodatne atribute, kao što prethodnik<br />

upućuje. U Python, algoritam jednostavno mogu dodati atribut prethodnik graf-objekt (kao<br />

što G.pred [v]), bez potrebe za definiranje podrazred za svaki algoritam. Ove novo<br />

dodano, atributi takoĎer mogu biti pregledani i izravno mijenjati bez potrebe nove rutine.<br />

6. Zaključak i zašto je Python pogodan za učenje iz<strong>rad</strong>e<br />

<strong>algoritama</strong>!<br />

Kao algoritam orijentirani jezik, Python omogućava učenje ključnih koncepata u dizajnu<br />

<strong>algoritama</strong>, umjesto da se bori s nama sa osebujnim obilježjima koje imaju konvencionalni<br />

programski jezici. Python način obraĎuje vrste podataka, predstavlja savršeno<br />

odgovarajućim načinom na koji potiče da sa sami zainteresiramo za njega i onda<br />

eksperimentiramo. Jednako je važno naše korištenje struktura podataka za drveće i grafove,<br />

koji su kao kompaktna što je više moguće i još ljudskih čitljiv i spremno prihvatio Python<br />

prevodioca.<br />

Sve u svemu, mislim da je Python jako dobar program za iz<strong>rad</strong>u <strong>algoritama</strong>, budući da nas<br />

on dosta često uči vještine rješavanja problema, a ne samo programiranje, kao što su<br />

dodatni moduli koje možemo koristiti bilo u matematici ili u fizici, crtanje svakakvih grafova i<br />

krivulja i puno toga.<br />

7. Literatura<br />

1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to<br />

Algorithms, Second Edition, McGraw-Hill Press, September 2001. ISBN 0-262-03293-7.<br />

2. Pai H. Chou, ECE 235 Website, University of California, Irvine, Fall<br />

2000. http://e3.uci.edu/00f/15545/ See also Fall 2001 edition at http://e3.uci.edu/01f/15545/.<br />

3. Algorithmic Solutions Software GmbH, homepage, http://www.algorithmic-solutions.com/,<br />

2001.<br />

4. Sara Baase, Allen Van Gelder, Computer Algorithms: Introduction to Design and Analysis,<br />

Addison Wesley, 2000.<br />

5. Mark Allen Weiss, Data Structures and Algorithm Analysis in JAVA, Addison-Wesley, 1999.<br />

6. Algorithm Education in Python: http://www.ece.uci.edu/~chou/py02/python.html<br />

7. 20.2.5. Funkcije:<br />

http://docs.python.org/release/2.6.6/library/cgi.htmlhighlight=making%20algorithms<br />

8. The Python Profilers:<br />

http://docs.python.org/release/2.6.6/library/profile.htmlhighlight=making%20algorithms<br />

9. bisect — Array bisection algorithm:<br />

http://docs.python.org/release/2.6.6/library/bisect.htmlhighlight=making%20algorithms<br />

10. decimalni - Decimalni fiksne točke i s pomičnim zarezom aritmetika:<br />

http://docs.python.org/release/2.6.6/library/decimal.htmlhighlight=making%20algorithms<br />

9

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!