programiranje 2 · pdf filepretra zivanje sortiranje literatura pregled 1 pretra zivanje 2...

35

Upload: dinhanh

Post on 07-Feb-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

Programiranje 2

Pretra�zivanje i sortiranje

Milena Vujo�sevi�c Jani�ci�c

Jelena Graovac

www.matf.bg.ac.rs/~milena

www.matf.bg.ac.rs/~jgraovac

Programiranje 2

Beograd, 22. mart, 2017.

Pretra�zivanjeSortiranjeLiteratura

Pregled

1 Pretra�zivanje

2 Sortiranje

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Pregled

1 Pretra�zivanje

Linearna pretraga

Binarna pretraga

2 Sortiranje

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Pretra�zivanje

Pod pretra�zivanjem za dati niz elemenata podrazumevamo

odredivanje indeksa elementa niza koji je jednak datoj

vrednosti ili ispunjava neko drugo zadato svojstvo (npr. najve�ci

je element niza).

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Linearno pretra�zivanje

Linearno (ili sekvencijalno) pretra�zivanje niza je pretra�zivanje

zasnovano na ispitivanju redom svih elemenata niza ili

ispitivanju redom elemenata niza sve dok se ne naide na

tra�zeni element (zadatu vrednost ili element koji ima neko

speci��cno svojstvo)

Linearno pretra�zivanje je vremenske linearne slo�zenosti po

du�zini niza koji se pretra�zuje.

Ukoliko se u nizu od n elemenata tra�zi element koji je jednak

zadatoj vrednosti, u prose�cnom slu�caju (ako su elementi niza

slu�cajno rasporedeni), ispituje se n/2, u najboljem 1, a u

najgorem n elemenata niza.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Primer

Linearna pretraga mo�ze biti realizovana rekurzivno. Naredna

funkcija vra�ca indeks prvog pojavljivanja zadatog celog broja x u

zadatom nizu a du�zine n ili vrednost -1, ako se x ne pojavljuje u a:

int linearna_pretraga(int a[], int n, int x) {

if (n==0)

return -1;

if (a[0] == x)

return 0;

int pozicija=linearna_pretraga(a+1, n-1, x);

return ((pozicija==-1) ? -1 : pozicija+1 );

}

Ova implementacija koristi pokaziva�cku aritmetiku i nije repno

rekurzivna.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Primer

Dodavanjem parametra koji pamti poziciju, funkcija postaje repno

rekurzivna i ne koristi pokazia�cku aritmetiku:

int linearna_pretraga(int a[], int i, int n, int x) {

if (i == n)

return -1;

if (a[i] == x)

return i;

return linearna_pretraga(a, i+1, n, x);

}

Ova implementacija se mo�ze jednostavno transformisati u

iterativnu.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Primer

Iterativna varijanta linearne pretrage prve pojave zadatog celog

broja x u zadatom nizu a du�zine n:

