sortiranje i pretraživanje - weboteka.net i programiranje/e-student/008_2013-04-29 p08... ·...

47
Algoritmi i programiranje Sortiranje i pretraživanje Prof. dr. sc. Tonči Carić ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Upload: truongkhanh

Post on 21-Jul-2019

218 views

Category:

Documents


1 download

TRANSCRIPT

Algoritmi i programiranje

Sortiranje i pretraživanje

Prof. dr. sc. Tonči Carić

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Često se u stvarnom svijetu susrećemo sa sortiranjima različitih stvari: novčanice u kasi, knjige u knjižnici, filmovi u videoteci, …

• Sortiranje bilo da se radi o silaznom ili uzlaznom je izrazito bitno jer nam svakodnevno olakšava život

• U računarstvu isto vrijedi: datoteke mogu biti sortirane po nazivu, veličini, zadnjoj modifikaciji, itd.

• Svaki puta nam je lakše koristiti sortirane podatke i predmete u odnosu na nesortirane

Sortiranje Potreba

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Problem sortiranja možemo definirati na sljedeći način:

– ULAZ: sekvenca {𝒂𝟏, 𝒂𝟐, … , 𝒂𝒏} brojeva

– IZLAZ: permutacija {𝒂′𝟏, 𝒂′𝟐, … , 𝒂′𝒏} takva da vrijedi da je 𝒂′𝟏 ≤ 𝒂′𝟐 ≤ 𝒂′𝒏 ili 𝒂′𝟏 ≥ 𝒂′𝟐 ≥ 𝒂′𝒏

• Primjer:

– ULAZ: 2, 5, 9, 13, 7, 6

– IZLAZ: 2, 5, 6, 7, 9, 13 ili 13, 9, 7, 6, 5, 2

Sortiranje Problem

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sortiranje velike količine podataka i uz računala može dugo trajati

• Neki od algoritama koji efikasno rade sortiranje su

Sortiranje Algoritmi - postupci

Algoritam Skupina

Sortiranje izborom najmanjeg elementa (selection sort) Zamjena elemenata

Sortiranje zamjenom susjednih elemenata (bubble sort)

Jednostavno sortiranje umetanjem (insertion sort) Sortiranje umetanjem

Višestruko sortiranje umetanjem (shell sort)

Sažimanje sortiranih polja (merge)

Rekurzivni Sortiranje sažimanjem (merge sort)

Brzo sortiranje (quick sort)

Sortiranje obilaskom binarnog stabla traženja (tree sort) Binarna stabla

Sortiranje pomoću hrpe (heap sort)

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sortiranje izborom najmanjeg elementa (engl. “Selection sort”) bira najmanji element i dodaje ga na prvo mjesto, pa sljedeći najmanji dodaje na drugo mjesto, itd.

• Algoritam radi na sljedeći način

– Prođe se poljem i pronađe se najmanji element

– Zatim se najmanji element zamjeni sa početnim

– Dalje se promatra ostatak polja (bez početnog elementa) i ponavlja se isti postupak

Sortiranje Selection sort

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Selection sort Primjer

• Pronađi najmanji element niza i zamijeni ga s prvim elementom niza

• Ponavljaj s ostatkom niza, smanjujući nesortirani dio

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Selection sort Analiza složenosti

• U prvoj iteraciji imamo n-1 usporedbi, a u svakom idućem prolasku broj usporedbi se smanji za 1.

f(n) = (n - 1) + (n - 2) + (n - 3) + … + 2 + 1 = n (n - 1) / 2

• U svakom prolasku osim toga imamo još 3(n - 1) operacija pridruživanja

• Ukupni broj operacija je

f(n) = n (n - 1) / 2 + 3(n - 1) = O(n2)

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Selection sort Implementacija C#

Sortiranje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sortiranje zamjenom susjednih elemenata (engl. “bubble sort)” je sličan Selection sort-u

• Radi na način da mijenja dva susjedna elementa ako je prvi od dva veći od drugoga

