120 likes | 287 Views
1 2. Primene u ra z nim oblastima matematike 12.1. Algoritmi nad polinomima 1. NP za računanje vrednosti polinoma. VredPol1.cpp P n (x) = P n-1 (x)+a n x n VredPol2.cpp P n (x) = P n-1 (x)+a n x n-1 *x VredPol3.cpp P n (x) = xP’ n-1 (x) +a 0
E N D
12. Primene u raznim oblastima matematike 12.1. Algoritmi nad polinomima 1. NP za računanje vrednosti polinoma. VredPol1.cpp Pn(x) = Pn-1(x)+anxn VredPol2.cpp Pn(x) = Pn-1(x)+anxn-1*x VredPol3.cpp Pn(x) = xP’n-1(x) +a0 P’n-1(x) = anxn-1+…+a1 Pn(x) =(…(anx+an-1)x +…+a1)x+a0 2. NP za: (a) izračunavanje prizvoda 2 polinoma (b) količnik i ostatka 2 polinoma.
3. NP za izračunavanje koeficijenata polinoma u kanonskom obliku kada su poznate njegove nule : x0, ..., xn. koefpolin.cpp Ovde je botna rekurzivna relacija među koeficijentima. Za x0, ..., xn imammo: Pn = an(n)xn +an-1(n)xn-1+...+a0(n) Za x0, ..., xi-1 imammo: Pi-1 = ai-1(i-1)xi-1 +...+a0(i-1) Za x0, ..., xi imammo: Pi = ai(i)xi +ai-1(i)xi-1+...+a0(i) Iz relacije: (x-xi)Pi-1 = Pi nalazimo: ai(i) = ai-1(i-1) aj(i) = aj-1(i-1) – aj-1(i-1) xi , j= 1, ...i-1 a0(i) = -xia0(i-1)
12.2. Primena u geometriji 1. NP za ispitivanje da li je dati poligon konveksan. polKonve.cpp 2. NP za računanje površine konveksnog poligona. povKonv.cpp (Da li može da se uopšti za ma koji prost poligon?) 3. NP za računanje površine prostog poligona. povpol.cpp
12.3. Primena u Numeričkoj analizi • Napisati program za izračunavanje vrenosti funkcije sin(x) sa tačnošću . • sinus1.cpp • sinus2.cpp • 2. Napisati program za izračunavanje:
Prvi sabirak dobijamo za n = 0 i on iznosi -2x. U iatom ciklusu, u kojem računamo sumu, računaćemo stepene xk, tj. 1/2k (0.5k) koristeći dve pomoćne promenljive.
3. Napisati program za nalaženje nule jednačine x3-e-x sa tačnošću koristeći Njutnov iterativni metod. Njutnite.cpp 4. Napisati program za interpolaciju funkcije f(x) koristeći: (a) linearnu interpolaciju (b) Lagranžov interpolacioni polinom. Lagranz.cpp
12.5. Algoritmi za sravnjivanje niski Značaj zadatka sravnjenja 2 niske. Zadatak: U niski dužine n tražimo sva pojavljivanja niske dužine m (n>m). U najgorem slučaju moramo izvršiti n-m+1 poređenja karaktera. Složenost algoritma je O(n), ali ipak postoje razni algoritmi. Ovde je važna i veličina azbuke nad kojom su niske formirane. Zadatak možemo još preciznije formulisati: U niski dužine n naći sva pojavljivanja niske (uzorka) dužine m (n>m) ako su niske formirane nad azbukom dužine c. Cn- broj poređenja karaktera
12.5.1. Algoritam zasnovan na “gruboj sili” Ovaj algoritam se često naziva: “Naivni” algoritam sravnjenja. Pseudokod funkcije : naivnoSrav( text, n, uzr, m ) /* Traziuzr[1..m] u text[1..n] */ char text[], uzr[]; int n, m; { int i, j, k, lim; lim = n-m+1; for( i = 1; i<= lim; i++ ) /* Trazenje */ { k = i; for( j=1; j<=m && text[k] == pat[j]; j++ ) k++; if( j > m ) nadjenNa Poziciji( i-j+1 ); } }
Broj poređenja karaktera u prethodnom slučaju je: Cn= k(n-m+1) = O(n) Najgori slučaj je kada imamo da je k=m. Postoj znatno bolji algoritmi za poređenje niski, npr. Knuth-Morris- Pratt-ov algoritam. Ovaj algoritam se zasniva na prethodnoj obradi (preprocesiranju) niske-uzorka. Broj operacija obrade je O(m). Ovde je broj operacija Cn ≤ 2n+O(1). Još ima interesantnih algoritama za rešenje ovog problema. Na primer: Boyer-Moore (1977)- algoritam, Baeza-Yates - Gonnet (1989)-algoritam , Karp-Rabin (1987)-algoritam, ...
12.6. Obilazak (pretraga) grafa Jedan od čestih zadataka nad grafovima je sistematski obilazak (poseta) svakog čvora grafa. (Često treba uraditi nešto sa svakim podatkom zapamćenim u čvoru grafa i tada treba obići sve čvorove grafa.) Obilazak čvorova grafa može se organizovati na razne načine. Dva poznata postupka su: obilazak (pretraga) grafa po dubini obilazak (pretraga) grafa po širini. Nadalje ćemo pretpostaviti da je graf predstavljen na 2. način Obilazak po dubini može se organizovati rekurzivno: - Posesiti čvor v grafa - Posesiti (rekurzivno) sve neposećene čvorove pridružene (preko grana) čvoru v.
Graftr.cpp GrafB.cpp Graf možemo pretraživati po širini. Da bismo posetili sve čvorove povezane sa čvorom k, ubacujemo čvor k u red, onda ulazimo u ciklus gde uzimamo sledeći čvor iz reda i ako nije bio posećen, posećujemo ga i ubacujemo u red sve neposećene čvorove koji su povezani listom susedstva sa čvorom k. Ovo činimo sve dok red ne bude prazan. Pretpostavimo da se čvorovi grafa opisuju na sledeći način: typedef struct cvor *veza; struct cvor { int v; veza sledeci; } i neka su definsane liste susedstva (kao u zadatku graftr.cpp)
Ako koristimo iste oznake kao u zadatku graftr.cpp i (uobičajene) funkcije za rad sa redovima kao strukturama podataka, obilazak grafa u širinu možemo globalno opisati na sledeći način: void obilazak( int k) { veza t; initRED(v); upisiURED(k); while(! REDprazan()) if (posecen[k=uzetIzREDA()]==0) { vizit(k); posecen[k]=1; for(t=susl[k]; t !=NULL; t=t->sledeci) if(posecen[t->v]==0) upisiURED(t->v); } }