Dvo as VII - alternativna re²enja

Relevanta dokument
Objektna metodologija

Uvod u VHDL. Marijo Maračić

TVÅ SPRÅK ELLER FLERA? DVA ILI VIŠE JEZIKA? Råd till flerspråkiga familjer. Savjeti višejezičnim porodicama

kako je to biti mlad & živjeti sa zašticenim osobnim podacima

kako je to biti mlad & živeti sa zašticenim licnim podacima

Olivera Grbić. Srpski. Kuvar. Sva tradicionalna jela na jednom mestu. Beograd, 2013.

FILOSOFISKA FAKULTETEN INSTITUTIONEN FÖR SKANDINAVISKA SPRÅK OCH LITTERATUR. Tillämpning av transposition i olika texttyper

1. M öt et s öp pn an d e S ve n fö r k la r a r mö t et ö p p nat k lo c k a n i me d le ms k o nt o r et.

šta trebam reći svom djetetu?

TOK KAZNENOG POSTUPKA NA DRUGOSTEPENOM SUDU

R app o r t T A n a l y s a v f as t p r o v. Ut f ä r dad P e r S a mu el s s on

šta treba da kažem svom detetu?

što trebam reći svom djetetu?

TOP PONUDA. GRČKA 2.LIGA ** 1 X 2 1X X Ergotelis-Panachaiki 16:00 4,30 3,40 1,70 1,80 1,12 1,19 Min. 3 komb.

Savjeti i informacije pred tretman implantata

Osoba za kontakte Telefon Broj zaposlenika

Både kvinnor och män flyr, men

Švedska. džepni vodič. Činjenice, korisna obavještenja i savjeti novim građanima. Integrationsverket

NAIZMJENIČNO NA MATERNJEM I NA ŠVEDSKOM JEZIKU

sadržaj Latinka Perović Nesavladive unutršnje kontradikcije Latinka Perović Mit nije osnova za politiku... 15

Översättning av filmvetenskapliga texter från svenska till kroatiska och från kroatiska till svenska

Adagio. œ œ œ œ œ œ œ. œ œ œ œ. & bb 4 4 œ. & bb. œ œ œ œ œ œ œ œ Œ. & bb œ œ œ œ œ œ œ œ. & bb œ œ œ œ œ b D. q = 72. och nar. var 1ens.

Svensk-bosnisk/kroatisk/serbisk ordlista

Till Dig. Innehåll. Blåeld musik kärleksverser tonsatta av Lasse Dahlberg. Allt, allt jag ägde...

FILOSOFISKA FAKULTETEN INSTITUTIONEN FÖR SKANDINAVISKA SPRÅK OCH LITTERATUR. Översättning av institutionsnamn mellan kroatiska och svenska

FILOSOFISKA FAKULTETEN INSTITUTIONEN FÖR SKANDINAVISKA SPRÅK OCH LITTERATUR

SORTERING OCH SÖKNING

Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen

LJILJAN Växjö Bosnien-Hercegovinas förening

Dobrodošli u Moju zbirku domaćih zadaća 3!

TOP PONUDA. ENGLESKA KONFERENCIJA PREMIER - DOIGRAVANJE ** 1 X 2 1X X Boreham W.-Fylde 20:00 1,85 3,30 3,70 1,17 1,65 1,20 JEDNA UTAKMICA

EKSPLOZIVNE ODUŠKE ZA RASTEREĆENJE PRITISKA PRI EKSPLOZIJI PRAŠINE EXPLOSION VENTS FOR PRESSURE RELIEF OF DUST EXPLOSIONS

Informacije za pacijente o hirurgiji za lečenje gojaznosti

BOSNISKA. Dobra hrana za djecu. izmedju jedne i dvije godine

Tranors nyttjande av en tranbetesåker vid Draven i Jönköpings län

Blåsen nu alla (epistel nr 25)

Psihijatrijska zdravstvena njega. Informacija za zbrinute prema zakonu o obveznom psihijatrijskom liječenju

