UNIVERZITET FAKULTET INFORMACIONIH TEHNOLOGIJA

Similar documents
SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan.

Struktura indeksa: B-stablo. ls/swd/btree/btree.html

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri.

Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije

Podešavanje za eduroam ios

GUI Layout Manager-i. Bojan Tomić Branislav Vidojević

Uvod u relacione baze podataka

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB.

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd,

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings

Advertising on the Web

1.7 Predstavljanje negativnih brojeva u binarnom sistemu

STRUČNA PRAKSA B-PRO TEMA 13

Otpremanje video snimka na YouTube

POSEBNA POGLAVLJA INDUSTRIJSKOG TRANSPORTA I SKLADIŠNIH SISTEMA

Programiranje. Nastava: prof.dr.sc. Dražena Gašpar. Datum:

Nejednakosti s faktorijelima

STABLA ODLUČIVANJA. Jelena Jovanovic. Web:

OBJEKTNO ORIJENTISANO PROGRAMIRANJE

Port Community System

SAS On Demand. Video: Upute za registraciju:

Programiranje III razred

Priprema podataka. NIKOLA MILIKIĆ URL:

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA

IZRADA TEHNIČKE DOKUMENTACIJE

Klasterizacija. NIKOLA MILIKIĆ URL:

POSTUPAK IZRADE DIPLOMSKOG RADA NA OSNOVNIM AKADEMSKIM STUDIJAMA FAKULTETA ZA MENADŽMENT U ZAJEČARU

ENR 1.4 OPIS I KLASIFIKACIJA VAZDUŠNOG PROSTORA U KOME SE PRUŽAJU ATS USLUGE ENR 1.4 ATS AIRSPACE CLASSIFICATION AND DESCRIPTION

BENCHMARKING HOSTELA

PROGRAMSKI JEZIK VISUAL BASIC ZBIRKA ZADATAKA

MRS. MRSLab03 Metodologija Razvoja Softvera Vežba 03 LAB Dijagram aktivnosti

Rešavanje problema pomoću računara

PROJEKTNI PRORAČUN 1

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY

INTEGRISANO RAZVOJNO OKRUŽENJE VISUAL STUDIO 2013

Korak X1 X2 X3 F O U R T W START {0,1}

UNIVERZITET U BEOGRADU RUDARSKO GEOLOŠKI FAKULTET DEPARTMAN ZA HIDROGEOLOGIJU ZBORNIK RADOVA. ZLATIBOR maj godine

DEFINISANJE TURISTIČKE TRAŽNJE

Tema 11 Analiza algoritama, pretraživanje i sortiranjeu jeziku Python

1. MODEL (Ulaz / Zadržavanje / Stanje)

Univerzitet u Novom Sadu. Fakultet tehničkih nauka. Odsek za računarsku tehniku i računarske komunikacije. Uvod u GIT

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a

VBA moduli. mr Milovan Milivojević dipl. ing. Visa Poslovno Tehnička Škola - Užice

Direktan link ka kursu:

Tutorijal za Štefice za upload slika na forum.

Sl.1.Razvojna ploča-interfejs

KAKO GA TVORIMO? Tvorimo ga tako, da glagol postavimo v preteklik (past simple): 1. GLAGOL BITI - WAS / WERE TRDILNA OBLIKA:

Mogudnosti za prilagođavanje

TEHNIKA I INFORMATIKA U OBRAZOVANJU

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU


Tema 2: Uvod u sisteme za podršku odlučivanju (VEŽBE)

Upute za korištenje makronaredbi gml2dwg i gml2dgn

Windows Easy Transfer

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ

Implementacija sparsnih matrica upotrebom listi u programskom jeziku C

TEHNOLOGIJA, INFORMATIKA I OBRAZOVANJE ZA DRUŠTVO UČENJA I ZNANJA 6. Međunarodni Simpozijum, Tehnički fakultet Čačak, 3 5. jun 2011.

Materijal za prijemni ispit na Doktorske studije iz informatike

Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll)

2. poglavlje - IDENTIFIKACIJA POTROŠAČA - od 62 do 80 strane (19 strana)

Bušilice nove generacije. ImpactDrill

СТРУКТУРА СТАНДАРДА СИСТЕМАМЕНАЏМЕНТАКВАЛИТЕТОМ

Projektovanje softvera. Dijagrami slučajeva korišćenja

Struktura i organizacija baza podataka

Babylon - instalacija,aktivacija i rad sa njim

Sa druge strane neproto~no organizovan sistem ~ije je vreme ciklusa 25 ns ima}e propusnost od

Automatske Maske za zavarivanje. Stella, black carbon. chain and skull. clown. blue carbon

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020.

WELLNESS & SPA YOUR SERENITY IS OUR PRIORITY. VAŠ MIR JE NAŠ PRIORITET!

Ciljevi. Poslije kompletiranja ove lekcije trebalo bi se moći:

PLAN RADA. 1. Počnimo sa primerom! 2. Kako i zašto? 3. Pejzaž višestruke upotrebe softvera 4. Frameworks 5. Proizvodne linije softvera 6.

1. Instalacija programske podrške

H Marie Skłodowska-Curie Actions (MSCA)

Osnovi računarstva II. Uvodne napomene Tipovi podataka i operacije Osnovni algoritamski koraci

MODEL OBJEKTI - VEZE KONCEPTI MODELA METODOLOGIJA MODELIRANJA

Mašinsko učenje Uvod. Bojan Furlan УНИВЕРЗИТЕТ У БЕОГРАДУ ЕЛЕКТРОТЕХНИЧКИ ФАКУЛТЕТ

3.2. Prikazati podatke o svim proizvodima, koji se proizvode u Zrenjaninu.

RANI BOOKING TURSKA LJETO 2017

PROBLEM ODREĐIVANJE MAKSIMALNOG TOKA U GRAFU FORD FULKERSON ALGORITAM MAKSIMALNOG PROTOKA (FFF ALGORITAM)

LabVIEW-ZADACI. 1. Napisati program u LabVIEW-u koji računa zbir dva broja.

Dr Smiljan Vukanović, dis

SKINUTO SA SAJTA Besplatan download radova

RJEŠAVANJE BUGARSKOG SOLITERA

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE

FAKULTET TEHNIČKIH NAUKA

Pravljenje Screenshota. 1. Korak

TEHNO SISTEM d.o.o. PRODUCT CATALOGUE KATALOG PROIZVODA TOPLOSKUPLJAJUĆI KABLOVSKI PRIBOR HEAT-SHRINKABLE CABLE ACCESSORIES

CRNA GORA

KONKURSA ZA UPIS STUDENATA U ŠKOLSKU 2015/16 GODINU

MRS MRSLab09 Metodologija Razvoja Softvera Vežba 09

MRS MRSLab08 Metodologija Razvoja Softvera Vežba 08

Naredba je uputa računalu za obavljanje određene operacije.

PROGRAMIRANJE I ALGORITMI

Dr.Miroljub Banković, prof. Kragujevac, 2008.

FAKULTET POLITIČKIH NAUKA BEOGRAD. Doc. Dr Miloš Bešić METODOLOGIJA POLITIČKIH NAUKA SA STATISTIKOM

- Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS

PROJEKTOVANJE SOFTVERA Softver može biti sistemski i aplikativni. U sistemski softver spadaju operativni sistemi i razni uslužni programi. kao na prim

JavaScript podrska u radu sa greskama

Transcription:

UNIVERZITET FAKULTET INFORMACIONIH TEHNOLOGIJA #include <stdio.h> #include <stdlib.h> void procarrays(const int* a,const in int j; double s; for(j=0;j<n;j++) c[j]= a[j]+b[j]; for(s=0,j=0;j<n;j++) s*= c[j]*a[2*j+ NOVI SAD - SREMSKA KAMENICA 2015.

Dr Dušan T. Malbaški ALGORITMI I STRUKTURE PODATAKA Recenzenti Dr Miroslav Hajduković, red. prof., Fakultet tehničkih nauka, Novi Sad Dr Aleksandar Kupusinac, docent, Fakultet tehničkih nauka, Novi Sad Izdavač Univerzitet Educons Fakultet informacionih tehnologija Vojvode Putnika 87, Sremska Kamenica Za izdavača Prof. dr Aleksandar Andrejević CIP - Каталогизација у публикацији Библиотека Матице српске, Нови Сад 004.421(075.8) 004.422.6(075.8) МАЛБАШКИ, Душан Algoritmi i strukture podataka [Elektronski izvor] / Dušan T. Malbaški. - Sremska Kamenica : Univerzitet Educons, Fakultet informacionih tehnologija, 2015. - 1 elektronski optički disk (CD-ROM) : tekst, slika ; 12 cm Bibliografija. ISBN 978-86-87785-61-8 a) Алгоритми b) Структуре података COBISS.SR-ID 295004167

