programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · programiranje 2 - 6 d. vitas...

24
1 Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa na drugi 2. nije dozvoljeno postaviti veći disk na manji CILJ Preneti diskove sa štapa a na štap b koristeći pomoćni štap c Hanojske kule PRIMER (3 diska) KORACI a-b a-c b-c a-b c-a c-b a-b

Upload: others

Post on 02-Jan-2020

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

1

Programiranje 2 - 6

D. Vitas

Hanojske kule

PRAVILA (elementarne operacije)1. premeštanje diska sa jednog štaoa na drugi 2. nije dozvoljeno postaviti veći disk na manji

CILJPreneti diskove sa štapa a na štap b koristeći pomoćni štap c

Hanojske kulePRIMER (3 diska)

KORACI a-b a-c b-c a-b c-a c-b a-b

Page 2: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

2

Hanojske kuleSpecifikacija

Izračunati funkciju H(n, x, y, z) koja opisuje korake u prenosu ndiskova sa x na y koristeći pomoćni štap z (n≥1).

Opis funkcijex-y ako n = 1

H(n, x, y, z) = H(n-1, x, z, y) ; x-y ; H(n-1, z, y, x) si n > 1

Algoritam (n ≥ 1)funkcija H(n, x, y, z) ;početak

ako n = 1 onda ispis(x-y) ;inače { H(n-1, x, z, y); ispis(x-y); H(n-1, z, y, x); }

kraj.

Hanojske kuleIzvršavanje

H (3, a, b, c)

H (2, a, c, b) a - b H (2, c, b, a)

H (1, a, b, c) a - c H (1, b, c, a) H (1, c, a, b) c - b H (1, a, b, c)

a - b b - c c - a a - b

Vreme izvršavanja

T(H, n diskova) = O(2n)H je optimalan (među algoritmima koji poštuju pravila)

Implementacija/* primer47.c - Hanojske kule */#include <stdio.h>void hanoj( int, int, int );main(){