Liten svensk ordlista. Mali švedski rečnik. Grundläggande konversation Osnovna konverzacija. DoviĊenja (Zdravo) Jag kommer från Ja sam iz...

Det drickbara resevaccinet mot kolera

DENVER DTB-135 HDDVB-T2-MOTTAGARE

MAGAZIN SAVEZA BANJALUČANA U ŠVEDSKOJ / MAGASIN UTGIVEN AV RIKSFÖRBUNDET BANJALUKA I SVERIGE Š E H E R BANJA LUKA

HC-2. All män na data Hyg ros tat. Drift- och montageinstruktion [Dok id: mi-292se_150522] HC-2, Digital hygrostat.

Sretan 1. mart - Dan nezavisnosti BiH

Ljetni praznici i ljetni kamp 2018

SIGURNOST PUTOVANJA O prometnoj sigurnosti za djecu s funkcijskim preprekama

VECKANS LILLA POSTKODVINST á kronor Inom nedanstående postkoder vinner följande 249 lottnummer kronor vardera:

Svim građanima BiH u domovini i svijetu Sretan 1. mart Dan nezavisnosti BiH

Komparativna analiza strojnog prijevoda sa švedskog na hrvatski jezik

R app o r t T A n a l y s a v f as t p r o v. Ut f ä r dad A le xa n d e r G i r on

3.2 Beskrivning Vad räk nas ut av Fi ni ta Ele ment- Me to den i en sta tisk ana lys?

Pitanja i odgovori o mokrenju u krevet BKS bosniska/kroatiska/serbiska Brošuru je izdala Švedska akademija za enurezu (Svenska EnuresAkademin)

FILOSOFISKA FAKULTETEN INSTITUTIONEN FÖR SKANDINAVISKA SPRÅK OCH LITTERATUR. Syntaktisk komplexitet vid översättning av texter i olika stilar

Dobro došli na posao. Annika Creutzer. Bosanski/Hrvatski/Srpski - Bosniska/Kroatiska/Serbiska

α alfa β beta γ gamma δ delta ε epsilon ζ zeta η eta θ theta ι iota κ kappa ν ny α alfa β beta γ gamma δ delta ε epsilon ζ zeta η eta θ theta ι iota

Blagajnik-Ekonom/Kassör-Ekonom

Kommentarer till A, B, C 1, 2, 3, GREMO. Morgan Nilsson

NOVATHERM 4FR PROJEKTERINGSANVISNING BRANDISOLERING AV BÄRANDE STÅLKONSTRUKTIONER

Herdabrev för Livets söndag 2018

ERSÄTTNING TILL BROTTSOFFER SLOVENIEN

Utvecklingen av klövviltstammarna på Halleoch Hunneberg Ar be tet är be ställt av Sve as kog/na tu rup ple vel ser AB

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Bröderna fara väl vilse ibland (epistel nr 35)

Ž E N A. Kvinna. septembar-decembar

Långfredagens högtidliga förböner

Arbitrana pravila Meðunarodne trgovaèke komore

Beredskapsavtal. Fastigo Fastighets, Sif, Ledarna, CF, Sv Arkitekter, SKTF. Giltigt från

Hade jag sextusende daler (sång nr 14)

Vama koji ste bili izloženi krivičnom delu

Akt 2, Scen 7: Utomhus & Den första förtroendeduetten. w w w w. œ œ œ. œ œ. Man fick ny - pa sig i ar-men. Trod-de att man dröm-de.

Taas on aika auringon / Jag tror på sommaren

Kompletteringsutbildning på svenska

3 (3) MSEK -8 (-10) MSEK 133 (136) MSEK -16 (-15) MSEK (16 998) SEK 194 (199) MSEK BY THE WAY

Magnus Nielsen, IDA, Linköpings universitet

L O. a r. l e d. l g. e s d. n a. t o. n a. n o. i a. t i l. t a l p. n e. e d. r v. n e. k e d. l l. r vä. Tävlingen arrangeras av S UASH CENTER

Ž E N A K V I N N A LIST BIH SAVEZA ŽENA U ŠVEDSKOJ

Ž E N A K V I N N A. juli-novembar