PREDGOVOR Računar, kao sistem, funkcioniše tako što izvršava programe, odnosno radi šta mu se kaže. Program, pak, kao što piše u naslovu čuvene knjige Niklausa Virta ima samo dve komponente: algoritam i strukturu podataka. U zavisnosti od programske paradigme, algoritam i struktura podataka mogu biti jasno razgraničeni, ali se mogu i prožimati. Svejedno, uvek su tu. Kao što se ne može zamisliti fizičar koji ne zna Njutnove zakone, tako se podrazumeva da svako ko želi da bude informatičar mora da raspolaže iscrpnim poznavanjem fundamenta - algoritama i struktura podataka. Ovaj udžbenik namenjen je prvenstveno studentima Fakulteta informacionih tehnologija Univerziteta EDUCONS, kao literatura za istoimeni predmet. Namenjen je i svakom drugom ko želi da stekne, odnosno, proširi znanje iz ovih oblasti. Knjiga se sastoji iz dva dela. U prvom se razmatraju osnovi teorije i analize algoritama, dok se drugi bavi osnovnim strukturama podataka. Deo o algoritmima oslanja se na literaturnu jedinicu 17 (deo koji je pisao autor) uz dopune i izmene. Kompletan materijal zasnovan je na korišćenju programskog jezika C, čije poznavanje predstavlja preduslov za razumevanje izloženog. U Novom Sadu, januara 2015. Autor

SADRŽAJ Predgovor... 3 Sadržaj... 4 DEO I: OSNOVI TEORIJE I ANALIZE ALGORITAMA 1. Uvod... 8 1.1 Empirijska definicija algoritma... 8 1.2 Sintetička definicija algoritma...11 2. Algoritamski sistemi...15 2.1. Tjuringove mašine...15 2.2. Normalni algoritmi Markova...23 3. Analiza algoritamskih struktura...28 3.1. Graf toka programa...30 3.2. Strukturna teorema...34 3.2.1. Strukturna teorema i algoritamski sistemi...38 3.3. Metoda sukcesivne dekompozicije...38 3.4. Složenost (kompleksnost) algoritama...41 DEO II: STRUKTURE PODATAKA 1 Osnovni pojmovi...49 1.1. Definicija strukture podataka...55 1.2. Operacije nad strukturama podataka...57 1.3 Klasifikacija struktura podataka...60 2. Niz...65 2.1. Fizička realizacija niza...67 2.1.1. Fizička realizacija statičkog niza...67 2.1.2. Metoda linearizacije...68 2.1.3. Fizička realizacija dinamičkog niza...69 2.2.Sortiranje niza...71 2.2.1. Metoda izbora (Selection Sort)...72 2.2.2. Metoda izmene (Standard Exchange Sort, Bubble Sort)...73 2.2.3. Metoda umetanja (Insertion Sort)...75 2.2.4. Quicksort...77

2.3. Redosledna obrada niza...81 3. Slog i tabela...82 3.1. Slog...82 3.2 Tabela...85 3.2.1. Linearno traženje...86 3.2.2. Binarno traženje...87 3.2.3. Redosledna obrada tabele...91 3.3. Rasuta ili heš tabela...91 3.3.1. Fizička realizacija heš tabele...92 3.3.2. Kolizija ključeva i rukovanje sinonimima...94 3.3.3. Analiza otvorenog adresiranja...102 3.3.4. Analiza lančanja...103 4. Poludinamičke strukture...104 4.1. Stek...104 4.1.1. Fizička realizacija steka...107 4.1.2. Prevođenje izraza...110 4.1.3. Programski stek...114 4.1.4. Rekurzija...117 4.2. Red...124 4.2.1. Sekvencijalna realizacija reda...127 4.2.2. Spregnuta realizacija reda...130 4.2.3. Red sa prioritetima...135 4.2.4. Ukratko o primenama reda...137 4.3. Dek...137 4.4. Sekvenca...139 4.4.1. Fizička realizacija sekvence...140 4.4.2. Sortiranje datoteke...142 5. Liste...148 5.1. Jednostruko spregnuta lista...148 5.1.1. Jednostavna lista...150 5.1.2. Jednostruko spregnuta lista sa ključevima...156 5.1.3. Sortiranje jednostruko spregnute liste...160 5.2.Dvostruko spregnuta lista...161 5.2.1. Dvostruko spregnuta lista sa navigacijom...163

5.2.2. Obrada dvostruko spregnute liste...173 5.2.3. Demonstracioni program...174 5.3. Multilista...179 6. Stablo...182 6.1. Orijentisano stablo...182 6.2. Stablo kao struktura podataka...185 6.3. N-arno stablo...187 6.3.1. Fizička realizacija n-arnog stabla...189 6.3.2. Binarno stablo...191 6.3.3. Binarno stablo pristupa...201 6.3.4. Balansiranje binarnog stabla...212 6.3.5. AVL stablo...216 6.3.6. Stohastičko stablo...225 6.4. Uopšteno (generalisano) stablo...234 6.4.1. Fizička realizacija uopštenog stabla...236 Literatura...238

Dušan Malbaški - Algoritmi i strukture podataka 7

1. UVOD Definisati pojmove nikad nije lako. Što je pojam bliži fundamentalnom, definisati ga sve je teže i teže. Šta je skup? A broj? Tačka? Lepota? Pravda? O definiciji vremena, sv. Avgustin, hrišćanski teolog i filozof, piše: "Si nemo ex me quaerat, scio; si quaerenti explicare velim, nescio". (Ako me niko ne pita, znam; ako hoću da objasnim nekom ko pita - ne znam). Jedan od najosnovnijih pojmova u računarstvu jeste pojam algoritma, do te mere fundamentalan da bi, možda, najbolji odgovor na pitanje "šta je to?" bio "zna se!". Zato ne treba da čudi to što neki veoma istaknuti teoretičari, kao što je Uspenski, smatraju da algoritme ni ne treba definisati dovođenjem u vezu sa drugim jezičkim simbolima, nego ih valja smatrati polaznim 1, i da je svaki takav pokušaj definisanja, u stvari, samo opisivanje. Drugi pak stoje na stanovištu da algoritam ipak treba definisati, ali samo u logičkom, a ne u formalno-matematičkom smislu. U svakom slučaju, sam pojam algoritma je toliko bazičan da stoji tvrdnja da je "najveće otkriće u oblasti nauke o algoritmima otkriće samog algoritma". 1.1 EMPIRIJSKA DEFINICIJA ALGORITMA Bez pretenzija na arbitriranje, navodimo detaljnije drugi prilaz - prosto zato što prvi (po Uspenskom) i ne zahteva nikakva dodatna objašnjenja. Osnovni problem sa kojim se susrećemo prilikom pokušaja da se formuliše definicija algoritma je opredeljivanje za neki od filozofskih pristupa definiciji uopšte. Imajući u vidu pomenutu "opštepoznatost", od prilaza ponuđenih u 14 biramo, za početak, tzv. empirijski (naziva se i leksičkim), koji podrazumeva prikupljanje činjenica i stavova o definiendumu (pojmu koji se definiše), njihovo klasifikovanje, formulisanje funkcionalnih osobina i konačno, uopštavanje sa ciljem da se definicijom obuhvate sve osobine uočenih grupa (klasa). Interesantno, već sam termin "algoritam" dugo je predstavljao enigmu. Knut (D.Knuth, 15 ) navodi da se u Webster-ovom rečniku ova reč po prvi put pojavila tek 1957. godine. Do tada važio je stari izraz "algorisam (algorism)" koji se odnosio na izvođenje aritmetičkih operacija nad arapskim brojevima, što potiče iz srednjeg veka kada su se razlikovali abacisti koji su za dotične operacije koristili abakus i 1 u opštoj logici takvi pojmovi nose naziv kategorije 8

