1 / 22

Zadaci

Zadaci.

nero
Download Presentation

Zadaci

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Zadaci • Strukturu red realizirati kao memorijski rezidentnu listu (upotreba pokazivača). Jedan element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba napisati funkciju koja dodaje i funkciju koja briše element iz reda, te funkciju za ispis elementa na kojem se obavlja operacija. Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije, vraća 0. Napomena: Novi element dodaje sena kraj liste i pamti se pokazivač na zadnji element, a elementi se skidaju iz redaod glaveliste. Preuzela Sandra Krivačić

  2. Napisati funkciju za punjenje memorijski rezidentnog binarnog stabla u čije čvorove treba upisati: cijena artikla (realni broj) i naziv artikla (15+1 znakova). Stablo treba sortirati po cijeni artikala; lijevi jeftiniji, desni skuplji. Napisati funkciju za ispis elementa za koju je ulazni argument korijen stabla. Ispis treba biti poredan po cijeni od najjeftinijeg do najskupljeg artikla. Napisati funkciju koja ispiše sve proizvode čija je cijena manja od neke određene vrijednosti koja se unese u glavnoj funkciji programa tijekom izvršavanja programa. Zadatak preuzeo Danijel Markić • U memoriji napraviti binarno stablo traženja u čije čvorove se upisuju 2 podatka: prvi tipa int i drugi tipa float. Stablo se sortira prema cjelobrojnom podatku (lijevo manji, desno veći). Ispisati BST po algoritmu INORDER. Napisati funkcije MIN() i MAX() koje u najmanjem mogućem broju koraka (u najkraćem mogućem vremenu izvršavanja) moraju naći i ispisati zapise koji odgovaraju najmanjoj i najvećoj cjelobrojnoj vrijednosti (nije dopušteno pročitati zapise u svim čvorovima). U programu zatim izbrisati čvorove koji odgovaraju tim zapisima te ispisati tako nastalo BST u INORDER algoritmu. Napisati funkciju koja izračuna i ispiše prosječnu vrijednost varijable tipa float u BST. Preuzeo, ali odustao Andrej Vidak

  3. Prioritetni red i hrpa • Napisati program za ubacivanje i skidanje elemenata (prioritet određuje cijeli broj) iz prioritetnog reda. Za prioritet elementa i odabir operacije (ubacivanje ili skidanje) koristi se generator slučajnih brojeva. Ako generator načini parni broj, element najvećeg prioriteta vadi se iz prioritetnog reda. Ako generator načini neparni broj, stvara se novi element sa slučajno generiranim prioritetom i stavlja u prioritetni red.

  4. #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <ctype.h> #define MAXPRIOR 100 typedef int tip; void podesi (tip A[], int i, int n) { // potpuna binarna stabla s korijenima A[2*i] i A[2*i+1] // kombiniraju se s A[i] stvarajuci jedinstvenu hrpu, 1 <= i <= n int j; tip stavka; j = 2 * i; stavka = A[i]; while (j <= n) { // Usporedi lijevo i desno dijete (ako ga ima) if ((j < n) && (A[j] < A[j + 1])) j++; // j pokazuje na vece dijete if (stavka >= A[j]) break; // stavka je na dobrom mjestu A[j / 2] = A[j]; // vece dijete podigni za razinu j *= 2; } A[j / 2] = stavka; }

  5. void ubaci (tip A[], int k) { // ubacuje vrijednost iz A[k] na gomilu pohranjenu u A[1 : k - 1] int i, j; tip novi; j = k; i = k / 2; novi = A[k]; while ((i > 0) && (A[i] < novi)) { A[j] = A[i]; // smanji razinu za roditelja j = i; i /= 2; // roditelj od A[i] je na A[i/2] } A[j] = novi; } tip skini (tip A[], int *k) { // izbacuje vrijednost iz A[k] sa prvog mjesta, ako je red prazan vraca -1 tip retVal = -1; if (*k <= 1) return retVal; retVal = A[1]; (*k) --; A[1] = A[*k]; podesi (A, 1, *k); return retVal; }

  6. int main() { int prior, i, j, k = 1; tip A[MAXPRIOR]; srand((unsigned) time(NULL)); printf("Za obavljanje jednog koraka pritisni ENTER, za kraj bilo koji znak\n”); while(isspace(getchar())) { if (rand() % 2) { if (k >= MAXPRIOR) printf("Red prioriteta pun!\n"); else { printf("Dodavanje u red prioriteta: %d\n", prior=(int)(rand()/(RAND_MAX + 1.) * 99 + 1)); A[k] = prior; ubaci(A, k); k++; } } else { if ((prior = skini(A, &k)) == -1) printf("Red prioriteta prazan!\n"); else printf("Skidanje iz reda prioriteta: %d\n", prior); } for (i = 1, j = 1; i < k; j++) { for (; i <= pow (2, j) - 1 && i < k; i++) { printf(" %d ", A[i]); } printf ("\n"); } } }

  7. Zadatak • Napisati program koji od ulaznog polja alfabetskih znakova (samo slova engleske abecede, dakle ASCII znakovi koji odgovaraju slovima) izgradi hrpu, te ispiše polje u kojem su spremljeni elementi hrpe. Također napraviti sortiranje polja takvih znakova upotrebom sortiranja pomoću hrpe. • Napisati program koji od ulaznog polja cijelih brojeva izgradi minimalnu hrpu (u korijenu je najmanji element), te ispiše polje u kojem su spremljeni elementi hrpe. Također napraviti silazno sortiranje (od najvećeg elementa prema najmanjem) polja cijelih brojeva upotrebom sortiranja pomoću hrpe.

  8. Operacije sa skupovima • Napisati funkciju koja će pronaći i ispisati presjek dvaju skupova cijelih brojeva, te ustanoviti složenost algoritma. • Razmotrit ćemo dva slučaja: kada su elementi skupova nesortirani i kada su sortirani • Za nesortirane elemente potrebno je usporediti svaki element iz prvog skupa sa svakim iz drugog - funkcija presjek1() • Složenost funkcije je O(NA*NB) • Za sortirane elemente: uspoređuje se element iz prvog skupa s elementom iz drugog i pomiče se kursor kod onog skupa čiji je element manji – funkcija presjek2() • Složenost funkcije O(max(NA,NB)), ali radi samo za sortirane nizove

  9. #include <stdio.h> #include <stdlib.h> #define NA 10 #define NB 15 int presjek1(int *a, int *b, int **p) { int i, j, k = 0; // k – broj zajedničkih elemenata for (i = 0; i < NA; i ++) for (j = 0; j < NB; j ++) if (a[i] == b[j]) { *p = realloc(*p, (k + 1) * sizeof(int)); (*p)[k] = a[i]; // paziti: *p[k] znači *(p[k])!! ++ k; } return k; } int presjek2(int *a, int *b, int **p) { int i = 0, j = 0, k = 0; while (i < NA && j < NB) { if (a[i] == b[j]) { *p = realloc(*p, (k + 1) * sizeof(int)); (*p)[k] = a[i]; ++ k; ++ i; ++ j; } else if (a[i] < b[j]) { ++ i; } else { ++ j;} } return k; }

  10. void InsertionSort(int a[], int n) { int j,k,i; for(j = 1; j < n; j++) { k = a[j]; i = j - 1; while(a[i] > k && i >= 0) { a[i + 1] = a[i]; i--; } a[i + 1] = k; } } void main() { int a[NA] = {1,8,2,22,19,17,21,11,72,7}; int b[NB] = {2,19,3,34,72,99,35,0,5,14,7,31,25,67,21}; int *p = NULL, i, n; printf(“ Presjek nesortiranih skupova:\n”); n = presjek1(a, b, &p); printf ("Presjek: "); for (i = 0; i < n; i++) printf ("%d ", p[i]);

  11. printf(“ Presjek sortiranih skupova:\n”); InsertionSort(a,NA); InsertionSort(b,NB); printf("Polje a nakon sortiranja: "); for (i = 0; i < NA; i ++) printf ("%d ", a[i]); printf ("\n"); printf("Polje b nakon sortiranja: "); for (i = 0; i < NB; i ++) printf ("%d ", b[i]); printf ("\n"); n = presjek2(a, b, &p); printf ("Presjek: "); for (i = 0; i < n; i ++) printf ("%d ", p[i]); }

  12. Računanje sume članova polja • Zadatak: napisati funkciju koja računa sumu članova polja. • Najjednostavnije rješenje: int suma1 (int polje[], int n) { složenost O(n) int i, suma = 0; for (i = 0; i < n; i ++) { suma += polje[i]; } return suma; } • Rekurzivni postupak: sumiranje prvog člana s ostatkom polja: int suma2 (int polje[], int n) { složenost O(n), prosječno asimptotsko if (n <= 0) return 0; vrijeme izvođenja je 2n return polje[n - 1] + suma2(polje, n - 1); }

  13. Podijeli-pa-vladaj algoritam: polje se dijeli u polovice koje se sumiraju int suma3 (int polje[], int l, int d) { // l (d) – indeks lijevog (desnog) ruba polja int p; if (d < l) return 0; if (d == l) return polje[d]; p = (d + l) / 2; return suma3 (polje, l, p) + suma3 (polje, p + 1, d); } • Složenost ovog algoritma je također O(n) • Glavna procedura: void main() { int N,i,*a, s1,s2,s3; printf("Unesi duljinu polja:\n"); scanf("%d",&N); if ((a = (int *)malloc(N)) == NULL) {printf("Greska u rezerviranju memorije !"); exit(1); }

  14. srand(time(NULL)); printf(" Elementi polja su:\n"); for(i=0; i < N; i++) { a[i]= 100 * ((float) rand()/(RAND_MAX + 1)); printf("%d ",a[i]); } printf("\n\n"); s1 = suma1(a,N); printf(" Rezultat funkcije suma1:%d\n",s1); s2 = suma2(a,N); printf(" Rezultat funkcije 2:%d\n",s2); s3 = suma3(a,0,N-1); printf(" Rezultat funkcije suma3:%d\n",s3); }

  15. Primjer za različite složenosti istog problema • Zadano je polje cijelih brojeva A0, A1,…,An-1. Brojevi mogu biti i negativni. Potrebno je pronaći najveću vrijednost sume niza brojeva. Pretpostavit će se da je najveća suma 0 ako su svi brojevi negativni. Problem je razmatran na predavanjima. • Kubna složenost: Ispituju se svi mogući podnizovi. U vanjskoj petlji se varira prvi član podniza,u srednjoj petlji varira se zadnji član podniza,u unutrašnjoj petlji varira se duljina niza od prvog člana do zadnjeg člana. Sve 3 petlje se za najgori slučaj obavljaju n puta: apriorna složenost O(n3). • Kvadratna složenost: ako uočimo da je treća petlja nepotrebna (ne treba se suma svaki put računati iznova), složenost se može reducirati na O(n2). • Linearna * logaritamska složenost: O(nlog2n) - relativno složeni rekurzivni postupak. Ako se ulazno polje podijeli približno po sredini, rješenje može biti takvo da je maksimalna suma u lijevom dijelu polja, ili je u desnom dijelu polja ili prolazi kroz oba dijela. Prva dva slučaja mogu biti riješena rekurzivno. Zadnji slučaj se može realizirati tako da se nađe najveća suma u lijevom dijelu koja uključuje njegov zadnji član i najveća suma u desnom dijelu koja uključuje njegov prvi član. Te se dvije sume zbroje i uspoređuju s one prve dvije. • Linearna složenost: zbrajaju se svi članovi polja redom, a pamti se ona suma koja je u cijelom tijeku tog postupka bila najveća, pa je složenost algoritma O(n)

  16. #include <stdio.h> #include <stdlib.h> // vraca niz znakova c u zadanoj duljini n char* nc (int c, int n) { static char s[80+1]; s[n] = '\0'; // prirubi while (--n >= 0) s[n] = c; // popuni return s; } // ispis polja void ispisi(int A[], int n) { int i; printf("\n"); for (i = 0; i < n; i++) printf(" A[%d]",i); printf("\n"); for (i = 0; i < n; i++) printf("%5d", A[i]); printf("\n"); }

  17. // Kubna slozenost int MaxPodSumaNiza3 (int A[], int N) { int OvaSuma, MaxSuma, i, j, k; int iteracija = 0; MaxSuma = 0; for (i = 0; i < N; i++) { printf ("i=%d\n", i); for (j = i; j < N; j++) { OvaSuma = 0; for (k = i; k <= j; k++) { OvaSuma += A [k]; ++iteracija; } if (OvaSuma > MaxSuma) MaxSuma = OvaSuma; printf ("Suma clanova [%d, %d] = %d, a najveca = %d\n",i, j, OvaSuma, MaxSuma); } } printf ("Broj iteracija: %d\n", iteracija); return MaxSuma; }

  18. // Kvadratna slozenost int MaxPodSumaNiza2 (int A[ ], int N) { int OvaSuma, MaxSuma, i, j; int iteracija = 0; MaxSuma = 0; for (i = 0; i < N; i++) { printf ("i=%d\n", i); OvaSuma = 0; for (j = i; j < N; j++) { OvaSuma += A[ j ]; ++iteracija; if (OvaSuma > MaxSuma) MaxSuma = OvaSuma; printf ("Suma clanova [%d, %d] = %d, a najveca = %d\n",i, j, OvaSuma, MaxSuma); } } printf ("Broj iteracija: %d\n", iteracija); return MaxSuma; }

  19. // NlogN slozenost - koristi funkcije Max3 i MaxPodSuma // racuna najveci od 3 broja int Max3 (int A, int B, int C) { return A > B ? A > C ? A : C : B > C ? B : C; } // trazi najvecu podsumu clanova od Lijeva do Desna int MaxPodSuma (int A[], int Lijeva, int Desna, int dubina) { int MaxLijevaSuma, MaxDesnaSuma; int MaxLijevaRubnaSuma, MaxDesnaRubnaSuma; int LijevaRubnaSuma, DesnaRubnaSuma; int Sredina, i, ret; printf ("%s> MaxPodSuma(%d, %d) ...\n", nc(' ', dubina*2), Lijeva, Desna); if (Lijeva == Desna) { // Osnovni slucaj if (A [Lijeva] > 0) ret = A [Lijeva]; // podniz od clana A[Lijeva] else ret = 0; // suma je 0 ako su svi brojevi negativni printf ("%s< MaxPodSuma(%d, %d) = %d\n",nc(' ', dubina*2), Lijeva, Desna, ret); return ret; } // racun lijeve i desne podsume s obzirom na Sredina Sredina = (Lijeva + Desna) / 2; MaxLijevaSuma = MaxPodSuma (A, Lijeva, Sredina, dubina+1); MaxDesnaSuma = MaxPodSuma (A,Sredina + 1, Desna, dubina+1);

  20. // najveca gledano ulijevo od sredine MaxLijevaRubnaSuma = 0; LijevaRubnaSuma = 0; for (i = Sredina; i >= Lijeva; i--) { LijevaRubnaSuma += A [i]; if (LijevaRubnaSuma > MaxLijevaRubnaSuma) MaxLijevaRubnaSuma = LijevaRubnaSuma; } // najveca gledano udesno od sredine MaxDesnaRubnaSuma = 0; DesnaRubnaSuma = 0; for (i = Sredina + 1; i <= Desna; i++) { DesnaRubnaSuma += A [i]; if (DesnaRubnaSuma > MaxDesnaRubnaSuma) MaxDesnaRubnaSuma = DesnaRubnaSuma; } printf ("%s Lijeva=%d Desna=%d Rubna=%d\n", nc (' ', dubina*2), MaxLijevaSuma, MaxDesnaSuma, MaxLijevaRubnaSuma + MaxDesnaRubnaSuma); // najveca od lijeva, desna, rubna ret = Max3 (MaxLijevaSuma, MaxDesnaSuma, MaxLijevaRubnaSuma + MaxDesnaRubnaSuma); printf ("%s< MaxPodSuma(%d, %d) = %d\n", nc(' ', dubina*2), Lijeva, Desna, ret); return ret; }

  21. // NlogN slozenost int MaxPodSumaNizaLog (int A [], int N) { return MaxPodSuma (A, 0, N - 1, 0); } // Linearna složenost int MaxPodSumaNiza1 (int A[], int N) { int OvaSuma, MaxSuma, j; OvaSuma = MaxSuma = 0; for (j = 0; j < N; j++) { OvaSuma += A[ j ]; if (OvaSuma > MaxSuma) MaxSuma = OvaSuma; else if (OvaSuma < 0) OvaSuma = 0; // povecanje izgleda sljedeceg podniza printf ("j=%d OvaSuma=%2d MaxSuma=%2d\n", j, OvaSuma, MaxSuma); } return MaxSuma; }

  22. void main (void) { int A [] = {2,5,-8,4,-2,5,-5,4,3,-2}; int rez; printf("\n\nKubna slozenost\n"); ispisi(A, sizeof (A) / sizeof (A [0])); rez = MaxPodSumaNiza3 (A, sizeof (A) / sizeof (A [0])); printf("\nMaxSuma3 = %d", rez); getchar(); printf("\n\nKvadratna slozenost\n"); ispisi(A, sizeof (A) / sizeof (A [0])); rez = MaxPodSumaNiza2 (A, sizeof (A) / sizeof (A [0])); printf("\nMaxSuma2 = %d", rez); getchar(); printf("\n\nLogaritamska slozenost\n"); ispisi(A, sizeof (A) / sizeof (A [0])); rez = MaxPodSumaNizaLog (A, sizeof (A) / sizeof (A [0])); printf("\nMaxSumaLog = %d", rez); getchar(); printf("\n\nLinearna slozenost\n"); ispisi(A, sizeof (A) / sizeof (A [0])); rez = MaxPodSumaNiza1 (A, sizeof (A) / sizeof (A [0])); printf("\nMaxSuma1 = %d\n", rez); exit (0); }

More Related