POSTKODVINSTER á kronor Inom nedanstående postkoder vinner följande 307 lottnummer kronor vardera:

FILOSOFISKA FAKULTETEN INSTITUTIONEN FÖR SKANDINAVISKA SPRÅK OCH LITTERATUR

Hundra tusen miljarder

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Ž E N A K V I N N A. juni decembar

BOSNISKA/SERBISKA/KROATISKA. Prodaja piva srednje jačine

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

ZBIRKA PRI^A. Muhammed Muvaffak Selimeh Muhammed Munir el - D unbaz Muhjjiddin Selimeh. Sarajevo G.H.

VECKANS LILLA POSTKODVINST á kronor Inom nedanstående postkoder vinner följande 229 lottnummer kronor vardera:

Ž E N A K V I N N A. novembar maj

Ungdomen ä ena dumma fä The Whiffenpoof Song

T rädinventering & okulär besiktning Fäholmaskogen, Kärrtorp

4-tråd, mo du lar kon takt. Alarm 1 st hög nivå %, all tid hög re än steg 1

Pravobranitelj protiv diskriminacije DO

27. NATURLJUD. o k k o k k k. p k k k kz k k o k k k k k k n k k k. k o k. a f4 Fredrik: kk k. k dk. a f4 4 j. k n. k n k k. k n k n k n.

Tel:+381 (0) / Ivica Bačvanski dipl.el.inž.elem ELGO Beograd

bruksanvisning/ user manual

Ž E N A K V I N N A. decembar mart

Tentamen: Programutveckling ht 2015

Till Dig. 11 kärleksverser tonsatta av Lasse Dahlberg. pianoarrangemang Jonas Franke-Blom. Blåeld musik

BROJ GODINA XVIII NORRKÖPING MART-JUNI 2010

Alings ås Sven Jo nas son Ste fan By dén

152 LIVSKRAFT OCH HÅLL BAR UT VECK LING I GÖ TE BORGS SÖ DRA SKÄR GÅRD BILAGOR

Ljudska prava u Evropi

Transkript:

Dvo as VII - alternativna re²enja Ðorže Staki, Matemati ki fakultet 8. april 2007.

Uvod U ovom tekstu nalaze se zadaci koji su raženi na 7. dvo asu praktikuma iz Programiranja 2 na Matemati kom fakultetu, zajedno sa nekim varijantama njihovih re²enja. Zadatke je izvorno formulisao Milan Bankovi i oni se ve nalaze na adresi http://www.matf.bg.ac.yu/~milan/p2/dvocas_7/dvocas_7.pdf, dok se njihova re²enja nalaze na adresi http://www.matf.bg.ac.yu/~milan/p2/dvocas_7/dvocas_7-resenja.pdf a programski C kod na adresi http://www.matf.bg.ac.yu/~milan/p2/dvocas_7/programi.zip. Po²to sam na svojim asovima praktikuma vižao i razna druga ija re²enja ovih istih zadataka i razne ideje studenata, hteo sam da to zajedno negde prikupim i koliko je mogu e prokomentari²em. To je sve zajedno prikupljeno ovde i zato ovaj tekst ima podnaslov "alternativna re²enja". Studenti koji su mi dostavili emailom svoje radove hronolo²ki su: Nikola Stankovi, Milo² Vu kovi, Ivan Pavlovi, Nina Radoji i, Miroslav Mijajlovi, Aleksandar Ðeni, Jasmina Dragoljevi i Svetislav Mili evi. Ovde im se jo² jednom zahvaljujem kao i svim drugim studentima ija su me pitanja dodatno motivisala da napi²em ovaj tekst. Posebno se zahvaljujem Milanu Bankovi u ije su formulacije zadataka ponovo uklju ene i u ova alternativna re²enja. Pozivam studente da mi i dalje ²alju svoja re²enja, komentare, ideje i sugestije povodom ovih ili drugih zadataka na email adresu djordjes@matf.bg.ac.yu. Veb strana predmeta je http://www.matf.bg.ac.yu/~djordjes/p2/ i tu moºete pratiti pojavljivanje novih korisnih materijala, linkova, vesti i svega ostalog vezanog za Programiranje 2. 1 Skupovi Zadatak je implementirati skupovne operacije. Skupovi se predstavljaju rastu im nizovima celih brojeva, pri emu u nizovima nema ponovljenih elemenata (kao ²to i u skupu nema ponavljanja elemenata). Sortiranost nizova kojima se skupovi predstavljaju omogu ava veoma ekasno implementiranje operacija nad skupovima (preseka, unije i razlike). Napisati dole navedene funkcije, kao i funkciju main() koja ih testira. 1.1 make_set() Napisati funkciju: int make_set (int a[], int n); koja od datog niza celih brojeva formira skup, u smislu gornjeg opisa. Drugim re ima funkcija treba da sortira niz u rastu em poretku i da zatim elimini²e eventualne duplikate. Funkcija vra a novu duºinu niza nakon otklanjanja eventualnih duplikata (drugim re ima, funkcija vra a kardinalnost skupa). 1