algoritmisti koji nisu koristili posebna pomagala. Posle dosta lutanja (detalji se mogu naći u 15 i drugde) istoričari matematike su konačno otkrili da je reč o imenu arapskog matematičara iz IX veka - jednog od najvećih matematičara svih vremena! - Abu Ja'far Mohammed ibn Musa al-khowarizmi - ja (u prevodu Džafarov otac, Mohamed, sin Musin, iz Horezma 2 ). Transkripcija dela imena al-khowarizmi (čita se "Alhorezmi"), u "algoritam" nameće se sama. Navedimo nekoliko primera algoritama: A1. Razvući šestar na dužinu zadate duži. Iz jedne krajnje tačke duži opisati luk. Ponoviti isto za drugu krajnju tačku, tako da se lukovi seku. Spojiti lenjirom krajnje tačke duži sa presečnom tačkom lukova. A2. Sabrati x i y. Zbir podeliti sa z. A3. (Određivanje S = a 1 +... +a n ) 1. Postaviti vrednost S na nulu i preći na sledeći korak. 2. Postaviti vrednost i na 1 i preći na sledeći korak. 3. Dodati a i na tekuću vrednost S i preći na sledeći korak. 4. Povećati i za 1 i preći na sledeći korak. 5. Ako je i manje ili jednako n vratiti se na korak 3; u suprotnom završiti. Algoritam je, međutim, i ovo: A4. 1. Ubaciti monetu od 1 eur u odgovarajući prorez 2. Sačekati da se upali zeleno svetlo 3. Ako se želi crna kafa pritisnuti dugme A; ako se želi bela kafa pritisnuti dugme B. Kako se vidi, primeri su dosta različiti, ali ipak imaju određene zajedničke osobine. Prvo, svugde se susreću neke akcije (dejstva, operacije) i to u strogo zadatom redosledu. Dalje, ta sekvenca dejstava je svrsishodna, tj. vodi ka nekakvom cilju. Dejstva, složena u algoritamske korake, diskretna su i izvode se konačan broj puta, sve do dobijanja rezultata. I još, svi algoritmi imaju neke ulazne podatke: da bi se konstruisao jednakostranični trougao /A1/ mora se poznavati dužina stranice; da bi se odredila vrednost (x+y)/z /A2/ neophodno je poznavati vrednosti x, y i z; u cilju izvršavanja algoritma A3 mora se poći od zadavanja vrednosti n i a 1,..., a n. Čak i algoritam A4 polazi od nekih podataka, ali se oni ne zadaju spolja nego su ugrađeni u 2 Horezm je bila veoma napredna država u donjem toku Amu-Darje. Uništile su je, kao i mnogo toga, primitivne horde Džingis-kana. 9

njegov opis. Sve u svemu, može se kao prvo određenje pojma algoritma prihvatiti da je to pravilo koje objašnjava proces transformacije ulaznih podataka u traženi rezultat. Pojam algoritma, očigledno, sasvim je blizak pojmovima recept, postupak ili procedura. Dakle, svaki algoritam je pravilo, ali obrnuto ne mora da važi: saobraćajna pravila nisu algoritmi, kao ni pravilo "čast svakom-veresija nikom!". Činjenica da se algoritam sastoji od dejstava i da vodi ka rezultatu neposredno ukazuje na potrebu postojanja izvršioca, i to takvog koji može mehanički, samo na osnovu opisa algoritma, a bez uplitanja korisnika (onog kome je rezultat potreban), bez ikakve kreativnosti, da produkuje traženi rezultat. To, pak, zahteva da postoji način komunikacije, tj. jezik, na kojem se algoritam zadaje, a čija je glavna karakteristika ta da ga izvršilac razume i to u potpunosti. Taj jezik, nazvan jezikom algoritma, nema neku unapred zadatu, kanoničku formu: algoritam se može zadati u vidu uređenog skupa rečenica (svi navedeni primeri su takvi), ali i kao poznati blok dijagram, kao sekvenca iskaza na formalnom jeziku, programskom ili kvaziprogramskom, kao kolekcija crteža (kod geometrijskih konstrukcija na primer), kao i na druge načine; jedino na čemu se insistira je to da izvršilac bude u stanju da, na osnovu opisa i samo na osnovu njega, proizvede rezultat. Vratimo se, za trenutak, na ulazne podatke. Jasno je da ne može svaki podatak da igra ulogu ulaznog podatka u ma koji algoritam: zato govorimo o dozvoljenim i nedozvoljenim ulaznim podacima. Dozvoljeni ulazni podaci su oni koje algoritam može uopšte da interpretira kao takve: dozvoljeni ulazni podaci za A2 mogu biti bilo koje trojke realnih brojeva (uključujući čak i z=0, kada se kaže da je na dotičnu trojku algoritam neprimenljiv, iako je ona dozvoljena). Nedozvoljeni ulazni podaci obuhvataju vrednosti koje algoritam u principu ne može da prihvati kao ulaz; za isti algoritam to bi mogla da bude, recimo, trojka (zeleno, crveno, plavo). Imajući sve ovo u vidu u mogućnosti smo da empirijsku definiciju algoritma (često korišćen naziv je intuitivna definicija) preciziramo na sledeći način: Algoritam je pravilo, formulisano na nekom jeziku, koje jednoznačno definiše redosled operacija neophodan za transformaciju dozvoljenih ulaznih podataka u traženi rezultat. Napominjemo da metod kojim je dobijena gornja definicija nosi naziv "analitički". Odlikuje se time što se termin ("jezički simbol") što se definiše dovodi u vezu sa grupom drugih jezičkih simbola koji se smatraju poznatim i koji izražavaju njegove bitne odlike. Tako se dolazi do strukture definicije: novi termin (algoritam) - šira 10

klasa u koju spada (pravilo) - osobine po kojima se razlikuje od ostalih predstavnika iste klase 3. Empirijska definicija algoritma sasvim je prihvatljiva za opšte razumevanje pojma i dovoljna je kao podloga za svakodnevnu praksu. S druge strane, glavno područje primene algoritma per se - programiranje - u velikoj meri je egzaktna delatnost, te stoga ne treba da čudi to što se stručnjaci za ovu oblast nisu zadržali isključivo na tako širokom određenju i što je znatan napor uložen u dobijanje preciznije formulacije. Pri tom, postavljaju se kako pitanje samog koncepta algoritma tako i egzistencije algoritma za rešavanje svakog, unapred zadatog problema. Ni jedno od navedenih pitanja nije do danas potpuno rešeno, ali saznanja nadilaze empirijsku definiciju u datom obliku. 1.2 SINTETIČKA DEFINICIJA ALGORITMA Znatno određenija, mada i dalje ne sasvim egzaktna, definicija dobija se - što je i za očekivanje - uz pomoć tzv. normativnog pristupa definisanju i to prevashodno na bazi Raslovog (Russel) shvatanja tzv. sintetičke metode prema njegovim "Principima matematike" (videti 14 ). Normativni pristup, za razliku od empirijskog, podrazumeva propisivanje, ergo nametanje, značenja pojma i po prirodi je deduktivan 4. Po Raslovom shvatanju "Matematička definicija se sastoji u ukazivanju na takvu utvrđenu relaciju prema jednom utvrđenom terminu u kojoj može da stoji samo jedan termin; ovaj termin onda definišu utvrđena relacija i utvrđeni termin". Glavni nedostatak empirijske definicije jeste oslanjanje na pojmove koji su visoko intuitivni i za koje možemo reći samo zna se šta je to. Najuočljiviji su pojmovi ulazni podatak i traženi rezultat. Sintetička definicija algoritma jeste način da se (bar) ova dva pojma formalizuju. Osnova za sintetičku definiciju algoritma je apstraktni alfabet, onaj isti koji se susreće i kod formalnih teorija. Apstraktni alfabet, u algoritamskoj terminologiji, predstavlja konačan skup leksičkih simbola 5 koji nemaju nikakvu semantiku što će, 3 Kvadrat je-pravougaonik-čije su sve četiri stranice jednake dužine. Klika je-regularan graf-sa n čvorova stepena n-1 4 Empirijski (leksički) način je u suštini induktivan 5 razlika između običnog simbola i leksičkog simbola (tzv. tokena) je u tome što token može da se sastoji od iše pojedinačnih simbola, npr pqr, pri čemu se smatra da je token nerazloživ, tj. atomaran 11

