sortiranje i pretraživanje - weboteka.net i programiranje/e-student/008_2013-04-29 p08... ·...
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
• Animacije algoritama sortiranja mogu se pronaći na sljedećim poveznicama – http://www.solidware.com/sort/
– http://www.sorting-algorithms.com/
– http://www.cs.hope.edu/~dershem/ccaa/animator/Animator.html
– Google…
Sortiranje Animacije
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