hanoj( 3, 1, 2 ); }void hanoj( int n, int i, int j ) {

printf("n = %d i = %d j = %d :\n ", n, i, j );if( n > 0 ) {

hanoj( n-1, i, 6-(i+j)); // H( n-1, x, z, y )printf("%d --> %d\n", i, j ); // x --> yhanoj( n-1, 6-(i+j), j ); } // H( n-1, z, y, x )

}

Page 3: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

3

Izvršavanje

Izvršavanje za n = 3

void hanoj( int n, int i, int j ) {printf("n = %d i = %d j = %d :\n ", n, i, j );

if( n > 0 ) {hanoj( n-1, i, 6-(i+j)); // H( n-1, x, z, y )printf("%d --> %d\n", i, j ); // x --> yhanoj( n-1, 6-(i+j), j ); } // H( n-1, z, y, x )

}

hanoj( 3, 1, 2 )

Igra brojevima

celi > 0Dato: w1, w2, …, wns

Rezultat: podskup I od (1, 2, …, n) takav da ∑ wi = s∅ inače i∈I

Algoritamfunkcija CIFRE (t, i) ;/ * dobija vrednost tacno akko postoji podskup od (i, i+1, ..., n)

takav da je zbir njegovih elemenata t ; ispisuje odgovarajuće brojeve*/

početakako (t = 0 ) tada vrati ( tačno)inače ako ( t < 0 ) ili ( i > n ) tada vrati ( netačno)inače ako CIFRE( t - wi, i+1) tada { ispis(wi ) ; vrati( tačno) ; }inače vrati (CIFRE( t, i+1) ) ;

kraj

Implementacijaint w[] = { 2, 9, 10, 7};int S = 19;int n = 4;main() {

cifre( S, 0 );}int cifre( int t, int i ) {

if( t == 0 ) return 1;else if( ( t < 0 ) || ( i > n ) ) return 0;else if( cifre( t-w[i], i+1 ) )

{ printf("%d ", w[i] ); return 1; }else return cifre( t, i + 1 );

}

Page 4: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

4

IzvršavanjeNeka w1 = 2, w2 = 9, w3 = 10, w4 = 7 i s = 19

t i19 1

17 28 3

-2 4 netačno8 4

1 5 netačnonetačno

17 37 4

0 5 tačno--> w4 = 7 tačno

--> w3 = 10 tačnotačno

--> w1 = 2 tačno

int cifre( int t, int i ) {

if( t == 0 ) return 1;else if( ( t < 0 ) || ( i > n ) )

return 0;else if( cifre( t-w[i], i+1 ) )

{ printf("%d ", w[i] ); return 1; }

else return cifre( t, i + 1 );

primer48.c

s = 19 int w[] = { 2, 9, 10, 7};

Složenost

Vremenska složenost = O(2n)

Dokaz: dokazje se da ako je s > ∑ wi

algoritam obiđe sve podskupove skupa

(1, 2, …, n), a njih je 2n.

Zadatak. Sastavi program koji razmenjuje novčanicu od 1000 dinara na sve moguće načine.

Page 5: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

5

Analiza vremenaKod rekurzivne funkcije, za vreme se dobija rekurentna

veza iz koje se izračunava vreme izvršavanja. Primer (MNO3 ~ m):

Označimo sa Q telo funkcije m (MNO3). Tada za bilo koji poziv m( u, v, t ) imamo:

Tm(u,v,t) (w) = TQ(w,x,y,r) + Tx,y,r/u,v,t

w - vrednosti programa pre pozova m

vreme izvršavanja tela Q prenos parametara

Primerako je y = 0 --> TQ = T y = 0 + T r = 0

y = 2n, n>= 1 --> TQ = T y = 0 + T par + Tm(2*x, y/2)

y = 2n+1, n> 0 --> TQ = T y = 0 + T par + T r=r+x + Tm(2*x, y/2)

Odavde ⎧ k1, y = 0 TQ (y) = ⎨ TQ(n)+k2, y = 2n parno

⎩ TQ(n)+k3, y = 2n+1

---> TQ (y) ~ log y

Konstrukcija rekurzivnih funkcija

Page 6: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

6

PrincipiRešenje problema P se zasniva na

a. direktnom rešenju problema P u nekom posebnom slučaju

b. na izboru dekompozicija problema P na podprobleme iste prirode kaoi P, ali takve da uzastopne dekompozicije vode ka rešenju a.

Struktura

Rekurzivna funkcija mora tada da sadrži:

a. iskaze koji direktno rešavaju poseban slučajb. iskaze koji vrše dekompoziciju na podprobleme

i rešavaju problem u funkciji rešenja podproblema

c. rekurzivne pozive koji rešavaju same podprobleme

PrimeriPrimer 1. Program MNO3 izračunava x*y (a) direktno za y = 0 ili svodi problem na podproblem (b) m( 2*x, y/2 )

Primer 2. Izračunavanje n! ima (a) direktno rešenje za n= 0 ili se svodi na rešenje (b) podproblema izračunavanja (n-1)!

Izračunavanje se završava ako niz dekompozicija konvergira ka rešenju pod (a).

Page 7: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

7

Principi dekomponovanjaPostoji više dekompozicija jednog problema.

Dimenzija problema - ne sme zavisiti od dekompozicije

Npr. dužina problema sortiranja niza je izražena brojem elemenata koje treba sortirati

Principi dekomponovanjaNeka je dat problem P dužine n. Možemo birati

između dve dekompozicije: (a) ako je n > 1, rešiti problem dimenzije n-1Primer. n!

T(n) = T(n-1) + f(n), T(1) = k

(b) ako je n > 1, rešiti problem dimenzije n/2 Primer. MNO3

T(n) = T(n/2) + f(n), T(1) = k logaritamska redukcija

Specijalni slučajNeka je dat problem P dužine n. (a) ako je n > 1, rešiti problem dimenzije n-1. Neka je f(n) = n. Tada

T(n) = T(n-1) + n = k+2 + 3 + n ~ n2

(b) ako je n > 1, rešiti dva podproblema dimenzije n/2 i neka je n=2k

Tada: T(n) = 2*T(n/2) + n ---> T(2k) = c*2kT+ k* 2k

---> T(n) ~ n log n

Page 8: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

8

Primer 1Zadatak. Crtanje figure. Potrebno je iscrtati mustru

(n = 2):

Uslovi• Crta se na listu proizvoljne dužine i pomoću

olovke koja ima samo dve operacije:– place(x,y) - pozicioniranje pera u tačku sa

koordinatama (x,y)– trace(x,y) - crta duž koja povezuje tekuću

poziciju pera sa tačkom (x,y)• Crtanje mustre je problem Pn (na prethodnom

slajdu: P2)

Uslovi• Za n > 1, crtež se može razložiti na probleme P1 i Pn-1.

Dekompozicija se može izvršiti na više načina, npr. prema tome da li je P1 najveći ili najmanji kvadrat.

• Metoda iscrtavanja: – bez podizanja pera – bez prelaska preko iste linije dva puta.

Odavde: • Pero se vraća u polaznu tačku Pn (n>1)

• Polazna tačka: ista pozicija za svako Pn (inače bi se morala pamtiti pozicija polazne tačke)

• Početna i završna tačka za Pn-1 je tačka na P1. (Neka to bude donji levi ugao)

Page 9: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

9

Postupak• Nacrtati deo od P1 koji povezuje polaznu tačku P1 sa

polaznom tačkom na Pn-1.

P1 : dužina strane Ä

• Nacrtati Pn-1.• Dovršiti iscrtavanje P1.

Rešenje... place( x, y ); crtaj(x, y, l, n); ... primer50.c

primer50.exevoid crtaj( int x, int y, int l, int n ) {

if( n > 0 ) {trace(x+l/2, y);trace(x+l/4, y-l/4);crtaj( x+l/4, y-l/4, l/2, n-1 );trace(x, y-l/2);trace(x+l/2, y-l);trace(x+l, y-l/2);trace(x+l/2, y);trace(x+l, y);trace(x+l, y-l);trace(x, y-l);trace(x, y); } }

Složenostn > 0 D(l, n) = 4*l + 2*l*sqrt(2) + D(l/2, n-1 )

n = 0 D(l, 0) = 0

---> D(l, n) = (4*l + 2*l*sqrt(2))*(1 + 1/2 + 1/4 + ...)= 4*l*(2 + sqrt(2)) *(1 - 1/2n)

D(l, n) --> 4*l*(2 + sqrt(2)); n ---> ∞

Page 10: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

10

Primer 2Data je figura.

Nacrtati je.

h

d

d

trougao1/* parametre preneti po referenci */void trougao1( float x, float y, float d, float h ) {if( y + d < h ) {

trace( x - d, y + d ); trougao1( x - d, y + d, d, h ); trace( x + d, y + d ); trougao1( x + d, y + d, d, h ); trace( x, y );

} primer51.c primer51.exe

Vreme

T trogao1(y, d, h ) = 3* (2*k-1 - 1 )

eksponencijalno vreme jer se svi trouglovi sa čvorom (x, y + 2*d) crtaju bar dva puta...

Može li bolje?

Page 11: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

11

trougao2void strana( float x, float y, float d, float h ) {if( y + d < h ) {

trace( x - d, y + d ); trace( x + d, y + d ); trougao1( x + d, y + d, d, h ); trace( x, y );

}

trougao2void trogao2( float x, float y, float d, float h ) {if( y + d < h ) {

trace( x - d, y + d ); trougao2( x - d, y + d, d, h ); trace( x + d, y + d, d, h ); strana( x + d, y + d, d, h ); trace( x, y );

} T trogao2(y, d, h ) = 3/2*(k+1)*(k+2) primer52.exe

Brzo sortiranje (quicksort)... se duguje C. A. R. Hoare. Ideja je sledeća:

Particija sastožerom = 3 32 4 1 7 2 3 6

32 2 1 7 4 3 6

< 3 ≥ 3

Page 12: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

12

quicksortI dalje:

32 2 1 3 4 7 6

< 3 ≥ 3

31 2 2 3 4 6 7

Sort Sort

Rekurzivna definicijaDat je niz A (1 ≤ n ≤ N) celih brojeva koje treba urediti u

rastućem poretku. neka A(i:j) označava podniz takav da 1 ≤ i ≤ j ≤ N. Problem sortiranaj se svodi na problem oblika:

Pinf, sup: Sortiraj A( inf:sup )Dekompozicija je sledeća: P1: ako inf ≥ sup, tada je A( inf:sup ) ili sortiran, ili prazanPinf, sup: ako inf < sup, premeštamo elemente podniza

A(inf:sup) sve dok ne odredimo i: inf ≤ i ≤ sup takvo da A(l) ≤ A(i) za inf ≤ l ≤ i ...(*)A(i) ≤ A(m) za i ≤ m ≤ sup

ParticijaOznačimo sa k vrednost A(i) koje zadovoljava (*).

Tada:

Podela A u odnosu na i naziva se particija niza.Problem Pinf, sup se rastavlja na podprobleme Pinf, i-1 i Pi+1, sup što daje rekurzivnu definiciju...

< k stožer k ≥ k

Page 13: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

13

Implementacijaprimer54.c

void quicksort( int inf, int sup ) {if( inf < sup ) {

int i;i = particija( inf, sup);qs( inf, i - 1 );qs( i + 1, sup );}

}

Konstrukcija particijeFunkcija particija se primenjuje na podniz A(inf:sup) uz

uslov da je inf < sup.

Ovaj uslov zadovoljava bilo koja vrednost k koja se javlja u A(inf:sup), pa je možemo proizvoljno izabrati neko k pre nego što počne podela na particije. Vrednost k nazivamo stožer (pivot, centar) particioniranja. Npr. k =A[inf].

< k stožer k ≥ k

particijaInvarijanta petlje u particiji se može prikazati kao

(slično problemu trobojke): < k

stožer k≥ k

l m

Page 14: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

14

Implementacijaint particija( int inf, int sup ) {

int l, k, m;l = inf + 1; m = sup; k = A[inf]; //Stozer

while( l <= m) {if( A[l] <= k ) l = l + 1;else { /* A[l] > k */while( A[m] > k ) m = m - 1; /* A[m] <= k */if( l < m ) {

swap( &A[l], &A[m] );m = m - 1; l = l + 1;}

} } primer54.c primer54.exe

VremeT (particija (inf, sup, p)) = Θ (sup - inf + 1) (inf < sup)

ΤMAX(qs (1, n)) = O (n²)

Primer: sortirani niz i izbori stožera p redom 1, 2, …, n - 1

ΤAVG(qs (1, n)) = O (n log n)(t [1], …, t [n] ) = ( 1, 2, …, n )

(sve permutacije od t [1], …, t [n] imaju jednaku verovatnoću)

Implementacijavoid qs( int A[], int inf, int sup ) { // primer56.c

int i, j, tempr;/* Particija */while ( sup > inf ) { i = inf; j = sup; tempr = A[inf];/*** Podeli niz u dva ***/

while ( i < j ) {for ( ; A[j] > tempr; j-- );for ( A[i]=A[j]; i<j && A[i]<=tempr; i++ );A[j] = A[i]; }

A[i] = tempr;/*** Sort rekurzivni, najmanji prvo ***/

if ( i-inf < sup-i ) { qs(A,inf,i-1); inf = i+1; }else { qs(A,i+1,sup); sup = i-1; }

}}

Page 15: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

15

Bibliotečki qsort Sortira <num> elemenata dužine <with> bajtova počev od

adrese <base>, a koristeći u poređenju funkciju na koju pokazuje (*compare) (korisnička funkcija).

Prototip:void qsort(

void *base, // ime nizasize_t num, // br. elemenatasize_t width, // br. bajtovaint (*compare) ( // f. poređenja

void *elem1, void *elem2 ) ); primer56.c

Funkcije za poređenjeint icmp(void *p1, void * p2) // poredjenje int u rastucem poretku { return ( ( * (int *) p1) - ( * (int *) p2 ) ); }

int icmpd(void *p1, void * p2) // poredjenje int u opadajucem poretku { return ( ( * (int *) p2) - ( * (int *) p1 ) ); }

int scmp(void *p1, void * p2) /* poredjenje niski */{ return ( strcmp( (char *) p1, (char *) p2 ) ); }

int pscmp(void *p1, void * p2) // poredjenje niski preko pokazivaca /{ return ( strcmp( * (char **) p1, * (char **) p2 ) ); }

Drugi primeri cmpfuns.c

Primeri#include "cmpfuns.h" int a[10]; char sa[3][10]; // niz niskichar *ps[20]; // niz pokazivaca na karaktere......................................qsort( a, 10, sizeof( int ), icmp ); // rastuci poredakqsort( a, 10, sizeof( int ), icmpd ); // opadajuci poredakqsort( sa, 3, sizeof( sa[0] ), scmp ); // poredjenje niskiqsort( ps, 20, sizeof( char * ), pscmp ); // poredjenje niski

Page 16: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

16

Anagrami (Bentley)Anagrami = reči koje se sastoje od istih slova

Primer. vatra, vrata, trava,...

Zadatak. Sa standardnog ulaza se učitava tekst. Odrediti sve anagrame u tom tekstu.

PrimerTekst: To je trava a ono nije ni vatra ni vrata ...Vertikalizacija: Parovi: Anagrami: To To, To a, aje ej, je aartv, travatrava aartv, trava aartv, vatraa a, a aartv, vrataono oon, ono eeijn, nijenije eijn, nije ej, jeni in, ni in, nivatra aartv, vatra in, nini in, ni oon, onovrata artv, vrata To, To

sort sort

Rešenjesign - primena qsort-a unutar niske da bi se

dobio kanonski predstavniksort - primena qsort-a na niz kanonskih

predstavnikasquash - grupisanje različitih reči sa istim

kanonskim predstavnikom

sign <text | sort | squash > anagram

anagram1.c, anagram2.c

Page 17: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

17

Još jedan primerTekst: To je to a ovo nije ni to ni ovo ...Vertikalizacija: Frekvencije RečnikTo a 1 a 3 toje je 1 je 2 nito ni 2 ni 2 ovo a ni 1 aovo nije 1 nije 1 jenije ovo 2 ovo je nijeni ovoto To 3 toni toovo to

sort count sort

ZadatakPod medijanom niza od N elemenata

podrazumeva se element niza koji je manji od jedne polovine, a veći od druge polovine elemenata niza.

Primer. 16 12 99 95 18 87 10

N = 7 medijana = 18

Rešenja1. (trivijalno) sortirati niz, pa naći srednji element.2. particija 3. uopštenje: pronaći k-ti element po veličini u

nizu (bez sortiranja) - rečšenje FIND (Hoare)

Još jedan zadatak (bez qsort-a): Data su dva niza, F i G, celih brojeva. Pronaći bez

sortiranja najmanje rastojanje elemenata F i G: min( abs(F(i) - G(j)), po i i j

Page 18: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

18

Mergesort

Mergesort// MergeSort a table of integer of size count.// Never tested. void MergeSort(int *tab,int count) {

if (count==1) return; MergeSort(tab,count/2);MergeSort(tab+count/2,(count+1)/2); Mix(tab,tab+count/2,count/2,(count+1)/2); }

Mergesort// Mix two sorted tables in one and split the result into these two tables. int *Mix(int *tab1,int *tab2,int count1,int count2) {

int i,i1,i2; i = i1 = i2 = 0; int * temp = (int *)malloc(sizeof(int)*(count1+count2)); while((i1<count1) && (i2<count2)) {

while((i1<count1) && (*(tab1+i1)<=*(tab2+i2))) { *(temp+i++) = *(tab1+i1); i1++; }

if (i1<count1) { while((i2<count2) && (*(tab2+i2)<=*(tab1+i1)))

{ *(temp+i++) = *(tab2+i2); i2++; } }

}

Page 19: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

19

Mergesort

http://www.cse.iitk.ac.in/users/dsrkg/cs210/applets/sortingII/mergeSort/mergeSort.html

Binarno pretraživanjeDat je niz T(1:N) celih brojeva uređen u rastućem

poretku i dat je ceo broj k. Utvrditi da li postoji indeks i: 1 <= i <= N takav da

T(i) <= k < T(i+1)

Označimo ovaj problem sa P1,N. Rekurzivna dekompozicija se dobija rešavanjem podproblema Pinf,sup gde

0 ≤ inf - 1 ≤ sup ≤ N

Neka T[0] = - ∞ i T[N+1] = +∞

RešenjeAko inf ≤ sup, neka je l = [(inf+sup)/2]. Tada:

• Ako k < T[l], onda T[inf-1] ≤ k < T[l], pa treba rešiti Pinf,l-1.

• Ako k ≥ T[l], onda T[l] ≤ k < T[sup+1], pa treba rešiti Pl,sup+1.

• Ako inf > sup, tada inf - 1 = sup i rešenje je i = sup = inf - 1

Page 20: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

20

Implementacijaint bp( int inf, int sup, int k ){

if( inf > sup ) return sup;else { int l;

l = (inf + sup)/2;if( k < T[l] ) return bp( inf, l-1, k );else return bp( l+1, sup, k );}

} primer53.c

repna rekurzija

Razvoj rekurzivne funkcijeProblem Pn dekomponujemo na P1 i Pn-1

---> Primer. n!

Problem Pn dekomponujemo na P1 i Pn/2

---> Primer. bs

Problem Pn dekomponujemo na P1 i 2*Pn/2

---> Primer. qsort

I da ponovimo:• Rekurzivno izračunavanje se svodi na dekompoziciju u

kojoj bar jedna grana vodi konačnom rešenju (bez rekurzivnog poziva)

• Rekurzivni poziv je u obliku u kome se izračunavanje ponavlja, pa uvek postoji mogućnost da se isto izračunavanje izrazi iterativno

• U C-u je iterativni program treši manje vremena za izvršavanje i memorijskog prostora

• Rekurzivnost omogućava koncizan, precizan i jednostavan zapis kompleksnog problema

• Rekurzivnost je posebno korisna kod rekurzivnih struktura podataka...

Page 21: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

21

Dalje, alokacija memorije

zona teksta(tekst programa)

zona podataka(globalne promenljive)

zona steka(privremeni podaci, lokalne promenljive)

zona heap-a(dinamička memorija)

Klase alokacije

Dinamička alokacija... "zahvatanje" potrebnog memorisjkog prostora

sa heap-aNe postoje operatori u C-u, već se alokacija vrši

pozivom određenih funkcija iz biblioteke <stdlib.h>. Princip:

heap

p

• •• •heap

p dodeljeni prostor

Page 22: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

22

Funkcije• alokacija: calloc, malloc, realloc• oslobađanje: free

void * calloc( size_t nb, size_t t);

Poziv ove funkcije, ako je uspešan, vraća pokazivač na zonu niza od nb elemenata od kojih je svaki dužine t, a inače NULL (npr. nema prostora na heap-u). Zona je inicijalizovana na 0

Primerfloat *p; .................................../* p pokazuje na niz od 50 elemenata * tipa float */p = (float *) calloc( 50, sizeof( float )); for( i = 0; i < 50; i++ )

p[ i ] = ...

Funkcije(void *) malloc( size_t n )

... vraća pokazivač na zonu od n bajtova, a u slučaju neuspeha, NULL. Nema inicijalizacije.

(void *) realloc( void *p, size_t n ) ... modifikuje obim objekta na koji pokazuje pokazivač p

(kome je prostor dodeljen funkcijama malloc ili calloc) i vraća pokazivač na zonu od n elemenata, a u slučaju neuspeha, NULL.

Ako je za p bilo rezervisano t bajtova, realloc kopira inf(t,n) prvih bajtova iz p (sadržaj ostaje nepromenja). Novi prostor je neinicijalizovan.

Page 23: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

23

Funkcijevoid free( void *p)

... oslobađa memorijski prostor koji je zauzimao pokazivačp (kome je prostor dodeljen sa malloc ili calloc). Funkcija nema dejstvo ako je p = NULL.

Koristan makro:

#define zauzmi(nb, tip) (tip *) calloc( nb, sizeof( tip ) )

Primermain(){ char *niska= "Dobar dan"; // niska od 10 karaktera

char *pok; // pokazivac na lokaciju tipa char

/* Kopiranje preko pokazivaca mora da rezervise memorijsku * zonu od 10 karaketra za kopiranje */

pok = (char *) malloc( (strlen(niska) + 1 ));copy( pok, niska );printf("%s\n", pok );

}void copy( char *s, char *t ) { while( *s++ = *t++); }

primer23.c

Primer#include <stdio.h> <malloc.h> <stdlib.h> realloc.cint main() {

int *bufint; // Zona za cele brojevechar *bufchar; // Zona za karaktere printf( "Alociraj dva bafera od 512 objekata\n" );if( (bufint = (int *) calloc( 512, sizeof( int ) )) == NULL ) exit( 1 );printf( "Alocirano %d bajtova na %Fp\n", _msize( bufint ), bufint );

if( (bufchar = (char *) calloc( 512, sizeof( char ) )) == NULL ) exit( 1 );printf( "Alocirano %d bajtova na %Fp\n",

_msize( bufchar ), bufchar );

Page 24: Programiranje 2 - 6alas.matf.bg.ac.rs/~mv09014/vitas/prog2-06.pdf · Programiranje 2 - 6 D. Vitas Hanojske kule PRAVILA (elementarne operacije) 1. premeštanje diska sa jednog štaoa

24

Primer (nastavak) /* Prosirimo 2. bafer. Pokusaj da prvo realociramo prvi bafer nije

moguc jer je realokacija drugog bafera u toku. */if( (bufchar = (char *) _expand( bufchar, 1024 )) == NULL )

printf( "Nema ekspanzije" );else printf( "Prosiren 2. blok na %d bajtova na %Fp\n",

_msize( bufchar ), bufchar );/* Realociramo prvi bafer na 1024 objekta tipa int */ if( (bufint = (int *) realloc( bufint, 1024 * sizeof( int ) )) == NULL )

printf( "Nemoguca realokacija" );else printf( "1. blok realociran na %d bajtova %Fp\n",

_msize( bufint ), bufint );/* Oslobadjanje memorije */free( bufint ); free( bufchar );exit( 0 ); }

RezultatAlociraj dva bafera od 512 objekataAlocirano 2048 bajtova na 003D4818 // intAlocirano 512 bajtova na 003D2430 // char Prosiren 2. blok na 1024 bajtova na 3D50A0 // char1. blok realociran na 4096 bajtova 003D4818 // int