dakle, reći da mogu odgovarati ma kakvim jedinicama posmatranja: simbolima u užem smislu, subjektima, stvarima (objektima), događajima ili misaonim kategorijama. Očigledno, jedina suštastvena razlika u odnosu na formalne teorije je zahtev za konačnošću alfabeta. Alfabeti (kratkoće radi, izostavljamo reč "apstraktni") su npr. X =,,, ili Y = Bečki, klasici, Hajdn, Mocart, Betoven, i, su, (prazan simbol, blenk ili blanko). Reč dužine n je niz od n simbola iz datog alfabeta. Dužina reči može da bude i 0, kada govorimo o praznoj reči. Primeri reči iz alfabeta A su,, (prazna reč) i ; njihove dužine su respektivno 5, 2, 0 i 3. Reč dužine 15 u alfabetu Y je: Bečki klasici su Hajdn i Mocart i Betoven 6. Skup reči nekog alfabeta W označavaćemo sa W*. Uobičajeno je da ako W eksplicitno ne sadrži praznu reč za oznaku stavljamo W +. Neka su X i Y dva, ne obavezno različita, alfabeta. Tada je alfabetski ili alfabetski operator svaka relacija (dakle jednoznačno ili višeznačno preslikavanje) reči iz alfabeta X u reč(i) alfabeta Y, odnosno G X* x Y*. Ako je G alfabetski operator tada se alfabet X naziva ulaznim, a alfabet Y izlaznim alfabetom, dok su sa X* i Y*, podsetimo, označeni skupovi reči iz pomenutih alfabeta. U slučaju da se ulazni i izlazni alfabet poklapaju, kaže se da je alfabetski operator definisan nad tim alfabetom. Domen (oblast definisanosti) alfabetskog operatora je skup reči nad kojima je on definisan, dok je skup reči koje se nalaze u drugonavedenim komponentama uređenih parova njegov kodomen. Uz pomoć ovih nekoliko pojmova formuliše se sintetička definicija algoritma: Algoritam je uređena četvorka (X, Y, G, Z), gde su X i Y respektivno ulazni i izlazni alfabet, G X* x Y* alfabetski operator, a Z konačni skup zakona 7 kojima se G zadaje. Skup Z nazvaćemo kodeks. Iako ova definicija deluje određenije, "matematičkije", od prethodne, sa takvim zaključkom ne treba žuriti. Naime, prve tri komponente uređene četvorke jesu formalizovane, ali četvrta to ni u kojem slučaju nije 8. Lako se zapaža da manjkavost leži u komponenti "konačni skup zakona" koja je tipično intuitivna. Nažalost, ova 6 Ali i "Hajdn i Bečki klasici su Mocart". Ne gubimo iz vida da se radi o čisto sintaksnim pojmovima 7 Umesto izraza "zakon" koristi se i "pravilo" koji smo izbegli da ne bi došlo do konfuzije jer se poslednji sreće u empirijskoj definiciji algoritma i nema identično značenje 8 Takav pristup, slaganje intuitivnih pojmova u uređene n-torke, dosta je uobičajen u računarskim naukama i služi svrsi - razumljivosti - ali samo kada se ne zloupotrebljava 12

četvrta, komponenta je i najvažnija, jer odgovara na pitanje kako (a ne samo šta ), što i jeste suština pojma algoritma. Dva algoritma su ekvivalentna po izvršenju ako se slažu odgovarajući alfabetski operatori i kodeks po kojima se oni izvršavaju. Drugim rečima, algoritmi A 1 = (X 1, Y 1, G 1, Z 1 ) i A 2 = (X 2, Y 2, G 2, Z 2 ) su ekvivalentni po izvršenju ako je, u matematičkom smislu, A 1 = A 2 (zbog ovog neki autori, umesto termina "ekvivalentni po izvršenju", kažu prosto "jednaki"). Očigledno, ovakvi algoritmi mogu se razlikovati, eventualno, po načinu na koji su zadati zakoni izvršavanja, odn. po jeziku na kojem su formulisani, što znači da se, de facto, radi o istom algoritmu. Dva algoritma su funkcionalno ekvivalentna ako se razlikuju samo po kodeksu, tj. ako za iste ulazne podatke daju isti izlaz, pri čemu se do vrednosti izlaza dolazi na drugi način. Za gornji primer to bi značilo da se u uređenim četvorkama mogu razlikovati samo Z 1 i Z 2. Takođe, smatra se da su algoritmi koji su ekvivalentni po izvršenju istovremeno i funkcionalno ekvivalentni. Primera za funkcionalno ekvivalentne algoritme ima bezbroj jer je jedna od osnovnih osobina algoritma ta da za gotovo svaki problem postoji više algoritama rešavanja. Setimo se samo mnoštva algoritama za sortiranje koji su svi funkcionalno ekvivalentni. Čak i za tako jednostavan algoritam kakav je npr. /A3/ lako se konstruiše funkcionalno ekvivalentan koji, umesto da sabira od a 1 do a n, operaciju izvodi u suprotnom redosledu: od a n ka a 1. Na pitanje ekvivalencije algoritama vratićemo se u poglavlju o analizi algoritamskih struktura. Kako je već pomenuto, algoritmi mogu biti deterministički kada se za isti ulaz uvek dobija isti izlaz (tj. alfabetski operator je funkcija), ali i stohastički za koje to ne važi. Konačno, algoritmi mogu biti samoizmenljivi. Njihova karakteristika je to što redosled izvođenja operacija može da zavisi od istorijata izvršenja, odn. od prethodno izvršenih koraka. U daljem tekstu, bavićemo se uglavnom determinističkim algoritmima. Algoritam (X, Y, G, Z) je deterministički ako je G funkcija, tj. ako važi G: X* Y*. Vratimo se na pitanje sintetičke definicije algoritma. Kao što je rečeno, ni ona nije strogo egzaktna jer se postavlja pitanje univerzalnog načina za formulisanje zakona iz kodeksa. Pitanje se može preformulisati u "postoje li sredstva kojima bi se zadao bilo koji algoritam ili bar algoritam koji mu je funkcionalno ekvivalentan?". Odgovor na ovo pitanje još nije dat, osim na nivou (doduše krajnje verovatnih) 13

hipoteza. Formalizmi (sredstva) kojima se zadaju algoritmi nose naziv algoritamski sistemi i ima ih više. U daljem ćemo nešto detaljnije razmotriti dva od tri najpoznatija sistema: Tjuringovu mašinu i Markovljeve (normalne) algoritme 9. Treba odmah podvući da su, bez obzira na to što deluju veoma različito, sva tri sistema ekvivalentna, odn. postoje formalni postupci kojima se prikaz algoritma u jednom algoritamskom sistemu može prevesti na prikaz u drugom. Primena algoritamskih sistema na precizan prikaz algoritama zasnovana je na tzv. osnovnoj hipotezi teorije algoritama koja glasi svaki algoritam može se predstaviti algoritamskim sistemom. Radi se o hipotezi (a ne npr. o teoremi) jer je ovaj stav nedokaziv. Inače, navedena tvrdnja sme se proglasiti za hipotezu, jer se može zamisliti primer kojim bi ona mogla biti opovrgnuta: dovoljno bi bilo pronaći nešto što zadovoljava našu predstavu o algoritmu (a i njegove intuitivne definicije), a što se ne može predstaviti algoritamskim sistemom. Iako je takva situacija krajnje neverovatna, ona nam ipak ne dozvoljava da idemo dalje od hipoteze. 9 treći algoritamski sistem su rekurzivne funkcije kojima se nećemo baviti 14