1.1.1 re²enja Primetimo da se proces pravljenja skupa moºe podeliti na dva koraka. Prvo se sortira niz u rastu em poretku, a potom se izbace svi vi²etruki elementi pri emu se smanjuje i dimenzija niza. Korak sortiranja niza je ražen na prethodnom dvo asu praktikuma, takože razni algoritmi sortiranja su raženi i na veºbama, predavanjima, pa se na tome ovde ne bih posebno zadrºavao. Drugi korak u kom se izbacuju vi²estruki elementi je ono ²to je su²tinski novo u ovom zadatku. Sortiranje je najbolje uraditi preko quick_sort() funkcije kako je uraženo u pokaznom re²enju. Mežutim ako su studentima, pogodniji mogu se koristiti i ostali algoritmi za sortiranje. Oni se mogu izdvojiti u posebne funkcije ili pak integrisati unutar funkcije make_set(). int make_set(int a[],int n) int i, j; /* Brojaci u petljama. */ int pom; /* Pomocna promenljiva. */ int p; /* Dimenzija skupa. */ int zam; /* Da li se vrsi zamena pri sortiranju. */ /* Sortiranje unetog niza, ovde je kod za sortiranje integrisan * unutar funkcije. Koriscen je algoritam bubble sort */ for(zam=1, i=n-1; zam && (i>0); i--) for(zam=0, j=0; j<i; j++) if (a[j+1]<a[j]) pom=a[j]; a[j]=a[j+1]; a[j+1]=pom; zam=1; /* Po zelji se moze ispisati kako izgleda niz posle * sortiranja. Ovo moze da posluzi i za proveru da li program * do ovog mesta radi dobro. */ printf("sortirani niz je:\n"); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); /* Drugi korak je izbacivanje visetrukih elemenata. * Postavimo da je nova dimenzija niza/skupa jednaka * staroj i onda je kasnije po potrebi smanjujemo. */ p=n; /* U spoljasnjoj for petlji prolazimo kroz sortiran niz a * i posmatramo da li je sledeci element jednak prethodnom, * ako jeste onda mozemo premestiti ceo niz za jedno mesto 2

* ulevo izbacujuci taj ponovljeni element. */ for(i=0; i<p-1; i++) if (a[i+1]==a[i]) for(j=i+1; j<p-1; j++) a[j]=a[j+1]; p--; /* Potrebno je smanjiti dimenziju niza. */ i--; /* Ako se pojavljuju vise od dva ista * elementa uzastopno, onda je potrebno * smanjiti i za 1, da bi ponovo proveravao * da li je tekuci a[i] jednak sa sledecim * clanom niza. Ovde se i smanji za jedan, * a pri ponovnom prolasku kroz sledeci ciklus * uveca za 1, tako da ostaje na istom. */ /* Na kraju funkcije se vraca nova dimenzija niza, * tj. broj elemenata skupa. */ return p; to se ti e sortiranja, spomenuli smo da se ono moºe izdvojiti u posebnu funkciju. Npr. ako se odlu imo za selection sort, to bi moglo da izgleda ovako: void selection_sort(int a[], int n) int i, j; /* Brojaci. */ int p; /* Pomocna promenljiva. */ for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) if(a[i]>a[j]) p=a[i]; a[i]=a[j]; a[j]=p; U tom slu aju se skra uje kôd same funkcije make_set(). Modularni pristup je da se sve ²to ini smislenu celinu, koja se moºe posebno koristiti, izdvoji u posebnu funkciju i taj pristup se preporu uje studentima prilikom re²avanja programerskih zadataka. Obratimo sada paºnju na preostali kôd, drugi korak - izbacivanje ponovljenih elemenata. Pre svega moºemo uo iti da je stalno pomeranje niza za jedno mesto ulevo veoma neoptimalno, jer moºe potencijalno imati veoma veliki broj lanova niza i veliki broj ponovljenih elemenata. Ovo izbegavanje da se vr²e nepotrebna pomeranja uradilo je nekoliko studenata, manje ili vise optimalno. Mežutim ja u ovde prezentovati svoje re²enje koje je jo² jednostavnije i lak²e za razumevanje. 3