• Pseudokôd ovog algoritma je sljedeći

– Kreni od početka niza prema kraju

– Zamijeni 2 elementa ako je prvi veći od drugog

– Ako u prolasku kroz cijeli niz nije bilo zamjene, niz je sortiran

Sortiranje Bubble sort

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Bubble sort

Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• O(n2) - otprilike n2/2 usporedbi i n2/2 zamjena u prosječnom i u najgorem slučaju

– Kad su ulazni elementi blizu svojih mjesta može se brzo završiti

– Najgori slučaj • Naopako sortiran niz

– Najbolji slučaj • Već sortiran niz

• Položaj elemenata je bitan za učinkovitost

– Veliki elementi na početku niza nisu problem • Brzo idu na kraj

– Mali elementi na kraju niza su problem • Polako idu prema vrhu

Bubble sort Analiza složenosti

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Bubble sort Implementacija C#

Sortiranje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Jednostavno sortiranje umetanjem (engl. “Insertion sort”) se temelji na principu ubacivanja pojedinog elementa na odgovarajuće mjesto

• Skup elemenata koji se sortiraju podjeli se na sortirani i nesortirani

Sortiranje Insertion sort

• Zatim se svakim korakom povećava sortirani dio na način, da se iz nesortiranog dijela uzima prvi element i ubacuje se na odgovarajuće mjesto u sortiranom dijelu

• Takav postupak traje dok sve elemente ne ubacimo u sortirani niz

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Insertion sort Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Insertion sort ima složenost O(n2) kao i kod algoritma koji rade na principu zamjene - bubble i selection sort

• Unatoč tome njegovo prosječno trajanje izvršavanja nešto je kraće, te je stabilniji

• Najgori slučaj

– Naopako sortiran niz

• Najbolji slučaj

– Već sortiran niz

Insertion sort Analiza složenosti

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Insertion sort Implementacija C#

Sortiranje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Brzo sortiranje (engl. “quick sort”) spada u klasu algoritama „podjeli pa vladaj”(engl. “devide-and-conquer”) i rekurzivan je

• Ovaj algoritam izumio je C. A. R. Hoare 1962. godine

• Primjene u praksi pokazuju kako je ovo jedan od najboljih algoritama za sortiranje uopće

• Bolji algoritmi rade samo sa određenim specifičnim tipovima podataka (npr. int)

Sortiranje Quick sort

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Osnovna ideja ovog algoritma je da se odabere jedan element iz niza i proglasi ga se pivot elementom

• Ostatak niza posloži se oko ovog pivot elementa tako da s lijeva budu elementi koji su <= od pivota, a s desna oni koji su >= od pivota

• Time postižemo da je pivot "na pravom" mjestu

• Lijevi i desni pod-niz se sortira rekurzivnim pozivom istog algoritma

Quick sort

Ideja

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Quick sort Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Quick sort Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Quick sort Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Ovaj algoritam u najgorem slučaju ima složenost O(n2)

– Najgori slučaj nastupa kada se već dobije sortirani skup te se kao pivot element odabere prvi element iz skupa

– Može se postići da vjerojatnost da takav slučaj nastupi eksponencijalno pada

• Postoji matematički dokaz da je prosječno vrijeme izvršavanja O(n log n)

• Brzina izvršavanja zavisi o načinu biranja pivot elementa, tako se najčešće za pivota bira

– Početni element

– Posljednji element – kao u našim primjerima

– Medijan krajnja dva elementa

Quick sort Analiza složenosti

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Quick sort Implementacija C#

Sortiranje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Naziv Najbolje Prosječno Najgore Stabilan

Selection sort O(n2) O(n2) O(n2) ne

Bubble sort O(n) - O(n2) da

Insertion sort O(n) O(n2) O(n2) da

Quick sort O(nlogn) O(nlogn) O(n2) ne

Sortiranje Usporedba

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Usporedba algoritama sortiranja Sa složenošću O(n2)

