1 / 13

5 . Pretraživanje i sortiranje zasnovano na rekurziji , apstraktne strukture podataka

5 . Pretraživanje i sortiranje zasnovano na rekurziji , apstraktne strukture podataka 5.1. Rekurzivni postupci pretra živanja i sortiranja Neki postupci pretraživanja i sortiranja po svojoj prirordi su rekurzivni. U takvim postupcima prirodno se primenjuje rekurzija.

Download Presentation

5 . Pretraživanje i sortiranje zasnovano na rekurziji , apstraktne strukture podataka

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. 5. Pretraživanje i sortiranje zasnovano na rekurziji, apstraktne strukture podataka 5.1. Rekurzivni postupci pretraživanja i sortiranja Neki postupci pretraživanja i sortiranja po svojoj prirordi su rekurzivni. U takvim postupcima prirodno se primenjuje rekurzija. 5.1.1. Binrno pretraživanje zasnovano na rekurziji. binrek.cpp, binrek1.cpp. 5.1.2. Quick-sort algoritam Postoji jedan način za sortiranje nizova nazvan "quick sort“. Ovaj metod je preložio C. A. R. Hoare godine 1962. Metod je posebno efikasan za nizove većih dimenzija.

  2. Algoritam za brzo sortirnje je po svojoj prirodi rekurzivan. Zasniva se na strategiji “podeli pa osvoji”. • Osnovna ideja je sledeća: • podeliti niz na 2 dela tako d au 1. delu svaki element niza bude manji od elemenata u 2. delu • neki element između ova 2 dela je na svom mestu • ponoviti postupak za prvi i drugi podniz. • Ovaj postupak je primenjn u sledećim primerima uz neznate razlike u realizaciji. • qsort.cpp. qsort1.cpp, qsort2.cpp • Broj operacija: • biramo granični element x i prolazimo duž celog niza – tj. ukupan broj operacija je n. Ako smo stalno birali sredinu, imammo log (n) prokaza. Znači, ukupan broj poređenja je nlog(n). Ukupan broj poređenja iznosi O(n/6). Dakle, ukupan broj operacija je O(nlogn).

  3. Postoji ugrađena funkcija za sortiranje u C-u. Njen naziv je qsort i ima sledeći prototip: void qsort (void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); Prvi argument je pokazivač na početak niza (može seodnositi na bilo koju vrstu niza). Drugi argument je broj članova koji se sortiraju. Treći argument se odnosi na veličinu objekata koji se sortiraju. Četvrti argument je pokazivač na funkciju koja određuje redosled sortiranja i ona ima 2 argumenta. Qsorteng.cpp

  4. 5.2. Apstraktne strukture podatka Opis dinamičkih i statičkih struktura podataka. 5.2.1 Alokacija memorije Za svaki program mora se izvršiti alokacija memorije (rezervisanje memorijskog prostora) za smeštanje podataka. To se nekad čini automatski. Na primer: float x; char niska[] = “Voli Marko vino"; a nekada eksplicno navodimo koliko memorije rezervišemo: int celi[100]; Takva alokacija memorije naiziva se statička alokacija.

  5. 5.2.1.1. Statička alokacija memorije Statička alokacija memorije se dešava za vreme prevođenja programa (pre izvršavanja). Statičke promenljive ostaju u memoriji sve dok se koristi (dok se izvršava) program. (Jezik C99 je malo specifičan jer omogućava promenljivu veličinu niza.) Ako su podaci deklarisani kao statički u nekoj funkciji, oni su lokalni za tu funkciju i ne može im se pristupiti iz drugih modula.

  6. 5.2.1.2. Dinamička alokacija memorije Međutim, u programu se može rezervisati memorija i pomoću specijalnih funkcijaza vreme izvšavanja programa. Takva alokacija memorije naziva se dinamičkom. Objekat u dinamički alociranoj memoriji ostaje sve dok ga korisnik sam eksplicitno ne ukloni (ili ga ne ukloni neki skupljač otpadaka ako takav mehanizam postoji u samom jeziku). Ovako alociran objekat ima dinamičko vreme trajanja. Kako se rešava problem dinamičke alokacije memorije? Postoje različiti postupci (načini) za dinamičku alokaciju memorije:

  7. preko blokova fiksne veličine preko deljenih blokova (buddy-blocks) na hip (heap) - morije Heap- memorija je velika količina slobodne memorije kojoj se pristupa mahom preko popkazivača i podaci ostaju upisani dok se eksplicitno ne uklone. Nasuprot heap memoriji je stek-memorija koja je obično manjeg kapaciteta i objekti u njoj postoje samo za vreme izvtšavanja neke funkcije.

  8. Za rezervisanje memorije (u programskom jeziku C) , koristi se funkcija: malloc() Ova funkcija ima 1 argument koji određuje broj rezervisanih bajtova. Alociranoj memoriji se ne dodeljuje ime. Ona vraća adresu prvog bajta u alociranom bloku i ta adresa se može dodeliti nekom pokazivaču. Dakle ovde se koristi heap za smeštanje podataka. Za oslobađanje memorije (razrešenje dinamičke promenljive), koristi se funkcija: free(<adresa>) (obično, free(<pokazivac>) )

  9. Kada se koriste ove funkcije, treba uključiti zaglavlje: <alloc.h> (ili <stdlib.h>) Funkcija malloc() se deklariše na sledeći način (počev od C99 koristi se void umesto char, što je opštije.) char *malloc (usigned <broj_uzastopnih_bajtova>) Ova funkcija je u uskoj vezi sa operatorom sizeof (<izraz>) – vraća veličinu mem. prostora za čuvanje izraza. Ako napišemo: struct pok *nesto; nesto = (struct pok *) malloc(5*sizeof(struct pok)); rezerviše se 5 lokacija za smeštanje navedene strukture. Ako malloc() ne može da alocira zahtevanu memoriju, vraća nullpointer.

  10. Ako napišemo: double * ptd; ptd = (double *) malloc(50 * sizeof(double)); ovim je rezervisan prostor od 50 double vrednosti i njima se može pristupiti preko pokazivača: ptd[0], ptd[1], …

  11. U poslednjem primeru kreiran je jedan dinamički niz. Niz se, praktično, kreira dok se program izvršava i mi možemo za vreme izvršavanja programa da određujemo dužinu niza. (Do sada smo kreirali samo statičke nizove). Dakle, možemo pisati: ptd = (double *) malloc(n * sizeof(double)); (Počev od C99 postoji i 2. način za kreiranje dinamičkih nizova.) Pored funkcije malloc() može se koristiti i funkcija calloc() koja ima 2 argumenta. char *malloc (usigned <broj_podatka>, usigned <duzina_podatka>) Na primer, možemo pisati: long * proizvod; proizvod = (long *)calloc(100, sizeof (long)); Za razrešenje mem. prostora i u ovom slučaju se koristi funkcija free().

  12. 5.2.1. Povezane liste Opis povezane liste. Kreiranje povezane liste i način rada sa povezanim listama. Povezana1.cpp

  13. 5.2.2. Stekovi i redovi Opis steka. Opis reda. Opis načina rada s astekovima i redovaima.

More Related