int make_set(int a[],int n) int i, j; /* Brojaci. */ /* Prvo pozovemo funkciju koja sortira niz rastuce. */ selection_sort(a,n); /* Za rezultujuci niz/skup koristimo brojac j. * a[0] se ne menja, mozemo od j=1 racunati ostale clanove. */ j=1; /* Brojac i sluzi za prolazak kroz sortirani niz a. */ for(i=1; i<n; i++) if (a[i]!=a[i-1]) /* Ako je naisao na nov element... */ a[j]=a[i]; /*... pamti ga i uvecava brojac za 1. */ /* Na kraju j sadrzi novu dimenziju niza, tj. broj elemenata skupa. */ return j; U ovom predloºenom re²enju nema nepotrebnih preme²tanja lanova niza. Takože nema suvi²nih promenljivih. Dalje, redovi a[j]=a[i]; mogu da se saºmu u jedan red a[j++]=a[i];. U tom slu aju ne trebaju ni viti aste zagrade oko tog jednog reda unutar if. Dobro je zapamtiti ovaj algoritam izbacivanja ponovljenih elemenata nekog niza jer se moºe primenjivati u raznim sli nim situacijama. 1.2 belongs_to() Napisati funkciju: int belongs_to (int a[], int n, int e); koja odrežuje da li element e pripada skupu koji je dat nizom a duºine n. Funkcija vra a logi ku vrednost (0 ili 1). Uputstvo: Obzirom da se skup predstavlja rastu im nizom, najekasnije je gornju funkciju implementirati kao binarnu pretragu. 1.2.1 re²enja Predloºeno je da se zadatak re²ava binarnom pretragom. Binarna pretraga ima standardni uobi ajeni pristup - polovljenje intervala. Ova ideja ima ²iroku primenu na razne klase problema i dobro je kad god je to mogu e primenjivati ovakve algoritme koji su brzi i ekasni. Zadatak se naravno mogao re²iti i pe²a ki - jednom for petljom u kojoj bismo od po etka do kraja uporeživali da li je element e jednak teku em. Mežutim onda ne bismo iskoristili vaºnu osobinu tog niza - da je sortiran rastu e. Preciznije re eno mi smo se opredelili 4