Preuzeto: Autorizirana predavanja - Algoritmi i strukture podataka, FER, 2007/08

Poveznica: http://www.fer.unizg.hr/_download/repository/ASP-Sortovi.pdf

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Usporedba algoritama sortiranja Sa složenošću O(n log n)

Preuzeto: Autorizirana predavanja - Algoritmi i strukture podataka, FER, 2007/08

Poveznica: http://www.fer.unizg.hr/_download/repository/ASP-Sortovi.pdf

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Pretraživanje je postupak traženja točno određenog podatka iz nekog skupa podataka

• Pretraživanje podataka je jedna od fundamentalnih stvari u programiranju i često se koristi u različitim oblicima

• Primjeri su

– Telefonski imenici

– Tražilice na WEB-u

– Popis birača, studenata, …

– …

• Uvijek je cilj dobiti točnu informaciju u što kraćem vremenskom roku

Pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Kako vrlo često postoje veliki skupovi podataka koji se pretražuju potrebno je razviti prikladne algoritme

• Naravno vrsta tražene informacije često ima veliki utjecaj na odabir algoritma za pretragu

• Neki od algoritama za pretraživanje su

– Linearno ili slijedno pretraživanje

– Binarno pretraživanje

– Binarna stabla pretraživanja

– Hash tablice

– …

Pretraživanje

Njima ćemo se baviti

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Linearno pretraživane je najjednostavnije i najčešće korišteno pretraživanje

• Princip je jednostavan, kreće se od prvog elementa i provjerava se vrijednost svakog elementa sa traženom vrijednosti i tako do zadnjeg elementa, kada se pronađe tražena vrijednost pretraživanje završava

• Ovo pretraživanje je ujedno i najsporije

– Ako imamo n elemenata u skupu kojeg pretražujemo u najgorem slučaju nam je potrebno O(n) operacija

• Traženi element se nalazi na posljednjem mjestu

– U najboljem slučaju nam je potrebno O(1) operacija

• Traženi element se nalazi na prvom mjestu

Pretraživanje

Linearno ili slijedno

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Linearno ili slijedno

Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Linearno ili slijedno

Implementacija C#

LinearnoPretrazivanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Sadržaj

– Sortiranje

• Sortiranje izborom najmanjeg elementa (selection sort)

• Sortiranje zamjenom susjednih elemenata (bubble sort)

• Jednostavno sortiranje umetanjem (insertion sort)

• Brzo sortiranje (quick sort)

– Pretraživanje

• Linearno ili slijedno pretraživanje

• Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Ukoliko je skup po kojem se pretražuje sortiran moguće je skratiti pretraživanje

• Binarno pretraživanje radi sa sortiranim skupom

• Osnovna ideja binarnog pretraživanja je podjela skupa u pod-nizove

• Na početku se odrede tri indeksa low, high koji označavaju početak i kraj niza/pod-niz, a mid srednji element niza/pod-niza

• U sljedećem koraku se tražena vrijednost uspoređuje sa mid-om te se onda dalje razlaže lijevi ili desni pod-niz sve dok vrijednost mid-a ne bude jednaka traženoj

Pretraživanje

Binarno pretraživanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

• Srednja vrijednost mid se računa po sljedećem izrazu

mid = (low + high) / 2

• Gdje je

– low - indeks prvog elementa pod niza,

– high - indeks zadnjeg elementa pod niza,

– mid - indeks srednjeg elementa pod niza

• Ukoliko je broj elemenata u pod nizu paran, rezultat za mid se zaokružuje na donju vrijednost

Binarno pretraživanje

Izračun mid-a

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Binarno pretraživanje

Primjer

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Binarno pretraživanje

Implementacija C#

BinarnoPretrazivanje

ZITS :: Algoritmi i programiranje :: Sortiranje i pretraživanje © 2013 Carić, Ivanjko

Binarno pretraživanje

Implementacija C# - rekurzivno

BinarnoPretrazivanjeRekurzivno