2. ALGORITAMSKI SISTEMI Sintetičkom definicijom algoritma uspevaju se formalizovati pojmovi ulaznih podataka i traženog rezultata korišćeni u empririjskoj definiciji. Takođe, formalizuje se i veza između njih, koja treba da bude ostvarena izvršavanjem algoritma. Ova veza govori o tome kakav izlaz (tj. koju reč ili skup reči iz izlaznog alfabeta) produkuje izvršenje algoritma nad zadatom rečju ulaznog alfabeta. Nažalost, sintetička definicija nema formalizovan odgovor na pitanje kako se implementira alfabetski operator, tj. kako izgleda postupak transformacije ulazne reči u izlaznu. Traženi odgovor pružaju algoritamski sistemi. Obradićemo dva od njih: Tjuringovu mašinu i Markovljeve normalne algoritme. 2.1. TJURINGOVE MAŠINE Ovaj algoritamski sistem postavio je engleski matematičar Alen Tjuring (Turing) godine 1936. polazeći od ideje izvršioca algoritma. Ranije smo podvukli da je izvršilac dužan da, pridržavajući se kodeksa, a na osnovu ulaznog i izlaznog alfabeta realizuje alfabetski operator, tj. da dobije traženi izlaz, i to postupajući mehanički. Postavlja se pitanje šta je to što je u stanju da izvede traženu transformaciju na čisto mehanički način? Naravno, to je mašina, ali ne realna koja raspolaže ograničenim resursima, nego apstraktna mašina, dakle mašina čiji su resursi neograničeni jer tako zahteva definicija algoritma (kada bismo govorili o računaru to bi bio računar sa beskonačnim kapacitetom memorije). Zadatak takve mašine bio bi da prerađuje nekakav ulaz (u najširem smislu reči) u izlaz, što se u sintetičkoj definiciji algoritma svodi na transformaciju reči iz ulaznog alfabeta u reč(i) iz izlaznog alfabeta, sve u skladu sa kodeksom. Pri tom, Tjuringova mašina ne pravi razliku između ulaznog i izlaznog alfabeta što ne utiče na opštost jer smo uvek u mogućnosti da ova dva alfabeta zamenimo njihovom unijom. Na taj način, osnovni zadatak Tjuringove mašine je transformacija reči nekog alfabeta u drugu reč iz istog alfabeta, prema svrsi alfabetskog operatora G, a saobrazno kodeksu Z. Alfabet nad kojom se vrše transformacije nosi naziv spoljašnji alfabet. Postoji čitav niz varijeteta Tjuringove mašine (zato je u naslovu i napisana množina) i gotovo svaki od njih može da se matematički opiše na više načina, no važno je napomenuti da su svi oni ekvivalentni, tako da ćemo u ovom tekstu obraditi 15

samo dva osnovna tipa: tzv. specijalnu Tjuringovu mašinu (sa jednom trakom) i univerzalnu Tjuringovu mašinu (ali bez ulaženja u detalje, u drugom slučaju). Specijalna Tjuringova mašina (u daljem tekstu Tjuringova mašina) sastoji se od tri funkcionalne celine: beskonačne trake, upisno-čitajuće glave i upravljačkog bloka, slika 2.1. upisno-čitajuća glava upravljački blok beskonačna traka... B a 1 a 2 a 3... a n-1 a n B B... Slika 2.1. Beskonačna traka je podeljena na segmente (ćelije) u kojima se nalaze pojedinačna slova spoljašnjeg alfabeta što čine reč i koja igra ulogu radne memorije. Zadatak upisno-čitajuće glave je, kako i samo ime sugeriše, upisivanje slova na traku odnosno čitanje slova sa nje. Upisno-čitajuća glava ima mogućnost pomeranja u oba smera, levo i desno. Upravljački blok inicira upis-čitanje i pomeranje upisno-čitajuće glave. Odlikuje se time što može (bolje rečeno mora) biti u nekom od apstraktnih stanja. Skup stanja upravljačkog bloka čini tzv. unutrašnji alfabet. Među stanjima postoji tačno jedno koje nosi naziv početno stanje; Tjuringova mašina se nalazi u tom stanju na početku izvršavanja zadatka. Mašina, uopšte, funkcioniše na sledeći način: traka na početku rada sadrži reč iz spoljašnjeg alfabeta čija je dužina konačna (reč a 1, a 2,..., a n sa slike 1.1), a koja je sa obe strane ograničena beskonačnim nizovima praznih ćelija, u oznaci B. Upisnočitajuća glava nalazi se iznad prvog slova s leva a 1, a upravljački blok je u početnom stanju. Mašina radi u vremenski diskretnim pokretima (engl. move) gde se svaki pokret sastoji od 3 razdela: 1. Menja se stanje upravljačkog bloka (u opštem slučaju, stanje može ostati isto, no to se smatra ipak trivijalnom promenom stanja) 2. Upisuje se slovo koje nije B u ćeliju nad kojom se nalazi upisno-čitajuća glava (nazovimo je aktuelnom ćelijom) i 16