da skup realizujemo preko sortiranog niza da bismo mogli da koristimo ovakve optimalne algoritme za rad. Binarna pretraga je mnogo brºa od linearne pretrage, npr. da bismo pregledali niz od 1024 elementa linearnom pretragom potrebno je 1024 uporeživanja, dok je binarnom pretragom potrebno svega 10 jer je 2 10 = 1024. U nekim slu ajevima studenti su u re²avanju pozivali funkciju make_set(). To nije potrebno ako sve vreme vodimo ra una o tome da se kao argument predaje skup tj. niz sortiran rastuce bez ponovljenih elemenata. Binarna pretraga se moºe realizovati preko while petlje kao u pokaznom re²enju ili rekurzivno (o rekurzijama vi²e u drugom delu ovog teksta). int belongs_to(int a[], int n, int e) int l = 0, d = n - 1; /* Leva i desna granica. */ int s; /* "Sredina" intervala. */ /* Binarna pretraga. */ while (l <= d) s = (l + d) / 2; /* Celobrojnim deljenjem sa 2 dobijamo s. */ if (e==a[s]) return 1; /* Ako pripada skupu. */ if (e < a[s]) d = s - 1; /* Trazimo dalje u prvoj polovini. */ l = s + 1; /* Trazimo dalje u drugoj polovini. */ /* Ako nije pronadjen vracamo 0. */ return 0; Mežutim binarna pretraga se moºe realizovati i rekurzivno. Takože binarna pretraga moºe da nam donese i informaciju na kojoj se ta no poziciji nalazi traºeni element, ²to je takože korisno u mnogim primenama. Iz tog razloga moºemo sam algoritam binarne pretrage izdvojiti u posebnu funkciju, a potom je pozvati u na²oj funkciji belongs_to(). /* U nizu a trazimo element x, pocev od pozicije * l do pozicije d. Funkcija vraca indeks elementa * niza a koji je jednak x, odnosno -1 ako takav * element ne postoji. */ int bsearch(int a[], int x, int l, int d) int s=(l+d)/2; /* sredina intervala */ 5

if (l>d) return -1; if (a[s]==x) return s; if (a[s]>x) return bsearch(a,x,l,s-1); return bsearch(a,x,s+1,d); int belongs_to (int a[], int n, int e) if (bsearch(a, e, 0, n-1) >= 0) return 1; return 0; Primetimo da se ova funkcija moºe kra e zapisati i ovako: int belongs_to(int a[], int n, int e) return (bsearch(a, e, 0, n-1)>=0); 1.3 make_union() Napisati funkciju: int make_union(int a[], int n_a, int b[], int n_b, int c[]); koja odrežuje uniju skupova datih nizovima a i b ( ije su duºine redom n_a i n_b) i rezultat sme²ta u niz c. Funkcija vra a duºinu niza c (odnosno, kardinalnost skupa c). 1.3.1 re²enja Unija dva skupa koji su zadati kao rastu i nizovi moºe se odrediti na vi²e na ina. Ideja koja odmah pada na pamet jeste da iskoristimo do sada uražene funkcije i time smanjimo programski kôd. Npr. moºemo nadovezati jedan niz na drugi, dimenzija e mu biti jednaka zbiru dimenzija polaznih nizova. Onda taj niz moºemo predati funkciji make_set() i to je sve. Ta funkcija e izvr²iti sortiranje, izbaciti ponovljene elemente i vratiti novu duºinu niza. U C jeziku bi to moglo izgledati ovako (Svetislav Mili evi ): int make_union (int a[], int n_a, int b[], int n_b, int c[]) int i; for(i=0;i<n_a;i++) c[i]=a[i]; for(i=0;i<n_b;i++) c[n_a+i]=b[i]; 6

return make_set(c,n_a+n_b); Moºe se postaviti pitanje kada imamo ovako kratko i razumljivo re²enje emu onda potreba za drugim, verovatno duºim i teºe razumljivijim re²enjima. Radi se o tome da mi nismo iskoristili nigde osobinu da su nizovi sortirani nego ih samo nadoveºemo i ponovo sortiramo ceo niz. Sortiranje nizova je relativno skupa operacija i treba je izbegavati ako je to mogu e, kao ²to je ovde slu aj. Problem kako od dva niza koji su sortirani rastu e spajanjem dobiti jedan niz sortiran rastu e je problem koji se esto sre e na ispitima iz Programiranja. Naravno u raznim varijantama i oblicima koji su u su²tini svode na to. Dobro je nau iti taj algoritam i razumeti ga kako radi, on je sadrºan u prvom delu ove funkcije: int make_union (int a[], int n_a, int b[], int n_b, int c[]) int i, j; /* Brojaci. */ int n_c = n_a + n_b; /* Duzina niza c. */ /* U ovoj for petlji se vrsi formiranje rastuceg * niza c koji se sastoji od elemenata nizova a i b * koji su uredjeni rastuce. Indeks i sluzi za kretanje * po nizu a, j po nizu b. for(i=0, j=0; (i+j)<=n_c;) /* U niz c upisujemo element iz niza a ako vazi... */ if ((a[i]<b[j] && i!=n_a) j==nb) c[i+j]=a[i]; i++; /* U suprotnom upisujemo sledeci element iz niza b. */ c[i+j]=b[j]; /* U ovoj tacki vidimo da smo dobili sortiran niz c * samo jednim linearnim prolaskom, za razliku * od pravog sortiranja koje ima znatno vecu slozenost. */ /* Sada izbacimo ponovljene elemente vec vidjenim postupkom. */ /* Za rezultujuci niz/skup koristimo brojac j. * c[0] se ne menja, mozemo od j=1 racunati ostale clanove. */ j=1; 7