int linearna_pretraga(int a[], int n, int x) {

int i;

for (i = 0; i < n; i++)

if (a[i] == x)

return i;

return -1;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Primer

�Cesta gre�ska prilikom implementacije linearne pretrage je prerano

vra�canje negativne vrednosti:

int linearna_pretraga(int a[], int n, int x) {

int i;

for (i = 0; i < n; i++)

if (a[i] == x)

return i;

else

return -1;

}

Navedena naredba return prouzrokuje prekid rada funkcije tako da

implementacija mo�ze da prekine petlju ve�c nakon prve iteracije.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Primer

Ukoliko tra�zimo poslednje pojavljivanje elementa u nizu, onda je

rekurzivna implementacija linerane pretrage jednostavinija:

int linearna_pretraga(int a[], int n, int x) {

if (n == 0)

return -1;

else if (a[n - 1] == x)

return n-1;

else return linearna_pretraga(a, n-1, x);

}

Ova implementacija se mo�ze jednostavno transformisati u

iterativnu.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Primer

U iterativnoj varijanti linearne pretrage pri �cemu se tra�zi poslednje

pojavljivanje elementa u nizu, pretragu po�cinjemo od kraja niza:

int linearna_pretraga(int a[], int n, int x) {

int i;

for (i = n-1; i >=0; i--)

if (a[i] == x)

return i;

return -1;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Binarna pretraga

Binarno pretra�zivanje je pronala�zenje zadate vrednosti u

zadatom skupu objekata, pri �cemu se pretpostavlja da su

objekti zadatog skupa sortirani, i u svakom koraku, sve dok se

ne pronade tra�zena vrednost, taj skup se deli na dva dela i

pretraga se nastavlja samo u jednom delu � odbacuje se deo

koji sigurno ne sadr�zi tra�zenu vrednost.

Binarno pretra�zivanje ne mo�zemo da primenimo ukoliko skup

objekata koji pretra�zujemo nije sortiran.

Primer: pogadanje brojeva sa poznatom gornjom granicom

Primer: pogadanje brojeva ukoliko gornja granica nije poznata

Slo�zenost O(log n)

Razlog za�sto su re�cnici, enciklopedije, telefonski imenici

sortirani (varijanta pretra�zivanja koja se naziva interpolaciona

pretraga)

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Binarna pretraga

Implementacija binarne pretrage niza

int binarna_pretraga(int a[], int n, int x) {

if (n==0)

return -1;

if (a[n/2] == x)

return n/2;

if(x<a[n/2]) return binarna_pretraga(a, n/2,x);

else {

int pozicija = binarna_pretraga(a+n/2+1, n/2,x);

return (pozicija == -1 ? -1: n/2+1+pozicija);

}

}

Prethodna funkcija koristi pokaziva�cku aritmetiku i nije repno

rekurzivna, pa je ne mo�zemo jednostavno prevesti u iterativnu

funkciju.Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Binarna pretraga

Implementacija binarne pretrage niza repnom rekurzijom: uvodenjeparametara leve i desne granice

int binarna_pretraga(int a[], int l, int d, int x) {

int s;

if (l > d)

return -1;

s = l + (d - l)/2; /*Ovo nije ekvivalentno sa (l+d)/2!*/

if (x == a[s])

return s;

if (x < a[s])

return binarna_pretraga(a, l, s-1, x);

else /*if (x > a[s])*/

return binarna_pretraga(a, s+1, d, x);

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Binarna pretraga

Iterativno re�senje:

int binarna_pretraga(int a[], int n, int x) {

int l, d, s;

l = 0; d = n-1;

while(l <= d) {

s = l + (d - l)/2;

if (x == a[s])

return s;

if (x > a[s])

l = s + 1;

else /*if (x < a[s])*/

d = s - 1;

}

return -1;

}Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Linearna pretragaBinarna pretraga

Binarna pretraga

Da bi se smanjio broj poredenja, proveru na jednakost treba ostaviti

za kraj:

int binarna_pretraga(int a[], int n, int x) {

int l, d, s;

l = 0; d = n-1;

while(l <= d) {

s = l + (d - l)/2;

if (x > a[s])

l = s + 1;

else if (x < a[s])

d = s - 1;

else /* if (x == a[s]) */

return s;

}

return -1;

} Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Pregled

1 Pretra�zivanje

2 Sortiranje

Selection sort

Merge sort

Quick sort

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Sortiranje

Sortiranje je jedan od fundamentalnih zadataka u ra�cunarstvu.

Sortiranje podrazumeva uredivanje niza u odnosu na neko

linearno uredenje.

Primeri:

uredenje niza brojeva po veli�cini � rastu�ce ili opadaju�ce,

uredivanje niza niski leksikografski ili po du�zini,

uredivanje niza struktura na osnovu vrednosti nekog polja.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Sortiranje

Postoji vi�se razli�citih algoritama za sortiranje nizova.

Neki algoritmi su jednostavni i intuitivni, dok su neki

kompleksniji, ali izuzetno e�kasni.

Naj�ce�s�ce kori�s�ceni algoritmi za sortiranje su:

Bubble sort

Selection sort

Insertion sort

Shell sort

Merge sort

Quick sort

Heap sort

http://www.sorting-algorithms.com/

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Sortiranje

Algoritmi sortiranja imaju razli�cite vremenske i prostorne

slo�zenosti.

Neki od algoritama za sortiranje rade u mestu (engl. in-place),

tj. sortiraju zadate elemente bez kori�s�cenja dodatnog niza.

Drugi algoritmi zahtevaju kori�s�cenje pomo�cnog niza ili nekih

drugih struktura podataka.

Prilikom izra�cunavanja vremenske slo�zenosti algoritama

sortiranja obi�cno se uzimaju u obzir samo operacije poredenja i

operacije zamene, jer su one za podatke netrivijalnih tipova

najskuplje operacije.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Sortiranje � klase slo�zenosti

Jednostavniji, sporiji algoritmi sortiranja imaju slo�zenost

najgoreg slu�caja O(n2) i u tu grupu spadaju bubble, insertion i

selection.

Shell sort je algoritam kojem, u zavisnosti od implementacije,

slo�zenost varira od O(n2) do O(n log2 n).

Kompleksniji, br�zi algoritmi imaju slo�zenost najgoreg slu�caja

O(n log n) i u tu grupu spadaju heap i merge sort (ovi

algoritmi zahtevaju dodatni memorijski prostor).

Algoritam quick sort ima slo�zenost najgoreg slu�caja O(n2), ali,po�sto je slo�zenost prose�cnog slu�caja O(n log n) i po�sto u praksi

pokazuje dobre rezultate, ovaj se algoritam ubraja u grupu

veoma brzih algoritama.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Selection sort

Primer animacije

Ideja: prona�ci najmanji element u nizu i postaviti ga na nulto

mesto, zatim prona�ci najmanji od ostatka niza i dovesti ga na

prvo mesto, i tako redom, do kraja niza.

Pozicija minimalnog elementa u nizu po�cev�si od pozicije i:

int poz_min(int a[], int n, int i) {

int m = i, j;

for (j = i + 1; j < n; j++)

if (a[j] < a[m])

m = j;

return m;

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Selection sort

void razmeni(int a[], int i, int j) {

int tmp = a[i]; a[i] = a[j]; a[j] = tmp;

}

int selectionsort(int a[], int n) {

int i;

for (i = 0; i < n - 1; i++)

razmeni(a, i, poz_min(a, n, i));

}

Vremenska slo�zenost je kvadratna, dok je prostorna slo�zenost

konstantna (sortiranje u mestu).

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Selection sort

Selection sort se mo�ze implementirati rekurzivno. Ne�sto

jednostavnija implementacija je ukoliko se umesto dovodenjanajmanjeg na po�cetak niza, uradi dovodenje najve�ceg na kraj niza.

Naravno, pozicija maksimalnog elementa u nizu takode mo�ze da se

implementira rekurzivno (ali i ne mora)

int poz_max(int a[], int n) {

if (n == 1)

return 0;

else {

int m = poz_max(a, n-1);

return a[m] > a[n-1] ? m : n-1;

}

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Selection sort

Rekurzivna implementacija:

void selectionsort(int a[], int n) {

if (n > 1) {

razmeni(a, n-1, poz_max(a, n));

selectionsort(a, n-1);

}

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Merge sort

Dva ve�c sortirana niza se mogu objediniti u tre�ci sortirani niz samo

jednim prolaskom kroz nizove (tj. u linearno vremenu O(m+ n) gdesu m i n dimenzije polaznih nizova).

void merge(int a[], int m, int b[], int n, int c[]) {

int i, j, k;

i = 0, j = 0, k = 0;

while (i < m && j < n)

c[k++] = a[i] < b[j] ? a[i++] : b[j++];

while(i < m) c[k++] = a[i++];

while(j < n) c[k++] = b[j++];

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Merge sort

Merge sort algoritam deli niz na dve polovine (�cija se du�zina

razlikuje najvi�se za 1), rekurzivno sortira svaku od njih, i zatim

objedinjuje sortirane polovine. Izlaz iz rekurzije je jedini�cni niz.

void mergesort_(int a[], int l, int d, int tmp[]) {

if (l < d) {

int i, j;

int n = d - l + 1, s = l + n/2;

int n1 = n/2, n2 = n - n/2;

mergesort_(a, l, s-1, tmp);

mergesort_(a, s, d, tmp);

merge(a + l, n1, a + s, n2, tmp);

for (i = l, j = 0; i <= d; i++, j++)

a[i] = tmp[j];

}

}Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Merge sort

Vremenska slo�zenost � O(nlogn)

Prostorna slo�zenost � O(n)

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Quick sort

Osnovna ideja je da se izabere jedan element, tzv pivot i da se

on postavi na svoje mesto u nizu i to tako da su svi elementi

levo od njega manji od njega, a svi desno od njega ve�ci od

njega (korak particionisanja).

Zatim se postupak rekurzivno ponovi za levi i desni podniz.

Primer animacije.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Quick sort

void qsort_(int a[], int l, int d) {

if (l < d) {

/*dovedi pivot na poziciju l*/

razmeni(a, l, izbor_pivota(a, l, d));

/*postavi pivot tako da su levo manji od njega,

a desno veci*/

int p = particionisanje(a, l, d);

/*Sortiraj rekurzivno levi i desni podniz*/

qsort_(a, l, p - 1);

qsort_(a, p + 1, d);

}

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Slo�zenost

Kako bi se dobila jedna�cina T (n) = 2T (n/2) + O(n) ie�kasnost O(n log n), potrebno je da korak particionisanja

(tj. funkcija particionisanje) bude izvr�sen u linearnom

vremenu O(n).

Particionisanje mo�ze da se implementira da bude linearno, ali

je pravi izbor pivota problem jer nam treba takav da nam

podeli niz na dva dela jednakih veli�cina, a to ne mo�ze u

konstantnom vremenu.

Zbog toga je u najgorem slu�caju kvadratna slo�zenost.

U prose�cnom slu�caju mo�ze o�cekivati relativno ravnomerna

raspodela �sto dovodi do optimalne slo�zenosti (O(n log n)).

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Quick sort

Izbor pivota mo�ze da bude razli�cit, najjednostavnije je da se

izabere sam levi element. Bolje performanse: npr. za pivot

uzme srednji od tri slu�cajno izabrana elementa niza.

Particionisanje se takode mo�ze uraditi na razli�cite na�cine.

int particionisanje(int a[], int l, int d) {

int p = l, j; /*Pivot je krajnji levi element*/

for (j = l+1; j <= d; j++)

if (a[j] < a[l]) /*if(a[j] < pivot)*/

razmeni(a, ++p, j); /*element koji je manji od pivota

dovodimo na pocetak niza*/

razmeni(a, l, p); /*dovodimo pivot na njegovu

poziciju*/

return p; /*vracamo poziciju pivota*/

}

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Selection sortMerge sortQuick sort

Quick sort

Napomenimo da je quick sort algoritam koji u praksi daje

najbolje rezultate kod sortiranja duga�ckih nizova.

Medutim, va�zno je napomenuti da kod sortiranje kra�cih nizova

naivni algoritmi (npr. insertion sort) mogu da se poka�zu

prakti�cnijim.

Ve�cina realnih implementacija quick sort algoritma koristi

hibridni pristup � izlaz iz rekurzije se vr�si kod nizova koji

imaju nekoliko desetina elemenata i na njih se primenjuje

insertion sort.

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Pregled

1 Pretra�zivanje

2 Sortiranje

3 Literatura

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2

Pretra�zivanjeSortiranjeLiteratura

Literatura

Slajdovi su pripremljeni na osnovu �sestog poglavlja knjige

Predrag Jani�ci�c, Filip Mari�c: Programiranje 2

Za pripremu ispita, slajdovi nisu dovoljni, neophodno je u�citi iz

knjige!

Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2