3. Glava se pomera za jedno mesto ulevo ili udesno 10. Odluka o načinu promene stanja donosi se na osnovu trenutnog stanja upravljačkog bloka i slova koje se nalazi u aktuelnoj ćeliji. U skupu stanja nalazi se najmanje jedno koje je završno (finalno). Kada se mašina nađe u finalnom stanju (tačnije, ako se nađe jer to nije obavezno, a tada je u pitanju postupak koji se ne završava) ona se zaustavlja. Reč omeđena praznim ćelijama (tj. ćelijama čiji je sadržaj B) predstavlja rezultat obrade. Odmah treba skrenuti pažnju na dve pojedinosti. Naime, zapaža se da upis simbola B nije dozvoljen, tj. ćelija se ne može "isprazniti", što bi moglo da navede na pogrešan zaključak da izlazna reč ne može biti kraća od ulazne. Situacija, međutim, nije takva zato što postoji suptilna, ali veoma važna, razlika između prazne ćelije (ćelije sa sadržajem B) i praznog slova koje se ni po čemu ne razlikuje od ostalih slova, kao što se 0 pri sabiranju ne razlikuje od ostalih brojeva ili, recimo, neutralni element grupe od ostalih. Prazno slovo se, dakle, legalno upisuje u ćeliju što efektivno znači skraćivanje izlazne reči za jedno slovo. Drugo što treba notirati je činjenica da se ne garantuje zaustavljanje Tjuringove mašine (odn. dostizanje nekog od završnih stanja), što se, u suštini, svodi na problem konačnosti algoritma. Formalno, Tjuringova mašina definiše se kao uređena šestorka (K,,,, q 0, F) čije su komponente: K je konačan skup stanja upravljačkog bloka (unutrašnji alfabet) je spoljašnji alfabet koji sadrži i B (praznu ćeliju), a po potrebi i prazno slovo ( \ B ) je podskup skupa koji ne sadrži B i koji nosi naziv skup ulaznih slova : ((K x ) K x ( \ B ) x L, R je funkcija prelaza koja ne mora biti definisana na celom domenu. L i R su specijalni simboli koji označavaju kretanje upisno-čitajuće glave (L = ulevo, R = udesno) q 0 K je početno stanje F K je skup završnih stanja. Pod konfiguracijom Tjuringove mašine podrazumevamo uređenu trojku (q,, i) gde je q tekuće stanje, aktuelna reč na traci, a i udaljenost upisno-čitajuće glave od 10 postoje varijeteti kod kojih upisno-čitajuća glava može i da se ne pomeri 17

početka (krajnjeg levog slova) reči. Očigledno, konfiguracija u celosti opisuje stanje čitave Tjuringove mašine. Neka se u nekom trenutku na traci nalazi niz slova (reč) a 1 a 2... a n. Neka je, dalje, upravljački blok u stanju q, a upisno-čitajuća glava iznad slova a i, što znači da je tekuća konfiguracija (q, a 1, a 2,..., a n, i). Tada (q, a i ) = (p, x, R) znači "promeniti stanje u p, umesto a i upisati na traku x i pomeriti upisno-čitajuću glavu za jedno mesto udesno". Po izvršenju, nova konfiguracija je (p, a 1,... a i-1 xa i+1... a n, i+1). Rad Tjuringove mašine prikazaćemo na kvazi-programskom jeziku zasnovanom na sintaksi programskog jezika C. Beskonačnu traku ćemo predstaviti beskonačnim nizom cell čiji su indeksi celi brojevi. Na početku rada upisno-čitajuća glava nalazi se iznad pozicije sa indeksom 0, gde je i prvi simbol ulazne reči. Neka je ceo broj i tekuća pozicija upisno-čitajuće glave, tako da je na početku rada i=0. Označimo sa cell[i] simbol koji se nalazi na poziciji i. Neka važi L,R. Rad Tjuringove mašine može se predstaviti sledećim ciklusom: q = q 0 ; i = 0; while(q F) { (q,a, ) = (q, cell[i]); cell[i] = a; i = ( ==R)? i+1 : i-1; Očigledno, centralno mesto u Tjuringovoj mašini zaizima funkcija prelaza. Funkcija prelaza zadaje se tzv. funkcionalnom shemom - tablicom čije vrste odgovaraju stanjima iz skupa K, kolone slovima spoljašnjeg alfabeta, a elementi uređenim trojkama koje odgovaraju vrednostima funkcije prelaza (ako su definisane). Jedan od najinteresantnijih problema vezanih za Tjuringovu mašinu (i programiranje uopšte) jeste tzv. halting problem (problem zaustavljanja). Radi se o pitanju da li se može unapred zaključiti hoće li proizvoljna Tjuringova mašina za zadatu ulaznu reč završiti rad, tj. hoće li upravljački blok doći u neko od stanja iz 18

skupa F 11? Odgovor na pitanje je negativan! Dakle, halting problem kod Tjuringove mašine spada u klasu neodlučivih problema. Na kraju, jedna napomena vezana za skup ulaznih slova. Svrha njegovog izdvajanja iz je nominacija dozvoljenih ulaznih simbola. Ako je, na primer, = 0, 1 tada na početku rada traka može da sadrži samo reči iz skupa *, odnosno nizove nula i jedinica. Primer. Neka je data Tjuringova mašina T = (K,,,, q 0, F) gde je K = s 1, s 2, s 3 = 0, 1,, B ( je prazno slovo!) = 0, 1 q 0 = s 1 F = s 3 i gde je prelazna funkcija zadata sledećom funkcionalnom shemom: 0 1 B s 1 s 2 0R s 2 1R - - s 2 s 2 1R s 2 0R - s 3 R s 3 - - - - Zadatak ove mašine je da prihvati ulazne nizove koji se sastoje od slova 0 i 1 i da zameni sve nule jedinicama i obrnuto, osim za prvi simbol koji ostaje nepromenjen. Neka se na ulazu nalazi niz 11100 što znači da je početna konfiguracija (s 1, 11100, 0). Kako je s 1 početno stanje i 1 aktuelno slovo, prvo što se izvršava je prelaz s 1 1 s 2 1R posle kojeg će stanje biti promenjeno u s 2, na traku biti upisano slovo 1 i biti izvršen pomeraj udesno, tako da konfiguracija postaje (tekuća pozicija je, preglednosti radi, podvučena) (s 2, 11100, 1). Sledeći prelaz je prelaz s 2 1 s 2 0R 11 te, tako, produkovati rezultat 19

koja menja konfiguraciju u (s 2, 10100, 2). Postupak se nastavlja prema sledećem rasporedu: (s 2, 10100, 2) s 2 1 s 2 0R (s 2, 10000, 3) (s 2, 10000, 3) s 2 0 s 2 1R (s 2, 10010, 4) (s 2, 10010, 4) s 2 0 s 2 1R (s 2, 10011, 5). U ovom trenutku upisno-čitajuća glava nalazi se iznad prazne ćelije (B) tako da je sledeći prelaz s 2 B s 3 R i, s obzirom na to da je s 3 završno stanje, rad se zaustavlja. Rezultat je 10011 što je efektivno isto što i 10011 jer je prazno slovo (koje se tokom rada mora tretirati eksplicitno, kao simbol, da bi mašina mogla uopšte da funkcioniše). Veza između specijalne Tjuringove mašine i intuitivnog pojma algoritma prilično je vidljiva no, nažalost, identičnost je nedokaziva. Neka je A = (X, Y, G, Z) sintetički definisan algoritam, a T = (K,,,, q 0, F) Tjuringova mašina. Tada se ulazni alfabet A može interpretirati kao, dok je = X Y. Ovo poslednje može da zbuni; međutim ako se A zameni sa A' = (X, X Y, G, Z) dobija se funkcionalno ekvivalentan algoritam jer višak slova u novoj izlaznom alfabetu nema nikakvog uticaja ni na alfabetski operator G niti na kodeks Z, jer je skup vrednosti operator G ostao isti. Kodeks Z ostvaruje se putem (K,, q 0, F) dok cela Tjuringova mašina realizuje operator G. Sve ovo ne znači da je pred nama egzaktan dokaz ekvivalencije algoritma i Tjuringove mašine i to zato što ostaje otvoreno pitanje da li se svaki kodeks Z može ostvariti putem (K,, q 0, F). Sve što se može iskazati je modifikovani oblik osnovne hipoteze teorije algoritama: Svaki algoritam može se zadati u obliku funkcionalne sheme specijalne Tjuringove mašine. Inače, pored ove verzije specijalne Tjuringove mašine postoji još niz varijanata koje su, uočimo to, međusobno ravnopravne (ekvivalentne), tako da je sa stanovišta algoritamskih sistema teorijski svejedno koja se razmatra. Najčešće razlike 20

koje se pojavljuju su mogućnost da se upisno-čitajuća glava po upisu ne pomeri (dakle, pored pomeraja L i R postoji još jedan, npr. N, koji znači da glava ostaje na istom mestu); druga uočljiva razlika je vezana za zaustavljanje mašine: naime, umesto skupa završnih stanja, zaustavljanje se može izvesti i tako što do njega dolazi ako se konfiguracija ponovi dva puta uzastopce. Najzad, postoje i Tjuringove mašine sa dve ili više traka. Drugi osnovni oblik Tjuringove mašine je univerzalna Tjuringova mašina. Nastala je kao odgovor na pitanje da li može da se definiše Tjuringova mašina koja ne bi, poput specijalne, izvršavala samo jedan algoritam, nego bi mogla da se primeni na sve algoritme. Pitanje nikako nije stvar običnog uopštenja jer se radi o direktnom putu ka računaru, tako da je univerzalna mašina sa stanovišta računarstva najvažnija vrsta Tjuringovih mašina. Odgovor leži u uvođenju mogućnosti da se, pored ulaznih slova, menja, odn. zadaje i funkcionalna shema. Prema tome, osnovna karakteristika univerzalne Tjuringove mašine je izmenljivost kako spoljašnjeg alfabeta, tako i unutrašnjeg alfabeta i funkcije prelaza. Njena konstrukcija zasniva se na ideji oponašanja (simulacije) različitih specijalnih Tjuringovih mašina, a tehnika kojom se to postiže je kodiranje kako spoljašnjeg alfabeta, tako i kompletne funkcionalne sheme pri čemu su sami kodni simboli univerzalne mašine fiksirani, ali se pridruživanje vrši na različite načine u zavisnosti od specijalne mašine koja se oponaša. Ono što je možda najvažnije kod ovog tipa mašine je činjenica da se različite funkcionalne sheme takođe memorišu na traci, tako da svaka takva shema nije ništa drugo do program, a sama univerzalna Tjuringova mašina ponaša se, u stvari, kao računar 12! Time je teorijski potkrepljena čuvena fon Nojmanova (von Neumann) koncepcija da između podataka u užem smislu reči i instrukcija za manipulisanje tim podacima nema razlike. Skupovi kodnih simbola mogu se razlikovati i može ih biti dva ili više. Ne ulazeći u detalje, dajemo ilustraciju jednog od mogućih načina kodiranja. Pretpostavićemo da skup kodnih simbola univerzalne Tjuringove mašine sadrži samo dva simbola, 0 i 1 (dakle, baš kao i računar) i prikazati jedan od mogućih postupaka za kodiranje spoljašnjeg alfabeta, unutrašnjeg alfabeta odn. skupa stanja K i funkcionalne sheme odn. funkcije. Neka se spoljašnji alfabet sastoji od slova a 1,..., 12 Bolje reći računar se ponaša kao univerzalna Tjuringova mašina jer je ovo drugo i hronološki i pojmovno stariji koncept 21

a k i B i neka je skup stanja K = q 1,..., q m. Neka su L i R oznake za pomeraj. Kodne grupe se definišu kao nizovi različitog broja nula omeđeni dvema jedinicama prema sledećem rasporedu: R 101 L 1001 B 10001 a 1 a 2... a k q 1 q 2... q m 100001-4 nule 10000001-6 nula 10...01-2(k+1) nula 1000001-5 nula 100000001-7 nula 10...01-2(m+1)+1 nula Očigledno, kodne reči se biunivoko preslikavaju na simbole bilo koje specijalne Tjuringove mašine jer su i spoljašnji alfabet i skup stanja dati sasvim uopšteno. Primenom gornjeg načina kodiranja prerada reči bcadc u reč bcdcc specijalne Tjuringove mašine sa = a, b,..., z odvijala bi se na bazi ulazne reči univerzalne Tjuringove mašine oblika 10000001 1000000001 100001 100000000001 1000000001 (b) (c) (a) (d) (c) dok bi odgovarajući program imao sledeći vid: 1000001 10000001 1000001 101 (q 1 b q 1 br) 1000001 1000000001 1000001 1000000001 101 (q 1 c q 1 cr) 1000001 100001 100000001 100001 101 (q 1 a q 2 ar) 22

100000001 100000000001 10000000001 1000000001 1001 (q 2 d q 3 cl) 10000000001 100001 1000000000001 1000000000001 1001 (q 3 a q 4 dl) gde je q 1 = 1000001 početno, a q 4 = 1000000000001 završno stanje ili jedno od završnih stanja, ako ih ima više. 2.2. NORMALNI ALGORITMI MARKOVA Normalni algoritmi Markova (prema sovjetskom naučniku A.A. Markovu, 1954.) po osnovnoj ideji srodni su Tjuringovim mašinama zbog toga što je prilaz direktan, odnosno baziran na odvijanju algoritma. Glavna razlika je u uglu posmatranja: dok Tjuringove mašine tretiraju algoritme sa stanovišta izvršioca, normalni algoritmi ih tretiraju sa stanovišta izvršavanja. Iz aspekta programera ovo je sigurno najprirodniji algoritamski sistem stoga što normalni algoritam nije ništa drugo do opšti, kanonički oblik bilo kojeg algoritma. Štaviše, upadljiva je sličnost između normalnih algoritama i Strukturne teoreme (videti dalje) koja se bavi ne samo algoritmima nego i njihovom implementacijom na računaru. Prvi korak na putu ka kanoničkom obliku algoritma je standardizacija alfabetskog operatora G. U tom smislu Markov je uočio da se transformacija ulazne reči iz skupa X* u reč iz Y*, a posredstvom G, može realizovati u etapama uz primenu samo dve vrste elementarnih operatora: 1. operatora obrade čiji je zadatak da tekući oblik reči preradi u sledeći koji vodi (ili ne vodi) konačnom rešenju i 2. upravljačkih operatora što, na osnovu osobina tekuće reči, odlučuju o tome koji će operator obrade biti odabran za narednu transformaciju. Za prikaz redosleda izvršavanja operatora obrade diktiranog upravljačkim operatorima najpogodniji je grafički metod jer, kao što kaže stara mudrost, "jedna slika vredi hiljadu reči". Od nekoliko varijanata opredeljujemo se za onu koja je najbliža programerima: blok dijagrame algoritama (organigrame) i to u najjednostavnijem obliku, dovoljnom za teorijsko razmatranje, a to je onaj koji obuhvata samo pomenuta dva konkretna operatora, koji se prikazuju simbolima sa slike 2.2 gde su prikazani respektivno. Slika 2.2. 23

Operatori obrade (procesiranja) transformišu međureči jednu u drugu; operatori odluke sa obavezno dva izlaza daju informaciju o sledećem koraku. Operator obrade se, u opštem slučaju, predstavlja kao smena (zamena). Izvršava se nad rečju. Ako je tekuća reč iz nekog alfabeta A označena sa X tada smena znači "prvu podreč (čitano sleva) reči X zameniti sa ; ako to nije moguće ignorisati operaciju". Na primer, ako se na reč 4923746592367 primeni smena 923 0 dobija se reč 40746592367. Svrha operatora odluke je da obezbedi informaciju o tome da li je smena izvodljiva ili nije, odn. da li je podreč tekuće reči. Niz reči X 1, X 2,..., X n koji se dobija primenom tačno određenog redosleda smena nosi naziv deduktivni lanac, što već po semantici nagoveštava postojanje odgovarajuće formalne teorije. Tako, na primer, dvostruka primena smene bc x na reč abcabca produkuje deduktivni lanac abcabca - axabca - axaxa. Pod normalnim algoritmom Markova podrazumeva se strogo uređeni niz operatora smene i odluka o njihovoj primeni. Suština definicije je u sintagmi "strogo uređeni niz" jer različiti nizovi smena mogu da vode ka različitim rezultatima. Ako se na reč xyzyx primene redom smene x a, x b dobija se reč ayzyb; ako se redosled smena promeni u x b, x a rezultat je byzya 13. Kao što kod Tjuringovih mašina postoje završna stanja, tako i kod normalnih algoritama postoje završne smene po čijem se izvođenju smatra da je procedura završena. Označavaju se, obično, tako što se iza simbola dopisuje tačka, to jest smena. označava kraj obrade. Posebno, smena, koja može biti i završna, ima značenje "zameniti prvu sleva praznu podreč sa ", to jest "postaviti na početak reči. Za praznu reč upotrebljavaćemo oznaku. Blok dijagram normalnog algoritma Markova prikazan je na slici 2.3. Jasnoće radi, primenjene su tri metaformule. Neka je i, i=1,...,n smena. Tada predikat P( i,x) ima vrednost ako je i primenljiva na reč X, a u suprotnom. Dalje, X = i (X) ima 13 Inače, postoji i uopšteni normalni algoritam Markova koji ne podrazumeva nikakav poseban redosled smena, te zato dozvoljava definisanje nedetermističkih algoritama koji nadilaze nivo ovog teksta. 24

značenje "transformisati reč X primenom smene i ". Konačno, predikat K( i ) ima vrednost ako je i završna smena i u suprotnom. Reč na koju se primenjuje algoritam označena je sa X. X P( 1,X) X = T 1(X) K( 1) 1 T P( 2,X) X = T 2(X) K( 2) 1 T P( n,x) X = T n(x) K( n) 1 1 T Slika 2.3. Sa dijagrama se vidi da se, pre svega, smene vrše u strogo određenom redosledu, a zatim i da postupak može da se završi na dva načina: ili se nailazi na neku od završnih smena, ili se pak prolazi kroz svih n pokušaja, a da se ne izvrši ni jedna smena. Osim navedenog postoji i jednostavniji prikaz normalnog algoritma: smene se urede u sekvencu i primenjuju cirkularno od prve do poslednje; zatim se opet prelazi na prvu i tako dalje sve dok se ne naiđe na završnu smenu ili se prođe cela sekvenca bez primene ijedne od njih (videti primer). Značaj normalnih algoritama je njihova univerzalnost koja proističe iz tzv. principa normalizacije koji glasi Za svaki algoritam može se konstruisati funkcionalno ekvivalentan normalni algoritam koji je nedokaziv zbog neodređenosti pojma "svaki algoritam". Neka je zadat alfabet A i normalni algoritam N. Tada se za N kaže da je normalni algoritam u alfabetu A ako prihvata ulaz iz skupa slova A*, daje izlaz iz istog skupa i u svim smenama sadrži samo slova iz tog alfabeta. Postoji, međutim, niz slučajeva u kojima nije moguće 25

definisati normalni algoritam funkcionalno ekvivalentan nekom algoritmu u alfabetu A. Zato se definiše proširenje alfabeta A, odn. skup B A tako što se dodaju još neka slova. U tom slučaju normalni algoritam N konstruiše se u skupu B, ali tako da za sve ulaze iz A* generiše iste izlaze kao i algoritam koji se normalizuje. Za takav normalni algoritam kaže se da je definisan nad alfabetom A. Princip normalizacije, naravno, odnosi se upravo na ovakve postupke. Primer (prema 16 ). Jedna od osnovnih rekurzivnih funkcija nosi naziv funkcijanaslednik. To je funkcija jednog celobrojnog argumenta koja za rezultat daje sledeći po veličini ceo broj. Ako je x ceo broj tada je funkcija-naslednik, u oznaci z efektivno jednaka z+1. Funkcija-naslednik može se izračunati sledećim normalnim algoritmom Markova (zadat je u pojednostavljenom obliku, kao sekvenca smena): 0y. 1 8y. 9 x5 5x 3x 3y 1y. 2 9y y0 x6 6x 4x 4y 2y. 3 y. 1 x7 7x 5x 5y 3y. 4 x0 0x x8 8x 6x 6y 4y. 5 x1 1x x9 9x 7x 7y 5y. 6 x2 2x 0x 0y 8x 8y 6y. 7 x3 3x 1x 1y 9x 9y 7y. 8 x4 4x 2x 2y x pri čemu su smene, kratkoće radi, smeštene po kolonama. Da bi realizovao funkcijunaslednik algoritam na ulazu može da primi samo nizove cifara i prazno slovo na početku, što znači da je osnovni alfabet A = 0, 1,..., 9. S druge strane, u smenama se pojavljuju još i slova x i y, što znači da je algoritam definisan nad alfabetom A. Sa praznim slovom na ulazu algoritam se neće završiti jer se dobija beskonačni niz x, xx, xxx,... Neka je na ulazu reč 199. Primena algoritma na ovu reč počinje poslednjom smenom x i daje x199. Zatim se primenjuje smena x1 1x što daje 1x99 itd. Kompletan deduktivni lanac primenjen na ulaz 199 je 199, x199, 1x99, 19x9, 199x, 199y, 19y0, 1y00, 200. 26

Imajući u vidu princip normalizacije i ranije navedene oblike osnovne hipoteze teorije algoritama, poslednja se očigledno može formulisati i ovako Svaki algoritam može se predstaviti kao normalni algoritam Markova iz čega neposredno sledi tvrđenje da su Tjuringove mašine i normalni algoritmi Markova međusobno ekvivalentni načini za zadavanje istog pojma - algoritma. Vredno je napomenuti da za ovo tvrđenje postoji i formalni dokaz. 27

3. ANALIZA ALGORITAMSKIH STRUKTURA Pored teorije algoritama koja se prevashodno bavi egzistencijom algoritamskih rešenja postoji još jedan, ne manje važan, aspekt nauke o algoritmima: analiza algoritama u okviru koje se tretiraju problemi njihove strukture i realizacije. Ta problematika obuhvata izučavanje specifičnih algoritamskih struktura, zatim pitanja korektnosti i efikasnosti i konačno postupke za konstrukciju algoritama pod zadatim uslovima. U ovom poglavlju osvrnućemo se na algoritamske strukture i to kroz tzv. strukturirano programiranje koje je prva zaokružena metodologija za analizu i izgradnju algoritama. Odmah se skreće pažnja da se, umesto izraza "algoritam" koristi termin "program" što, strogo gledano, nije sasvim korektno s obzirom na to da se ne razmatraju tipovi podataka. Treba, međutim, prihvatiti činjenicu da je u kontekstu strukturiranog programiranja naziv "program" odavno usvojen kao takav i svi ga, bez razlike, upotrebljavaju, tako da bi pokušaj promene termina izazvao nepotrebnu konfuziju. Strukturirano programiranje predstavlja istorijski najstariji (uspešan) pokušaj da se u postupak razvoja programa unese neki red, odnosno da se programiranje fundira kao inženjerska delatnost. Nastalo je kao glavna, iako ne i jedina, posledica rešavanja tzv. softverske krize kraja šezdesetih godina prošlog veka, koja se ogledala u pojavi potpunog nesklada između hardverskih mogućnosti računara i povećanih potreba korisnika s jedne i primitivne tehnologije izrade softvera s druge strane. Naime, osnovna odlika tehnologije izrade softvera pre pojave strukturiranog programiranja sastojala se u tome da nekakve posebne tehnologije nije ni bilo, pa stoga za tadašnji pristup razvoju softvera neki autori čak upotrebljavaju izraz "haotično programiranje" 14. Počeci strukturiranog programiranja sežu negde u drugu polovinu šezdesetih godina kada je formulisana Strukturna teorema Boehm-a i Jacopinija 1966. godine i kada je Dajkstra (E.W. Dijkstra) objavio čuvenu raspravu "Goto Statement Considered Harmful" u Communications of the ACM, godine 1968. Pritom, od posebnog interesa je upravo ovo poslednje jer je Dajkstra ukazao na glavni razlog neupravljivosti složenih softverskih paketa - programske skokove kojima su obilovali programi pisani na u to doba glavnim jezicima, fortranu i kobolu. 14 u naučnim krugovima koristi se manje pežorativan naziv kompozitno programiranje 28

Analizirajući uticaj naredbi skoka (goto nije jedina) on je pokazao da je čitljivost i razumljivost programa obrnuto proporcionalna broju skokova i sledstveno, da je verovatnoća postojanja greške u direktnoj korelaciji sa tim brojem. Takvo tvrđenje u potpunom je skladu sa činjenicom da prilikom rešavanja bilo kojeg problema čovek rezonuje sistematski, odnosno da ga rešava sekvencijalno, korak po korak, a ne haotično, preskačući sa jednog potproblema na drugi i vraćajući se na već urađeno. Programi sa velikim brojem skokova razvijani su upravo na ovaj drugi način te su stoga obilovali greškama, teško su se pisali, još teže testirali, a skoro nikako modifikovali i dopunjavali po zahtevu naručioca. 15 Osnovne postavke i sredstva strukturiranog pristupa programiranju bili su relativno brzo definisani, naročito radovima Dajkstre, Hoara (C.A.R. Hoare) i Dala (O.J. Dahl) (knjiga "Structured Programming" iz 1972. po kojoj je čitava metodologija dobila ime) i pojavom programskog jezika paskal (Niklaus Virt, 1969.). Metode i tehnike koje čine strukturirano programiranje intenzivno su se razvijale i u narednih desetak do petnaest godina predstavljale su jedinu tehnologiju za sistematsku proizvodnju softvera. U poslednjih desetak godina strukturirano programiranje nije više dominirajuća generalna paradigma prepustivši primat novijem pristupu: objektno orijentisanom programiranju. Iz toga se, međutim, ne bi smeo izvesti zaključak da je strukturirano programiranje zastarelo (programerski svet je inače sklon takvim preterivanjima) jer deduktivni način razmišljanja prilikom izrade programa nije se promenio niti je u izgledu da se to desi u skoroj budućnosti. Takođe, upravljačke strukture koje se koriste u objektnom programiranju (sekvence, selekcije i ciklusi) su iste one koje su definisane u strukturiranom pristupu. Strukturirano programiranje bilo je čvrsto vezano za tehniku razvoja programa tzv. sukcesivnom dekompozicijom (top-down program development), koja se izvodi postepenom detaljizacijom programa od grube šeme do nivoa spremnog za kompilaciju. Ova veza bila je toliko čvrsta da se tehnika sukcesivne dekompozicije izjednačavala sa metodologijom u celini, što je pogrešno, naročito u novije vreme kada sama tehnika više ne predstavlja fundament za izgradnju softverskih sistema, dok je strukturirani način razmišljanja i dalje u potpunosti aktuelan. Da bi se napravila razlika između strukturiranog programiranja i tehnike sukcesivne dekompozicije dajemo definiciju strukturiranog programiranja 18 : 15 takve programe pežorativno zovu "špageti kod". 29

Pod strukturiranim programiranjem podrazumeva se skup tehnika za razvoj programskih modula koje koriste strogo definisane grupe upravljačkih struktura i struktura podataka. 3.1. GRAF TOKA PROGRAMA Graf toka programa je kvazi-digraf čiji čvorovi odgovaraju naredbama, njihovim delovima ili pak grupama. To je struktura slična blok dijagramu algoritma (organigramu) koja pokazuje redosled izvršavanja njegovih naredbi. Takođe, ulazne i izlazne grane 16 grafa toka programa obično se vezuju za samo jedan čvor, tj. ulazna grana ne izlazi ni iz jednog čvora niti izlazna grana ulazi u neki čvor. Kaže se da one ulaze iz okoline odnosno izlaze u nju. Dakle, za razliku od blok dijagrama algoritma, graf toka programa nema čvorova tipa START i STOP, a takođe se ne pravi razlika između operacija obrade i raznih operacija ulaza-izlaza. Graf toka programa, u stvari, ima samo tri vrste čvorova: 1. Proces ili funkcionalni čvor koji predstavlja operaciju transformacije (obrade) podataka. Zamenjuje operacije obrade, ulaza-izlaza i poziva podalgoritma u blok dijagramu. Funkcionalni čvor u grafu toka programa može da zameni i neku podstrukturu ako je to od interesa za analizu. Ima i ulazni i izlazni stepen jednak 1. Prikazuje se pravougaonikom u koji se upisuje neka identifikacija operacije (slika 3.1). f Slika 3.1. 2. Predikat je čvor koji odgovara algoritamskom koraku logičkog testa, tj. realizuje grananje diktirano rezultatom izračunavanja vrednosti odgovarajuće logičke funkcije. Ima ulazni stepen 1, a izlazni stepen 2 (slika 3.2). U simbol se unosi oznaka logičke funkcije. 16 grane su prikazane strelicama 30

T p Slika 3.2. 3. Kolektor je pomoćni čvor koji ne izvodi nikakvu obradu nego služi samo za povezivanje dve grane koje se stiču na istom mestu. Ima ulazni stepen 2, a izlazni stepen 1 (slika 3.3). Slika 3.3. Primer. Funkcija maxel služi za određivanje vrednosti maksimalnog elementa realnog niza v sa n elemenata: double maxel(double v[], int n) { double vmax; int i; for(maxv=v[0],i=0;i<n;i++) if(v[i]>vmax) vmax=v[i]; return vmax; Ovom programu odgovara graf toka prikazan na slici 3.4. vmax=v[0] i=0 i<n i++ T v[i]>vmax T vmax=v[i] Slika 3.4. 31