/* Brojac i sluzi za prolazak kroz sortirani niz a. */ for(i=1; i<n_c; i++) if (c[i]!=c[i-1]) /* Ako je naisao na nov element... */ c[j]=c[i]; /*... pamti ga i uvecava brojac za 1. */ /* Na kraju j sadrzi novu dimenziju niza, tj. broj elemenata skupa. */ return j; Na ovom mestu primetimo kako moºemo kombinovati poznata optimalna re²enja i algoritme koji obavljaju neki deo posla. Iz tog razloga dobro ih je nau iti ²to ve i broj i nau iti ih primenjivati pri izradi zadataka. Radi kompletnosti ovde moºemo navesti i zvani no re²enje (Milan Bankovi ) u kojem je kori² en ne²to druga iji pristup: int make_union (int a[], int n_a, int b[], int n_b, int c[]) int i = 0, j = 0, k = 0; /* sve dok postoje neobradjeni elementi u oba skupa */ while (i < n_a && j < n_b) /* ako je tekuci element skupa A manji od * tekuceg elementa skupa B... */ if (a[i] < b[j]) c[k++] = a[i++]; /* ubacujemo ga u uniju */ /* i prelazimo na naredni element skupa A */ /* ako je tekuci element skupa B manji od * tekuceg elementa skupa A... */ if (b[j] < a[i]) c[k++] = b[j++]; /* ubacujemo ga u uniju */ /* i prelazimo na naredni element skupa B */ /* ako su tekuci elementi skupova A i B jednaki */ c[k++] = a[i]; /* ubacujemo element u uniju */ i++; /* prelazimo na naredne elemente */ /* u oba skupa */ 8

/* Donje dve petlje sluze da pokupe preostale * elemente jednog od skupova, kada su elementi * drugog skupa potpuno iscrpljeni. Izvrsavace * se tacno jedna od ove dve petlje */ while (i < n_a) c[k++] = a[i++]; while (j < n_b) c[k++] = b[j++]; /* vracamo broj elemenata skupa */ return k; Po svojoj lepoti izdvaja se jo² jedno re²enje (Nina Radoji i ) koje takože donosimo u izvornom obliku: int make_union (int a[], int n_a, int b[], int n_b, int c[]) int i,j,k; for (i=0,j=0,k=0; i<n_a j<n_b;) while(a[i]<b[j]) c[k++]=a[i++]; while(a[i]>b[j]) c[k++]=b[j++]; if (a[i]==b[j]) c[k++]=a[i]; i++; return k; 1.4 make_intersection() Napisati funkciju: int make_intersection (int a[], int n_a, int b[], int n_b, int c[]); koja odrežuje presek skupova datih nizovima a i b ( ije su duºine redom n_a i n_b) i rezultat sme²ta u niz c. Funkcija vra a duºinu niza c (odnosno, kardinalnost skupa c). 1.4.1 re²enja Kada ra unamo presek dva skupa tj. zajedni ke elemente dva niza koji su sortirani rastu e, onda je neka op²ta ideja da se krene od po etka oba niza i 9

