Složenost. Programiranje 2-1. Analiza programa. Vreme. Izračunavanje T. Prostor. D. Vitas

Σχετικά έγγραφα
EXIT. Programski jezik C - 6. deo. Funkcija exit. (materijal sa predavanja D. Vitasa)

3.1 Granična vrednost funkcije u tački

Osnovni primer. (Z, +,,, 0, 1) je komutativan prsten sa jedinicom: množenje je distributivno prema sabiranju

DISKRETNA MATEMATIKA - PREDAVANJE 7 - Jovanka Pantović

Teorijske osnove informatike 1

SISTEMI NELINEARNIH JEDNAČINA

Ispitivanje toka i skiciranje grafika funkcija

MATRICE I DETERMINANTE - formule i zadaci - (Matrice i determinante) 1 / 15

PID: Domen P je glavnoidealski [PID] akko svaki ideal u P je glavni (generisan jednim elementom; oblika ap := {ab b P }, za neko a P ).

IZVODI ZADACI ( IV deo) Rešenje: Najpre ćemo logaritmovati ovu jednakost sa ln ( to beše prirodni logaritam za osnovu e) a zatim ćemo

UNIVERZITET U NIŠU ELEKTRONSKI FAKULTET SIGNALI I SISTEMI. Zbirka zadataka

Elementi spektralne teorije matrica

a M a A. Može se pokazati da je supremum (ako postoji) jedinstven pa uvodimo oznaku sup A.

Operacije s matricama

Računarska grafika. Rasterizacija linije

Zavrxni ispit iz Matematiqke analize 1

Zadaci sa prethodnih prijemnih ispita iz matematike na Beogradskom univerzitetu

PRAVA. Prava je u prostoru određena jednom svojom tačkom i vektorom paralelnim sa tom pravom ( vektor paralelnosti).

IZVODI ZADACI (I deo)

IZRAČUNAVANJE POKAZATELJA NAČINA RADA NAČINA RADA (ISKORIŠĆENOSTI KAPACITETA, STEPENA OTVORENOSTI RADNIH MESTA I NIVOA ORGANIZOVANOSTI)

Osnovne teoreme diferencijalnog računa

Algoritmi i strukture podataka - 1.cas

41. Jednačine koje se svode na kvadratne

Računarska grafika. Rasterizacija linije

Sistemi veštačke inteligencije primer 1

Kontrolni zadatak (Tačka, prava, ravan, diedar, poliedar, ortogonalna projekcija), grupa A

numeričkih deskriptivnih mera.

APROKSIMACIJA FUNKCIJA

Strukture podataka i algoritmi 1. kolokvij 16. studenog Zadatak 1

M086 LA 1 M106 GRP. Tema: Baza vektorskog prostora. Koordinatni sustav. Norma. CSB nejednakost

4 Numeričko diferenciranje

KOMUTATIVNI I ASOCIJATIVNI GRUPOIDI. NEUTRALNI ELEMENT GRUPOIDA.

Univerzitet u Nišu Građevinsko-arhitektonski fakultet. Informatika2. 4. Ciklična algoritamska struktura 5. Jednodimenzionalno polje.

5. Karakteristične funkcije

SOPSTVENE VREDNOSTI I SOPSTVENI VEKTORI LINEARNOG OPERATORA I KVADRATNE MATRICE

Verovatnoća i Statistika I deo Teorija verovatnoće (zadaci) Beleške dr Bobana Marinkovića

Iskazna logika 3. Matematička logika u računarstvu. novembar 2012

PARCIJALNI IZVODI I DIFERENCIJALI. Sama definicija parcijalnog izvoda i diferencijala je malo teža, mi se njome ovde nećemo baviti a vi ćete je,

IspitivaƬe funkcija: 1. Oblast definisanosti funkcije (ili domen funkcije) D f

Sortiranje prebrajanjem (Counting sort) i Radix Sort

5 Ispitivanje funkcija

1. Pojam fazi skupa. 2. Pojam fazi skupa. 3. Funkcija pripadnosti, osobine i oblici. 4. Funkcija pripadnosti, osobine i oblici

ELEKTROTEHNIČKI ODJEL

Metode sortiranja nizova

MATEMATIKA 2. Grupa 1 Rexea zadataka. Prvi pismeni kolokvijum, Dragan ori

Klasifikacija blizu Kelerovih mnogostrukosti. konstantne holomorfne sekcione krivine. Kelerove. mnogostrukosti. blizu Kelerove.