preska u svi elementi koji se ne javljaju u onom drugom (bilo da su ve i ili da su manji). Osim pokaznog re²enja koje ovde ne e biti ponovo navoženo ima i drugih na ina uglavnom sli nih. Nave² emo dva studentska re²enja. Sli no kao za ra unanje preseka slede e re²enje se odlikuje simetrijom i skladom (Nina Radoji i ): int make_intersection (int a[], int n_a, int b[], int n_b, int c[]) int i,j,k; for (i=0,j=0, k=0; i<n_a && j<n_b; ) if(a[i]>b[j]) if(a[i]<b[j]) i++; c[k++]=a[i]; i++; return k; Slede e re²enje je donekle sli no ovome, samo ²to je bazirano na while petljama (Ivan Pavlovi ). int make_intersection(int a[], int n_a, int b[], int n_b, int c[]) int i,j,k; i=j=k=0; while((i<n_a) (j<n_b)) while(((a[i]<b[j]) (j>=n_b))&&(i<n_a)) i++; if (a[i] == b[j]) c[k++] = a[i++]; while(((a[i]>b[j]) (i>=n_a))&&(j<n_b)) return k; 10

Detaljni komentari kôda ovde nisu dodavani, zbog sli nosti sa ranijim zadacima pretpostavlja se da studenti mogu razumeti ²ta svaka linija ovog koda radi. 1.5 make_substraction() Napisati funkciju: int make_substraction(int a[], int n_a, int b[], int n_b, int c[]); koja odrežuje razliku skupova datih nizovima a i b ( ije su duºine redom n_a i n_b) i rezultat sme²ta u niz c. Funkcija vra a duºinu niza c (odnosno, kardinalnost skupa c). 1.5.1 re²enja Razlika skupova je prva nesimetri na operacija sa skupovima. Kod unije i preseka nije bio bitan redosled navoženja dok ovde jeste. Razliku skupova a i b ine svi oni elementi skupa a koji se ne nalaze u skupu b. Samim tim prirodno se name e jedno mogu e re²enje, da prožemo kroz skup a i za svaki njegov element proverimo da li je u b i, ako nije, onda ga pamtimo u rezultuju em skupu c. int make_substraction(int a[], int n_a, int b[], int n_b, int c[]) int i, j=0; for(i=0; i<n_a; i++) /* Ako a[i] ne pripada skupu b pamtimo ga u c. */ if (!belongs_to(b,n_b,a[i])) c[j++]=a[i]; return j; Mežutim ovo re²enje nije optimalno jer se za svaki element skupa a vr²i binarna pretraga niza b. Binarna pretraga jeste optimalna ako traºimo jedan element u sortiranom nizu, mežutim kada za niz sortiranih elemenata treba da utvrdimo da li se pojavljuju u nekom sortiranom nizu onda nije optimalno da za svakog od njih pozivamo binarnu pretragu, nego treba iskoristiti osobinu da su sortirani. Na tome se zasniva i zvani no pokazno re²enje kao i slede e re²enje (Nina Radoji i ): int make_substraction (int a[], int n_a, int b[], int n_b, int c[]) int i,j,k; for (i=0, j=0, k=0; i<n_a; ) 11

if(a[i]>=b[j]) if(a[i]<b[j]) c[k++]=a[i++]; return k; 1.6 Ceo program Ovim se spisak pripremljenih raznovrsnih re²enja zavr²ava. Ostaje jo² da se napi²e main() funkcija u kojoj treba testirati sve ove prethodno navedene funkcije. U toj main() funkciji potrebno je u itati neki niz brojeva, zatim pozivati navedene funkcije i od²tampati na standardni izlaz rezultate. To su uobi ajene stvari koje se nalaze i u zvani nom pokaznom re²enju pa ne e ponovo biti navožene. Za svaku od funkcija videli smo po vi²e re²enja, po²to ima pet funkcija to ukupno zna i jako veliki broj razli itih mogu ih programa. Prilikom programiranja potrebno je izabrati neka od optimalnijih re²enja koja su nam potpuno jasna. Nije poºeljno u iti gotova re²enja napamet bez razumevanja, nego treba nastojati da se napisani kod u potpunosti razume. 12