1. zadatak , 3 Dakle, sva kompleksna re{ewa date jedna~ine su x 1 = x 2 = 1 (dvostruko re{ewe), x 3 = 1 + i

XI dvoqas veжbi dr Vladimir Balti. 4. Stabla

Glava 1. Realne funkcije realne promen ive. 1.1 Elementarne funkcije

IZVODI ZADACI (I deo)

2 tg x ctg x 1 = =, cos 2x Zbog četvrtog kvadranta rješenje je: 2 ctg x

Zadaci iz Osnova matematike

Apsolutno neprekidne raspodele Raspodele apsolutno neprekidnih sluqajnih promenljivih nazivaju se apsolutno neprekidnim raspodelama.

7 Algebarske jednadžbe

Konstruisati efikasan algoritam znači dati skup preciznih uputstava kako doći do rešenja zadatog problema Algoritmi se mogu opisivati:

Univerzitet u Nišu, Prirodno-matematički fakultet Prijemni ispit za upis OAS Matematika

Veleučilište u Rijeci Stručni studij sigurnosti na radu Akad. god. 2011/2012. Matematika. Monotonost i ekstremi. Katica Jurasić. Rijeka, 2011.

Program testirati pomoću podataka iz sledeće tabele:

DRUGI KOLOKVIJUM IZ MATEMATIKE 9x + 6y + z = 1 4x 2y + z = 1 x + 2y + 3z = 2. je neprekidna za a =

Cauchyjev teorem. Postoji više dokaza ovog teorema, a najjednostvniji je uz pomoć Greenove formule: dxdy. int C i Cauchy Riemannovih uvjeta.

18. listopada listopada / 13

Prvi pismeni zadatak iz Analize sa algebrom novembar Ispitati znak funkcije f(x) = tgx x x3. 2. Naći graničnu vrednost lim x a

4.7. Zadaci Formalizam diferenciranja (teorija na stranama ) 343. Znajući izvod funkcije x arctg x, odrediti izvod funkcije x arcctg x.

Neka su A i B proizvoljni neprazni skupovi. Korespondencija iz skupa A u skup B definiše se kao proizvoljan podskup f Dekartovog proizvoda A B.

Algoritmi i strukture podataka (450)

FTN Novi Sad Katedra za motore i vozila. Teorija kretanja drumskih vozila Vučno-dinamičke performanse vozila: MAKSIMALNA BRZINA

Pismeni ispit iz matematike Riješiti sistem jednačina i diskutovati rješenja sistema u zavisnosti od parametra: ( ) + 1.

Matematička analiza 1 dodatni zadaci

2log. se zove numerus (logaritmand), je osnova (baza) log. log. log =

radni nerecenzirani materijal za predavanja

Dvanaesti praktikum iz Analize 1

1 Afina geometrija. 1.1 Afini prostor. Definicija 1.1. Pod afinim prostorom nad poljem K podrazumevamo. A - skup taqaka

Inženjerska grafika geometrijskih oblika (5. predavanje, tema1)

RIJEŠENI ZADACI I TEORIJA IZ

KVADRATNA FUNKCIJA. Kvadratna funkcija je oblika: Kriva u ravni koja predstavlja grafik funkcije y = ax + bx + c. je parabola.

Riješeni zadaci: Nizovi realnih brojeva

Trigonometrija 2. Adicijske formule. Formule dvostrukog kuta Formule polovičnog kuta Pretvaranje sume(razlike u produkt i obrnuto

Zadaci iz trigonometrije za seminar

Trigonometrijske nejednačine

Deljivost. 1. Ispitati kada izraz (n 2) 3 + n 3 + (n + 2) 3,n N nije deljiv sa 18.

ASIMPTOTE FUNKCIJA. Dakle: Asimptota je prava kojoj se funkcija približava u beskonačno dalekoj tački. Postoje tri vrste asimptota:

III VEŽBA: FURIJEOVI REDOVI

Dijagonalizacija operatora

Relacije poretka ure denja

Pismeni ispit iz matematike GRUPA A 1. Napisati u trigonometrijskom i eksponencijalnom obliku kompleksni broj, zatim naći 4 z.

Linearna algebra 2 prvi kolokvij,

Linearna algebra 2 prvi kolokvij,

RAČUNSKE VEŽBE IZ PREDMETA POLUPROVODNIČKE KOMPONENTE (IV semestar modul EKM) IV deo. Miloš Marjanović

ELEMENTARNA MATEMATIKA 1

Algebarske strukture sa jednom operacijom (A, ): Ako operacija ima osobine: zatvorenost i asocijativnost, onda je (A, ) polugrupa

SKUPOVI I SKUPOVNE OPERACIJE

radni nerecenzirani materijal za predavanja R(f) = {f(x) x D}

Granične vrednosti realnih nizova

Algoritmi zadaci za kontrolni

Numerička matematika 2. kolokvij (1. srpnja 2009.)

INTELIGENTNO UPRAVLJANJE

Iskazna logika 1. Matematička logika. Department of Mathematics and Informatics, Faculty of Science, University of Novi Sad, Serbia.

Elektrotehnički fakultet univerziteta u Beogradu 17.maj Odsek za Softversko inžinjerstvo

Kaskadna kompenzacija SAU

(P.I.) PRETPOSTAVKA INDUKCIJE - pretpostavimo da tvrdnja vrijedi za n = k.

Transcript:

Programiranje 2-1 Složenost D. Vitas Analiza programa... obuhvata procenu vremena i prostora potrebnog da se taj program izvrši. Primer 1. Sravnjivanje niski (gruba sila n*m) Primer 2. Izračunavanje vrednosti polinoma Vreme... se izražava kao funkcija T( algoritam, p) gde su p podaci na koje se primenjuje algoritam. Ako je L domen vrednosti za p, onda je T : L ---> R { + T(p) - vreme izvršavanja programa, T(p) = + ako program sadrži beskonačnu petlju! Prostor... je iznos memorije potreban za izvršavanje programa. Izražava se kao funkcija: Ako je L domen vrednosti za p, onda je S : L ---> N { + N P (p) - prostor potreban za izvršavanja programa P za podatke p Izračunavanje T... u najjednostavnijim slučajevima na sledeći način: a. Za svaki osnovni iskaz (npr. dodela) i logički izraz (npr. u if), vreme izvršavanja ne zavisi od vrednosti promenljivih, odn. važi da je T x=α (p) = const. T B (p) = const. b. Ako su P; Q dve bloka iskaza, onda T P;Q (p) = T P (p) + T Q (p) 1

Izračunavanje T Primer - celobrojno deljenje c. T if B then P else Q (p) = = if B then T B (p)+t P (p) else T B (p) + T Q (p) d. T for(i=e1; B; e2) P (p) = = T B (e1)+t P (B) +T P (e2) +Σ T P (f(p)) gde je f(p) transformacija koju podaci p ostvaruju kroz petlju. e. T while(b) P (p) = = (n(p)+1)*t B (p)+σ T P (f(p)) (n(p) - broj prolazaka kroz petlju) DIV: r = a; q = 0; while( r >= b ) { r = r - b; q = q - 1; T DIV = T r = a + T q = 0 + ([a/b]+1)*t r >=b + [a/b](t r=r-b + T q=q-1 ) = k1*[a/b] + k2 ~ [a/b] Izračunavanje T T zavisi od podataka p. Razlikujemo: MAX( Algo, n ) = max(t(prog, p)), gde su p - podaci obima n MIN( Algo, n ) = min(t(prog, p)) AVG( Algo, n ) = Σ p(p)*t(prog, p) gde je p(p) verovatnoća podatka p. MIN <= AVG <= MAX Poređenje vremena T(n) = O(f(n)) ako postoji c>0 i N>0 takvo da je za svako n > N: T(n) <= c*f(n) Primer. T(Div) = O(1) Detaljnije - 4. godina R-smera Poređenje vremena T(n) 2n 2 n n Sortiranje nizova Log n 1 n 2

Problem sortiranja - primer Urediti u rastućem poretku niz N = { 5, 3, 4, 2, 3, 5, 8, 1 Rezultat: N = { 1, 2, 3, 3, 4, 5, 5, 8 Podela metoda Metode sortiranja delimo na: metode internog sortiranja (u unutrašnjoj memoriji - nizovi, liste,...) metode eksternog sortiranja (podaci u datotekama!= niza!!!) Osnovne operacije: poređenje dva elementa razmena mesta (swap) izbor pozicije u nizu Klasifikacija metoda internog sortiranja Elementarna selekcija, umetanje, mehuri (bubble) O(n 2 ) Binarne brzi sort (quicksort), fuzija Preko struktura drveta Uređivanjem leksikografsko drvo O(n) O(n*log(n)) O(n*log(n)) Ključ Petar 1.82m 70k Ana 1.60m 53k Jelena 1.76m 72k Ključ visina Jelena 1.76m 72k Milan 1.76m 75k Milan 1.76m 75k Ana 1.60m 53k Petar 1.82m 70k Petar 1.82m 70k Ana 1.60m 53k Jelena 1.76m 68k Ključ težina, Petar 1.82m 70k Milan 1.76m 75k pa visina Jelena 1.76m 72k Ana 1.60m 53k Milan 1.76m 75k Petar 1.82m 70k Ana 1.60m 53k Jelena 1.76m 72k Ključ visina, Milan 1.76m 70k Milan 1.76m 70k pa težina Jelena 1.76m 72k Ana 1.60m 53k Petar 1.82m 70k Princip sortiranja Sortiranje Dato: Niz N = (e1, e2,...en) tipa T Na T definisana relacija poretka Ključ: element uređen skup Problem: Izračunati permutaciju p od { 1, 2,..., n takvu da Ključ(e p1 ) Ključ(e p2 )... Problem stabilnosti: permutacija p je stabilna ako za i < j i Ključ(e pi ) Ključ(e pj ) važi p i < p j (tj. elementi sa istim ključem ne razmenjuju mesta) 1 Petar 1.82m 70k 1 Ana 1.60m 53k 2 Jelena 1.76m 72k Ključ visina, 2 Milan1.76m 70k 3 Milan 1.76m 70k pa težina 3 Jelena 1.76m72k 4 Ana 1.60m 53k 4 Petar1.82m 70k p p -1 1 4 1 4 2 3 2 3 3 2 3 2 4 1 4 1 3

traženje min sekvencijalno MIN Izbor mesta (selekcija) t 7 7 4 2 6 4 1 8 3 1 5 4 swap t 1 7 4 2 6 4 7 8 3 1 5 4 za sortiranje Primer Selekcija 0. korak A B R A K A D A B R A 1. korak A B R A K A D A B R A 2. korak A A R B K A D A B R A 3. korak A A A B K R D A B R A 4. korak A A A A K R D B B R A 5. korak A A A A A R D B B R K... void selection( int a[], int N ) { int i, j, min, t; Implementacija for(i = 0; i < N-1; i++ ) { min = i; for(j = i+1; j < N; j++ ) if(a[j] < a[min] ) min = j; // indeks minimuma swap( &a[min], &a[i] ); // razmena mesta Složenost: prostor O(1) select.exe vreme O(n 2 ) (O(n 2 ) poređenja, n-1 razmena mesta) selection 9 8 7 6 5 4 3 2 1 0 0 8 7 6 5 4 3 2 1 9 0 1 7 6 5 4 3 2 8 9 0 1 2 6 5 4 3 7 8 9 0 1 2 3 5 4 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 Metoda umetanja (insertion) Još jedan primer... nalik na ređanje karata u ruci. Uzima se karta sleva i dovodi na svoje mesto... i to se ponavlja dok karte ne budu poređane po redu. Primer. (crveno = sortirani delovi) 0. korak A B R A K A D A B R A 1. korak A B R A K A D A B R A 2. korak A B R A K A D A B R A 3. korak A A B R K A D A B R A 4. korak A A B K R A D A B R A... 9 8 7 6 5 4 3 2 1 0 8 9 7 6 5 4 3 2 1 0 7 8 9 6 5 4 3 2 1 0 6 7 8 9 5 4 3 2 1 0 5 6 7 8 9 4 3 2 1 0 4 5 6 7 8 9 3 2 1 0 3 4 5 6 7 8 9 2 1 0 2 3 4 5 6 7 8 9 1 0 1 2 3 4 5 6 7 8 9 0 0 1 2 3 4 5 6 7 8 9 Složenost: prostor O (1 ) vreme O (n²) O (n²) poređenja O (n²) dodela 4

Implementacija void insertion( int a[], int N ) { int i, j, v; for(i = 1; i < N; i++ ) { v = a[i]; j = i; while( a[j-1] > v ) { a[j] = a[j-1]; j--; a[j] = v; Modifikacija - Shellsort void Shellsort( int r[], int l, int d ) { int x, i, j; int tempr; for ( x=d-l+1; x>1; ) { if (x<5) x = 1; else x = (5*x-1)/11; /*** Linearno umetanje sa korakom d ***/ for ( i=d-x; i >=l; i-- ) { // print r tempr = r[i]; for ( j=i+x; j <= d && (tempr >r[j] ); j+=x ) r[j-x] = r[j]; r[j-x] = tempr; // print t shellsort.exe Mehurasti sort (bubble) Moguće implementacije - bubble1... isteruje na početak niza najmanji, ali tako što ga "potiskuje" sa mesta na kome se nalazi ka početku. Primer. 5 4 3 2 1 4 5 3 2 1 4 3 5 2 1 4 3 2 5 1 4 3 2 1 5 3 4 2 1 5 3 2 4 1 5... void bubble1( int t[], int n ) { int i, j, mark; /* mark = 1 ako se vrsi razmena mesta; inace = 1 */ do { i = 0; while( t[i] <= t[i+1] && i < n ) i = i + 1; // traži se min. if( i < n-1 ) { swap( &t[i], &t[i+1] ); mark = 1; else mark = 0; while (mark == 1 ); bubble1.exe bubble2 void bubble2( int t[], int n ) { int i, j, k; for( j = n-1; j>=0; j--) { for( i = 0; i < j; i++ ) if( t[i] > t[i+1] ) trampa( &t[i], &t[i+1] ); bubble2.exe bubble3 void bubble3( int t[], int donja, int gornja ){ int i, j, k; while (gornja > donja) { j = donja; for ( i = donja; i < gornja; i++ ) if ( t[i] > t[i+1] ) { trampa( &t[i], &t[i+1]; j = i; gornja = j; for ( i = gornja; i > donja; i-- ) if ( t[i] < t[i-1] ) { trampa( &t[i], &t[i-1] ); j = i; donja = j; bubble3.exe 5

Trobojka Problem. Dat je (a) niz f od N elemenata. Svaki element je ili crven ili beo ili plav. (b) predikati C(i), B(i), P(i). Ovaj predikat je tačan ako je i-ti elemen niza redom crven, beo, plav. (c) primitivni iskaz swap koji razmenjuje mesto elementima niza f sa indeksima i i j. Urediti niz u redosledu plavo-belo-crveno uz uslov da se svaki od predikata C,B,P izračunava najviše jednom za svaki od elemenata niza. Takođe, kako je swap skup, treba ga koristiti što je manje moguće. ft P B C P C C B P B C B P Trobojka f' Rešenje 1 Rešenje 1 Kako se predikati smeju konsultovati za dato i najviše jednom, to znači da svaki f i mora da se nađe na pravom mestu kada se utvrdi koje je boje. Pretpostavimo da je posle k koraka nastala situacija: P B X C gde je X još neispitani deo. Odavde je uslov izlaska "zona X je prazna". Neka p, b, c budu tri indeksa i to p - prvi posle plave zone b - pvi posle bele zone (prvi od X) c - prvi pre crvene zone (poslednji od X) Ovakvo stanje izračunavanja se može opisati kao P p,b,c : (0 i < p P(i)) (p i < b B(i)) (c < i N C(i)) Program se završava kada je P p,b,c (b = c+1) i mora imati sledeći oblik: inicijalizacija; while(b!= c + 1) { telo petlje u kome važi P p,b,c (Niz f još ne učestvuje u konstrukciji programa!) p = b = 0; c = N-1; Rešenje 1 while( b <= c ) { /* Ispitujemo element sa indeksom b */ if( B[ b ] ) b = b + 1; // Beli element else if( P[ b ] ) { // Plavi element swap(f: p, b); p = p + 1; b = b + 1; else /* C(b) je tačno */ // Crveni element { swap(f:c,b); c = c - 1; Petlja se izršava N puta, a broj swap: #P + #C. Popravka Kada je C(b) tačno, može se desiti da i C(c) bude tačno, pa se treba pomaći ulevo do prvog elementa koji nije crven: if( C[ b ] ) while( C[ c ] ) && b < c ) c = c -1; swap( f: c,b); c = c - 1; 6

Rešenje 2 Zaključak Kako se petlja u oba rešenja izvršava N puta, to se u svakom prolazu najviše jednom računaju C, B, P. Sada je izlazni kriterijum c > N. Kod je sličan - proučiti! Petlja se izvršava N puta i ima #B+2*#P swap-poziva. Kada je 1, a kada 2. rešenje podesnije? Kada se sortiranje završi, boje svih elemenata su poznate jer važi P p,b,c (b = c+1). Sledi da se u svakom prolazu ispitivanje vrši za druge elemente niza (svaki najviše jednom). Složenost O(n)! Podudarnost nizova Data su dva strogo rastuća niza, F i G. Zadatak je da se pronađe broj onih vrednosti koje se javljaju u oba niza. Interpretacija: F i G su dve uređene reprezentacije skupova celih brojeva, a rezultat treba da pruži kardinalnost preseka ta dva skupa. Traži se oni k takvi da važi: Razrada 0 m < M && 0 n < N && F(m) = G(n) Inicijalizacija je (k, m, n) = (0, 0, 0) Izlazni uslov je vezan za m = M && n = N. Problem: kada se m i n povećavaju za 1, postoji više puteva od (0,0) do (M,N). Neka F ima M, a G N elemenata. Razrada Biramo put do (m,n) pretpostavljajući da su sva podudaranja u tačkama (i,j) (i<m, j<m): F(i) = G(j) pre tačke (m,n) već otkrivena. Kada je za neko (m,j), F(m)!= G(j), k se ne uvećava, tj. k= 0 akko za svako j: 0 j < n: F(m)!= G(j) Ako je F(m) = G(n), onda F(m) > G(n-1). Slično važi i za G, pa imamo uslov F(m) > G(n-1) && G(n) > F(m-1) Rešenje int k, n, m; k = m = n = 0; while( (m!= M) && (n!= N) ) { if( G[n] > F[m] ) m++; else if( G[n] < F[m] ) n++; else /* G[n] == F[m] */ {k++; m++; n++; 7

Primer F = {0, 1, 2, 3, 4, 5, 6 M = 7 G = {2, 4, 6, 8, 9 N = 5 k=m=n=0:!= M,!= N G[0] = 2 > F[0] = 0 --> m = 1; G[0] = 2 > F[1] =1 --> m = 2; G[0] = 2 == F[2] = 2 --> k = 1; m = 3; n = 1 G[1] = 4 > F[3] = 3 --> m = 4; G[1] = 4 == F[4] = 4 --> k = 2; m = 5; n = 2 G[2] = 6 > F[5] = 5 --> m = 6; G[2] = 6 == F[6] = 4 --> k = 3; m = 7; n = 3 m == M --> KRAJ Rotacija niza Problem. Dat je niz X. Uvedimo oznake: K je podniz X(j) (0 j < k) H je podniz X(j) (k j < N) Niz X se može zapisati kao: X = K H. Problem rotacije je da se formira niz X = H K, odnosno da podnizovi H i K razmene mesta. Razrada Uvedimo za proizvoljan niz R, oznaku rev(r) koja označava niz čiji su elementi u obrnutom poretku od R. Važi: rev(rev(r)) = R, za svako R rev(h K) = rev(k) rev(h) Rešenje globalne promenljive int N... int X[N]... int k... /* a - početak i b - kraj niza R */ void rev( int a, int b ){ int x, y; x = a; y = b; while( x < y ) { swap(& X[x], &X[y]); x++; y++ Rešenje Drukčije rešenje int main( ) { int x, y; /* X = H * K */ x = 0; y = N-1; rev( x, y ); /* X = rev(x) = H * K */ x = k; y = N-1; rev( x, y ); /* X = rev(h) */ x = 0; y = k-1; rev( x, y ); /* X = rev(k) */ /* X = K * H */... Niz X oblika H K treba transformisati u oblik K H. Pretpostavimo da je podniz H ima bar onoliko elemenata koliko ih ima u K. Tada se H može zapisati u obliku: H = H0 H1 gde je H0 iste dužine kao K. Polazni zadatak se formuliše u transformaciju iz H0 H1 K ---> K H0 H1. 8

Postupak 1. korak: kako su H0 i K iste dužine, prva transformacija je H0 H1 K ---> K H1 H0 Ovo je swap elemenata sa početaka i kraja niza. 2. korak je transformacija K H1 H0 ---> K H0 H1 Zadatak. Implementirati uz uslov da broj poziva funkcije swap bude minimalan. Pretraživanje Problem Dat je niz, npr. 1. Petar 1.82m 70k 2. Jelena 1.76m 72k 3. Milan 1.76m 75k 4. Ana 1.60m 53k Treba utvrditi da li se ključ k javlja u nizu ili ne. Npr. ključ visina --> k = 1.60m Odgovor: Da ključ težina --> k = 100k Odgovor: Ne ključ ime --> k = Milan Odgovor: Da Identifikacija ključa omogućava da se pronađe informacija koja je pridružena ključu. 1. struct element { int kljuc; int info; 2. struct element a[100]; Opis podataka 3. Implementacije pretraživanja // char, char[], struct,... a.k Linerano pretraživanje 5 4 2 7 1 4 3 N = 8 0 1 2 3 4 5 6 7 8 9 10 11 Ključ je kljuc = 7. Polazeći od pozicija i =1, ispitujemo da li je a.k[ i ] == kljuc (jeste, za i = 4) Ako jeste, ključ je prisutan u nizu i uzimamo a.info [ i ]. Inače se upućuje poruka da ključ nije u nizu (tada su moguće različite akcije, npr. umetanje ključa). 1 Implementacija int N; struct element a[n ]; // Niz koji se pretrazuje... int lin_pretraga( int kljuc) { int i; for( i = 0; i < N; i++ ) if( a[i].k == kljuc ) return i; return -1; (Funkcija vraća indeks prvog elementa niza koji je jednak ključu.) 9

Linerano pretraživanje sa umetanjem a. Sa ulaza stižu podaci o objektima tipa T koje upisujemo u niz a. b. Na početku je niz prazan (funkcija init: N = 0). c. Potrebno je formirati niz od ovih objekata umećući svaki sledeći na kraj niza (funkcija lininsert). d. U fazi pretrage, tražimo (počev od kraja niza) da li se ključ nalazi u nizu ili ne (funkcija linpretraga). N = 3 a.niz ključ k = 6 Postupak umetanja 5 4 2 6 0 1 2 3 4 5 6 7 8 9 10 11 a.kljuc[4] = 6 vrednost k = 6 nije u prva četiri elementa niza. ----> dodajemo je na kraj (pozicija 4) i povećavamo N. lininsert(5,info); lininsert(4,info), lininsert(2,info);... Postupak pretrage Implementacija Obezbediti da ključ uvek bude u nizu (stražar): Ključ se postavi na pozicuju 0-tog elementa. (Poziciju stražara će definisati funkcija init) Pretraživanje sa umetanjem Ako je ključ u nizu, biće pronađen pre stražara v. kljuc = 9 (funkcija lininsert) 9 5 4 2 6 4 1 8 3 5 static struct element { // static - globalni zivotni vek int k; // Kljuc int info; // Informacija a[ 100]; // Niz koji se pretrazuje static int N; // Pozicija strazara void init( void ); // Definisanje pozicije strazara int linpretraga( int ); // void lininsert( int, int ); // Umetanje kljuca i informacija // na kraj niza (alternativno void lininsert( struct element ); Implementacija void init() { N = 0; // Ne postavlja vrednost ključa void lininsert( int v, int info ) { a[ ++N ].k = v; // Upisuje ključ na sledeću poziciju a[ N ].info = info; // Upisuje informaciju Primer. Rezultat niza poziva init(); lininsert(5,info1); lininsert(4,info2), lininsert(2,info3); je niz od 4 elementa u kome su ključevi???, 5, 4, 2. int linpretraga( int v ) { int x = N+1; Implementacija a[0].k = v; // Stražar: vrednost ključa a[0].info = -1; // Indikator da ključ nije u nizu while( v!= a[ --x ].k ); return a[x].info; 10

Primer Primer init(); lininsert(5, 1); lininsert(4, 2); lininsert(2, 3); r = linpretraga( 4 ); N = 0 N = 1, a[1].k = 5 a[1].info = 1 N = 2 a[2].k = 4 a[2].info = 2 N = 3 a[3].k = 2 a[3].info = 3 N = 3 a[0].k = 4 r = 2 a[0].info = -1 init(); lininsert(5, 1); lininsert(4, 2); lininsert(2, 3); r = linpretraga( 7 ); N = 0 N = 1, a[1].k = 5 a[1].info = 1 N = 2 a[2].k = 4 a[2].info = 2 N = 3 a[3].k = 2 a[3].info = 3 N = 3 a[0].k =7 r = -1 a[0].info = -1 Komentari Uloga stražara : obezbeđuje da ključ uvek nađe u nizu, a preko izabrane vrednost info (npr, -1) saopštava da ga nema. Komponenta info može da bude vrlo složena struktura (npr. ime, datum, JMBG,...) Postupak ne zavisi od tipa ključa. Npr. ako int ključ zamenimo sa char *kljuc, a u while poređenje obezbedimo preko strcmp, funkcija linpretraga pretraživaće niske!!! Složenost: za neuspelo pretraživanje N+1 poređenja kod uspešnog pretraživanja N/2 poređenja Binarno pretraživanje Princip "Podeli, pa vladaj" Osnovna pretpostavka: niz je sortiran u odnosu na neki poredak pridružen tipu niza. Princip: a kljuc=7 1 2 3 4 N = 10 7 9 10 12 22 30 l (l+d)/2 d int binsearch( int v ) { int l = 0, d = N -1, x; Implementacija while( d > l ) { x = ( l + d )/2; if( v == a[x].k ) return a[x].info; if( v < a[x].k ) d = x - 1; else l = x + 1; return -1; i 0 1 2 3 4 5 6 7 a: 1 3 5 7 9 11 13 15 a: 9 11 13 15 Primer N = 8, v = 13 l = 0; d = 8 x = 4 --> a[x].k = 9 < v l = 5; d = 8 x = 6 --> a[x].k = 13 = v Složenost: najviše log N + 1 poređenja, bez obzira da li je uspešno ili ne 11

Interpolirano pretraživanje Princip linearnog pretraživanja... slično binarnom (drukčije je određivanje indeksa člana sa kojim se vrši poređenje) int intsearch( int v ) { int l = 1, d = N, x; while( ( a[d].k >= v ) && ( v > a[l].v ) ) { x = ( (v-a[l].k) / (a[d].k-a[l].k) *(d-l) ) + l; if( v > a[x].k) l = x + 1; else if(v > a[x].k) d = x - 1; else l = x; if( v == a[l].k ) return a[l].info; else return -1; //Indeks // Na desno // Na levo // Pronađen Neka B(x) bude izraz o nekom celobrojnom x 0 koji nije netačan za svako takvo x. Tada, treba naći najmanje x takvo da važi B(x). Rešenje (princip lineranog pretraživanja): int x = 0; while(!b(x) ) x = x + 1; Primer Zadatak. Sastaviti program koji, za dato x 0, izračunava z = [ sqr( x ) ]. 2. rešenje (Knuth) Polazeći od činjenice da je 1. rešenje z = (int) sqrt( x ); 1 + 3 + 5 +... (2n+1) = (n+1) 2 za svako n > 0 Problem: funkcija sqrt "prikriva" proces izračunavanja... izračunavanje korena se može svesti na aditivne operatore. Knutovo rešenje Knutovo rešenje Promenljiva y1 čuva vrednost brojača i Promenljiva y3 čuva tekući neprani broj 2*i+1 Promenljiva y2 čuva zbir nepranih brojeva do i S druge strane, ako je z celobrojni deo korena x, onda se traži najmanje z takvo da važi: x 0 && z 2 x (z+1) 2 Odavde se izvodi sledeći program: int x = 100; int main() { int y1 = 0; // Prolazi skup neparnih int y2 = 0; // Pamti zbir prvih n neparnih int y3 = 1; // Sledeci neparni broj while( y2 <= x ) { y1 = y 1 + 1; // Brojac y3 = y3 + 2; // Sledeci neparni y2 = y2 + y3; // Zbir neparnih printf("[koren(%d)] = %d\n", x, y1 ); knuth.exe 12

3. rešenje (E. W. Dijkstra) Ovo rešenje se izvodi neposredno iz uslova zadatka primenom principa linearnog pretraživanja: int x = 0; while(!b(x) ) x = x + 1; gde iz uslova Q: x 0 && z 2 x (z+1) 2 dobijamo: int z = 0; while( (z+ 1)*(z+1) <= x) z = z + 1; printf("koren(%d) = %d", x, z); koren1.exe 3. rešenje Prednost: rešenje izvedeno iz uslova zadatka, bez "trikova" Nedostaci sporo (linarno traženje rešenja - skupo u zahtevanom vremenu) skupo (koriste se multiplikativni operatori) Može li se ovo rešenje popraviti? 1. popravka U uslovu z 2 x && x < (z+1) 2, zamenimo z nekim a, a z+1 nekim b tako da uslov Q postane uslov P: P: a 2 x && x < b 2 && 0 a < b Sada važi da P && b = a + 1 Q. pa se umesto uslova iz 1. rešenja, kao uslov while-petlje može uzeti uslov b == a + 1 Ostaje da se konstruiše pogodno b tako da važi P. Ako se b konstruiše primenom principa linearnog pretraživanja, nema dobitka u vremenu! Zato... Logaritamska redukcija... koja se sastoji u određivanju b kao stepena broja 2. { int a = 0, b = 1; while( b * b <= x ) b = 2*b; // b*b <= x < (b+1)*(b+1) while( b!= a + 1 ) { int c; c = (a+b)/2; // Logaritamska if( c * c <= x ) a = c; // redukcija else b = c; // vremena Priroda redukcije U koraku primene principa linearnog pretraživanja: Eliminacija b i c U rešenju sa logaritamskom redukcijom a = 0 U koraku logaritamske redukcije: a = 0 x b = 2 n c x Vreme potrebno za 2. while-petlju je reda O( log n ) Prvi korak (formiranje b) ne menja složenost - potrebno vreme je takođe reda O( log n) iz polaznog rešenja je izvedeno efikasno, ali skupo rešenje (i dalje je prisutan multiplikativni operator * u uslovima: b * b <= x; c * c <= x ) Pokušajmo da ih eliminišemo. 13

Uvedimo smenu: Eliminacija b i c l = b - a ---> l - dužina intervala { int a = 0, l = 1; while( l * l <= x ) l = 2*l; // l*l <= x < (l+1)*(l+1) while( l > 1 ) { l = l/2; if( (a+l)*(a+l) <= x ) a = a+l; koren3.exe I dalje je prisutan multiplikativni operator *. Da li moguće upotrebu * svesti na aditivne operatore i množenje i deljenje sa 2? Ideja zamene: Eliminacija * x - (a+l) 2 = y + z Uvedimo nove promenljive u, y, z takve da važi: u = l*l posle 1. petlje C: (u = l*l) && (y = x - a*a) && (z =l*l +*a*l) posle dodele l = l/2 u 2. petlji. Posledice: (a) u = l 2 && l 2 x u x (b) (a+l) 2 x z y Dalja transformacija Rešenje { int a, l, u, y, z; a = 0; l = 1; u = 1; while( u <= x ) { l = 2*l; u = 4*u; while( l > 1) { a = z/2; α; l = l/2; if( z <= y ) β // tako da važi uslov C // Tražena vrednost { int a, l, u, y, z; a = 0; l = 1; u = 1; while( u <= x ) { l = 2*l; u = 4*u; while( l > 1) { u = u/4; z = z/2 - u; l = l/2; if( z <= y ) {y = y - z; z = z + 2*u; a = a + l; a = z/2; Konačna transformacija Promenljiva a nije potrebna pre završne dodele (jer se inicijalizacija vrši počev od u = 1). Promeljiva l nije potrebna jer je l > 1 ekvivalentno sa uslovom u > 1. Odavde sledi sledeće neočekivano rešenje: Konačna transformacija { int u, y, z; u = 1; while( u <= x ) u = 4*u; y = x; z = u; while( u > 1) { u = u/4; z = z/2 - u; if( z <= y ) { y = y - z; z = z + 2*u; a = z/2; 14

{ int u, y, z; u = 1; while( u <= x ) u = 4*u; y = x; z = u; while( u > 1) { u = u/4; z = z/2 - u; if( z <= y ) { y = y - z; z = z + 2*u; a = z/2; Primer Broj koraka 4 x = 100 u = 1 -----> u = 256 y = 100, z = 256 1. u = 64, z = 64 < y = 100 y = 36, z = 192 2. u = 16, z= 80 > y = 36 3. u = 4, z = 36 = 10 <= y = 36 y = 0, z = 44 4. u = 1, z = 21 > y a = 10 koren5.exe Konačno - bitovski operatori { int u, y, z; u = 1; while( u <= x ) u = u<<2; y = x; z = u; while( u > 1) { register int t; u = u>>2; t = z>>1 z = t1 - u; if( z <= y ) { y = y - z; t = u<<1; a = z>>1; shift.cpp // z = (z>>1) - u shift.exe z = z + t; koren6.exe 15