Uploaded by katicabozicc

moja prepravljena skript uua

advertisement
SKRIPTA SA PITANJIMA I ODGOVORIMA
Ispitna pitanja:
1.Algoritam (opis, osobine, modeli računanja, analogija sa programom, pseudokod)
2.Analiza algoritma i asimptotske notacije
3.Problem pretrage (opis, algoritmi linearne i binarne pretragei njihove osobine)
4.Problem sortiranja (opis, nabrojati algoritme i njihove osobine)
5.Selection sort algoritam
6.Insertion sort algoritam
7.Merge sort algoritam(princip “podeli i osvoji“, opis,...)
8.Quicksort algoritam
9. Heapsort algoritam
10. Heapstruktura podataka (opis, metode, namena)
11.Red sa prioritetima (operacije, realizacija, primena)
12.Poređenje kao model računanja (stablo odlučivanja)
13.Algoritmi sortiranja složenosti (n)
14. Redosledna statistika (opis, min, max, jednovremeni min i max, medijana)
15. Strukture podataka–stek,red i stabla uopšteno (organizacija podataka, operacije, osobine, namena)
16.Strukture podataka –liste (organizacija podataka, operacije, osobine, namena)
17.Binarno stablo pretrage
18.Crveno-crno stablo
19.AVL stablo
20. Prošireno Crveno-crno stablo(stablo redosledne statistike i intervalno stablo)
21. Rečnik podataka i heširanje (primene, priheš i heš, kolizije, amortizovano vreme izvršavanja)
22.Heširanje ulančavanjem
23.Otvoreno adresiranje
24.Fibonačijev hip
25.2-3-4 stabloi B-stablo
26.Složenost računanja i klase problema (P, NP, EXP, R, problem odlučivanja, primeri)
27.NP problemi (definicija P i NP problema, vrste NP problema, redukcija)
28.Sekvencijalni i paralelni algoritmi (opis, Amdalov zakon, primeri i poteškoće implementacije)
29.Grafovi (definicija, tipovi, primena, vrste algoritama)
30.Topološko sortiranje grafa
31.Obilazak grafa u širinu
32.Obilazak grafa u dubinu
33.Najkraći put u grafu (definicija, varijante, algoritmi)
34.Dijkstraalgoritam
35.Bellman-Fordalgoritam
36.Floyd-Warshallalgoritam
37.Minimalno stablo razapinjanja(problem, ideja, Kruskalalg., Primalg.)
38.Dinamičko programiranje: primer sečenja cevi
39.Dinamičko programiranje: primer poravnavanja teksta
40.Dinamičko programiranje: primer zagrada
41.Algoritam za nalaženje najduže zajedničke podsekvence(definicijesekvence, stringa..., LCS alg.)
42.Algoritmipodudanja stringova(alg.: naivni, Rabin-Karp, konačnim automatom, KMP)
1. ALGORITAM (OPIS, OSOBINE, MODELI RAČUNANJA, ANALOGIJA SA PROGRAMOM, PSEUDOKOD)
Algoritam je skup koraka za obavljanje zadatka.
Algoritam je matematička apstrakcija računarskog programa. Algoritam je račun(ar)ska procedura za
rešavanje nekog problema.
Od algoritma očekujemo:
- konkretno, tačno rešenje (navigacija nam daje najkraći put, ali negde je moguće dati samo optimalno
rešenje)
- algoritam treba da bude BRZ!
Postoje složeni (teški) problemi za čije rešavanje nemamo poznate efikasne algoritme
– Paralelni i distribuirani proračuni (algoritmi) pomažu u primeni „grube sile“, ali ni to nije uvek dovoljno
OSOBINE
-
modularnost (izmenjivost) -odnosi se u smislu održavanja
funkcionalnost-širina problema koje pokriva
robusnost (pouzdanost)-obično je potrebna kod numeričkih proračuna
lakoća razumevanja-misli se na lakoću implementacije
proširivost
pouzdanost,
brzina
zauzeće memorije
MODELI RAČUNANJA SU ODREĐENI SA:
Operacijama koje su dozvoljene
Trajanje svake operacije
Ukupna “cena” algoritma = suma „cena“ svih operacija
OPŠTI MODELI RAČUNANJA (Programski jezici obično omogućavaju oba modela računanja)
RAM (Random Access Machine)
Pointer Machine
RAM – je apstraktna mašina u opštoj klasi registarskih mašina. Koncept mašine sa slučajnim pristupom počinje sa
najjednostavnijim modelom, takozvanim modelom brojačke mašine. Međutim, dve osobine ga razlikuju od brojačke
mašine. Prva je indirektno adresiranje, a druga čini da model teži ka više konvencionalnim kompjuterimabaziranim
na akumulatoru, koji imaju jedan ili više pomoćnih registara, od kojih se najpoznatiji naziva "akumulator". Modeluje
se kao dugačak niz reči.
O(1) SU OPERACIJE:
pristup reči u RAMu (na bilo kojoj adresi) ili registru (promenljivoj)
čitanja, pisanja vrednosti, računanja (+,-,*,/,..)
Pointer Machine – Objekti se dinamički formiraju (alociraju). Pristup poljima objekta je Teta(1).
Osobina je da polje sadrži reč ili pokazivač na objekat (NULL – ništa).
PSEUDOKOD – je apstraktan, formalan jezik za opis algoritma. Tipično struktuiran engleski
jezik. Razumeju ga ljudi - matematičari i ne mora se prevoditi u računaru. On je nezavisan od programskog jezika i
oslanja se na model računanja a ne na računar
2. ANALIZA ALGORITMA I ASIMPTOTSKE NOTACIJE
BRZINA IZVRŠAVANJA PROGRAMA (KOJI IMPLEMENTIRA ALGORITAM) ZAVISI OD:
– Računara na kome se izvršava
– Programskog jezika u kome je implementiran
– Prevodioca (kompajlera ili interpretera)
– Umeća programera
Procena brzine programa nastalog na osnovu algoritma nije jednostavna: nemoguće je tačno predvideti
brzinu izvršavanja.
STOGA PROCENA BRZINE ALGORITMA SE SVODI NA:
 Kako trajanje algoritma zavisi od veličine ulaza 𝑛?
 Kako se trajanje algoritma produžava sa povećanjem ulaza?
Za mali ulaz (malo 𝑛) treba malo vremena – ne razmatra se.
Veliki ulaz (veliko 𝑛) značajno utiče na vreme izvršavanja – važno je!
Vreme izvršavanja zavisi od podataka.
–
–
–
Najbolji slučaj – od male je koristi
Uobičajen slučaj – ima smisla razmatrati
Najgori slučaj – najčešće se analizira
PRIMER: Neka algoritam pretrage zahteva 50𝑛 + 125 mašinskih instrukcija
– za 𝑛 ≥ 3 član 50𝑛 dominira, tako da za 𝑛 >> 1 član 125 zanemarujemo
– vreme izvršavanja je ~50 * 𝑛 * 𝑡i, gde je 𝑡𝑖 prosečno vreme izvršavanja jedne instrukcije
Kako se 50*𝑡𝑖 menja od računara do računara ni njega ne uzimamo u obzir nego navodimo (u ovom
slučaju) da je trajanja algoritma linearno srazmerno sa 𝒏, tj. traje 𝑐 ∙ 𝑛, gde je 𝑐 konstanta.
ZA OVAJ PRIMER, VREME IZVRŠAVANJA LINEARNO RASTE SA 𝑛, TJ. SLOŽENOST ALGORITMA JE
SRAZMERNA SA 𝑛. KONKRETNO TO ZNAČI DA DUPLO POVEĆANJE VELIČINE ULAZA ZAHTEVA DVA PUTA
DUŽE IZVRŠAVANJE ALGORITMA!
Približno procenjujemo vreme izvršavanja algoritma u zavisnosti od veličine ulaza 𝑛 (i to kada je 𝑛
veliko).
Trajanje implementiranog algoritma je 𝑓 𝑛 = 50𝑛 + 125 Složenost označavamo kao 𝑂 𝑔 𝑛 = 𝑂(𝑛)
NOTACIJE
- notacija – opisuje vreme izvršavanja algoritma. Odnosi se na obe granice trajanja algoritma
(najkraće i najduže trajanje). -notacija asimptotski ograničava funkciju sa obe strane.
- 𝑂 notacija – koristi se da opiše najgore slučajeve. O-notacija asimptotski ograničava funkciju sa
gornje strane.
- notacija – koristi se da opiše najbolje slučajeve. -notacija asimptotski ograničava funkciju sa
donje strane.
3. PROBLEM PRETRAGE (OPIS, ALGORITMI LINEARNE I BINARNE PRETRAGE I NJIHOVE OSOBINE)
Problem pretrage niza elemenata ili strukture se odnosi na traženje ključa u određenom nizu. U zavisnosti
od modifikacije algoritama, ključ može biti broj indeksa prvog elementa sa zadatom vrednošću odnosno brojevi
indeksa svih elemenata koji imaju jednaku zadatu vrednost.
Problem pretrage biva unapređen tako što se niz prvo sortira, pa se od linearne složenosti O(n), dođe do
rešenja logaritamske složenosti O(log2n), što je dosta bolje u odnosu na linearnu složenost.
BINARNA PRETRAGA
Binarna pretraga zahteva sortiran niz kao ulaz (on se pretražuje). Brzina algoritma je O(log2n).
IDEJA ALGORITMA:
Kako su podaci(ključevi) sortirani npr. u rastućem redosledu, prvo očitamo vrednost na sredini niza.
Zatim:
1. Ako je to tražena vrednost onda je pretraga gotova.
2. Ako je vrednost manja od tražene, onda je tražena vrednost u levoj polovini niza.
3. Ako je ta vrednost veća od tražene, onda je tražena vrednost u desnoj polovini niza
Time se prepolovi deo niza od interesa i postupak se sprovodi iterativno u podnizovima koji se smanjuju sve dok ne
ostane samo jedan elemenat u podnizu.
U svakoj iteraciji se posmatra deo podataka od indeksa 𝑝 do indeksa 𝑟
Posmatra se sredina niza, tj. indeks 𝑞 = (𝑝+𝑟) / 2.
LINEARNA PRETRAGA
Naziva se sekvencijalna pretraga zato što pronalazi samo prvu dojavu.
Linearna pretraga ne zahteva sortiran niz kao ulaz. Brzina algoritma je O(n) kada se traženi ključ nalazi na
kraju niza. Dok u najboljem slučaju ona iznosi Omega(1) kada se traženi ključ nalazi na početku niza.
SLUČAJ ZA KOD PRONAĐI SVE:
Najgori slučaj: 𝑇(𝑛) = 𝑐1 + 𝑐2 + 𝑐3(𝑛 + 1) + 𝑐4𝑛 + 𝑐5𝑛 + 𝑐6𝑛 + 𝑐7 𝑇(𝑛) = (𝑐3 + 𝑐4 + 𝑐5 + 𝑐6)𝑛 + 𝑐1 + 𝑐2 + 𝑐3 + 𝑐7 = 𝑂(𝑛) •
Najbolji slučaj: 𝑇(𝑛) = 𝑐1 + 𝑐2 + 𝑐3(𝑛 + 1) + 𝑐4𝑛 + 𝑐7 𝑇(𝑛) = (𝑐3 + 𝑐4)𝑛 + 𝑐1 + 𝑐2 + 𝑐3 + 𝑐7 = Ω(𝑛)
• Zaključak: vreme izvršavanja algoritma je (𝑛).
SLUČAJ ZA KOD PRONAĐI PRVOG:
Najgori slučaj: 𝑇(𝑛) = 𝑐1(𝑛 + 1) + 𝑐2𝑛 + 𝑐4 𝑇(𝑛) = (𝑐1 + 𝑐2)𝑛 + 𝑐1 + 𝑐4 = 𝑂(𝑛)
• Najbolji slučaj: 𝑇(𝑛) = 𝑐1 + 𝑐2 + 𝑐3 = Ω(1)
• Zaključak: vreme izvršavanja algoritma je 𝑂(𝑛)
4.
PROBLEM SORTIRANJA (OPIS, NABROJATI ALGORITME I NJIHOVE OSOBINE)
Sortiranje elemenata se prvenstveno radi u korist lakše pretrage niza ili niza struktura. Ulaz u funkciju
sortiranja jeste niz/niz struktura (sortira se prema određenom polju) i on se naziva ključ (sort key), a kao
izlaz dobija se permutacija elemenata u redosledu koji smo hteli da postignemo (opadajući/rastući).
Složenost algoritama sortiranja je ʘ(n2) ili ʘ(nlog2n)
Da bi pretraga bila brza prethodno sortirati podatke!
– Kada se pretraga koristi? -Veoma često ...
– Kada se sortiranje isplati?- Ako je pretraga česta.
– Kako se sortira?- Algoritmom za sortiranje.
– Kako se pretražuje? -Algoritmom binarne pretrage.
ALGORITMI ZA SORTIRANJE
– Sortiranje izborom – Selection Sort
– Sortiranje umetanjem – Insertion Sort
– Sortiranje objedinjavanjem – Merge Sort
– Sortiranje razdvajanjem – Quick Sort
–
5.SELECTION SORT ALGORITAM
U zavisnosti od toga da li tražimo rastući ili opadajući niz algoritam traži minimalni ili maksimalni element
u nizu i stavlja ga na prvo mesto. Zatim traži sledeći min/max element i stavlja ga na drugo mesto u nizu i
tako dok se ne sortira kompletan niz.
Selection Sort je stabilan algoritam koji radi u mestu (radi sa originalnim nizom, ne kreira pomoćni niz).
STABILAN ALGORITAM
Posmatraju se pozicije jednakih ključeva pre i nakon sortiranja i ako je njihov međusobni redosled (ne
pozicija) nepromenjen sortiranjem onda je algoritam stabilan.
Objašnjejne za sliku desno:
Za svaku poziciju (do pretposlednjeg) bira se najmanji broj od preostalih belih kucica,da se postavi na poziciju
narandžastog. Primetiti da su levo od pozicije sortirani brojevi. Za poslednji broj nema šta da se radi jer je on
najveći.
VREME IZVRŠAVANJA SELECTION SORT
Algoritam ima 𝑛 − 1 spoljašnju iteraciju (spolješnja petlja) - U okviru svake iteracije postoji unutrašnja
petlja od 𝑛 − 𝑖 prolaza.
Odakle vidimo da je složenost algoritma
(𝑛2):
DODATNA OSOBINA: Maksimalan broj zamena elemenata u nizu je 𝑛 − 1, tj. (𝑛).
6. INSERTION SORT ALGORITAM
-algoritam je sličan postupku ređanja karata u ruci
U algoritmu se svi elementi se ponašaju kao nesortirani.
Kada započne sortiranje, funkcija smešta sortirane brojeve na levu stranu, a nesortirani ostaju na desnoj.
Za početak sortiranog niza se uzima elemenat na prvom indeksu.
Sledeći korak je umetnuti elemenat na drugom indeksu u sortiran niz, tako što ćemo ga porediti sa prvim
elementom iz soriranog dela. Svaki sledeći element će biti umetnut u sortiran niz poređenjem sa svim
elementima od kojih je manji odnosno veći + 1 u tom delu niza.
Insertion Sort je stabilan algoritam koji radi u mestu (radi sa originalnim nizom, ne kreira pomoćni niz).
STABILAN ALGORITAM
Posmatraju se pozicije jednakih ključeva pre i nakon sortiranja i ako je njihov međusobni redosled (ne
pozicija) nepromenjen sortiranjem onda je algoritam stabilan.
Objašnjenje slike desno:
Narandžasti je ključ i pomera se u levo dok mu se ne pronađe mesto. Najmanje 0 pomeranja;najvise
j tj 1 pomeranaj
VREME IZVRŠAVANJA INSERTION SORT
Najgori slučaj je 𝑂(𝑛2) dok je najbolji (onaj koji ne možemo očekivati) slučaj (𝑛).
PROSEK: svaki elemenat koji se umeće neka je manji od polovine do tada umetnutih, tj. (𝑖 − 1)/2.
( ½ se zanemaruje << n2) pa je (𝑛2). Međutim, ukoliko je početni niz „skoro“ sortiran, tj. pretpostavimo
da je svaki elemenat udaljen od svog konačnog mesta za oko 𝑘 mesta, tada je potrebno 𝑘𝑛 pomeranja
elemenata, tj. složenost je (𝑛).
• Najbolji slučaj (A je na početku sortiran), 𝑡𝑗 = 1

7.
Najgori slučaj (A je sortiran ali u obrnutom redosledu), 𝑡𝑗 = j
MERGE SORT ALGORITAM (PRINCIP PODELI I OSVOJI, OPIS, ...)
Ovaj algoritam se razlikuje od Selection i Insertion sort-a:
– Njegovo vreme izvršavanja je (𝑛 log2𝑛), što je znatno brže kada se gledaju najgori slučajevi druga dva algoritma 𝑂(𝑛2)
– Konstantan faktor u asimtotskoj notaciji je veći nego kod drugih algoritama – sporiji je za malo 𝑛
– Ne radi „u mestu“. Ne može da pomera elemente u nizu A, nego radi sa kopijama niza.
PRINCIP PODELI I OSVOJI
Zadatak se deli na podzadatke koji su slični originalnom zadatku. Podzadaci se rešavaju rekurzijom i
njihova rešenja se kombinuju da bi se rešio originalan zadatak.
1. PODELI – zadatak se deli na manje zadatke koji su slični originalu
2. OSVOJI – manji zadaci se rešavaju rekurzivno. Kada je sasvim mali, zadatak je trivijalan (base case)
3. KOMBINUJ – rešenja podeljenih zadataka se objedinjuju da bi se dobilo rešenje originalnog zadatka
PRIMENA PODELI I OSVOJI NA MERGE SORT
1.
2.
3.
PODELI – deli niz od 𝑛 elemenata na dva jednaka podniza sa 𝑛/2 elemenata svaki (ako je 𝑛 neparno
prvi podniz ima element više) – Prvi podniz 𝐴[𝑝. . 𝑞], – Drugi podniz 𝐴[𝑞 + 1. . 𝑟] , 𝑝 ≤ 𝑞 < 𝑟
OSVOJI – svaki od dva podniza se nezavisno sortira upotrebom Merge sort-a. Pri tome se
primenjuje rekurzija tako da se jedna polovina niza deli na svoje polovine i tako sve dok se ne
dobije podniz sa jednim elementom.
KOMBINUJ – dva sortirana podniza se objedinjuju u jedan sortiran niz. – Podnizovi 𝐴[𝑝. . 𝑞] i 𝐴[𝑞 +
1. . 𝑟] se kombinuju (engl. merge) u 𝐴[𝑝. . 𝑞]
VREME IZVRŠAVANJA MERGE SORT
Vreme izvršavanja je (𝑛log2𝑛), što je znatno brže kada se gledaju najgori slučajevi drugih algoritama
𝑂(𝑛2).
Suma=cnlog2n
8.
QUICK SORT ALGORITAM
Brzo sortiranje je podeli pa vladaj algoritam koji se oslanja na particiju rada: na izabranu particiju niza
elementa poznatijeg kao pivot. Svi elementi manji od pivota se stavljaju ispred njega i svi veći
elementi iza njega. Ovo se može efikasno uraditi u linearnom vremenu i u mestu. Manji i veći
podnizovi su rekurzivno sortirani.
Konstantan faktor u asimtotoskoj notaciji je manji nego kod Merge sort algoritma
Praktično se često koristi!
PRIMENA PODELI I OSVOJI NA QUICK SORT
1.
PODELI – poslednji elemenat iz niza se uzima za pivot i stavlja se na sredinu niza, tako da se sa
leve strane nalaze elementi manji od pivota, a sa desne strane svi veći od pivota. Algoritam isti postupak
radi i sa podnizovima dok ne dođe do base cases. Tada su elementi već sortirani, ali ih treba spojiti nazad
u niz.
2.
OSVOJI - svaki od delova se nezavisno sortira rekurzivnim pozivima Quicksort-a.
3.
KOMBINUJ - ne treba ništa raditi jer je niz 𝐴 sortiran
VREME IZVRŠAVANJA QUICK SORT
Vreme izvršavanja zavisi od odnosa vrednosti u nizu
– Ako je podela (engl. partitioning) balansirana vreme je (𝑛 log2𝑛)
– Kod nebalansirane podele vreme je (𝑛2)
• Nebalansirana podela je najgori slučaj: od 𝑛 elemenata proizvodi podgrupe sa 𝑛 – 1 i 0 elemenata (𝑛-ti element
j3 pivot)
– Npr. svi elementi su manji od pivota
– Tada je 𝑇(𝑛) = 𝑇(𝑛 − 1) + 𝑇(0) + Θ(𝑛)
𝑇(𝑛) = Θ(𝑛2)
• Najbolji slučaj: od 𝑛 elemenata se proizvode 2 podgrupe sa 𝑛/2 elemenata
– Tada je 𝑇(𝑛) = 2𝑇(𝑛/2) + Θ(𝑛)
𝑇(𝑛) = Θ(𝑛 log2 𝑛)
Balansirano particionisanje – Prosečan slučaj je mnogo bliži najboljem nego najgorem slučaju
Poželjno je izbeći nebalansirane podele
– Npr. ako je na početku niz sortiran u opadajućem redosledu
• Poboljšanje rešenja: ne uzimati uvek poslednji element kao pivot
– Na početku PODELI (Partition) procedure zameniti 𝐴[𝑟] sa slučajno izabranim elementom iz
𝐴[𝑝. . 𝑟], čime je pivot slučajno odabran.
• Ideja: slučajno izabrati tri elementa i onaj koji ima srednju vrednost postaviti za pivota.
9.
HEAP SORT ALGORITAM
Koristi se posebna struktura podataka heap (“hip”), po kojoj je algoritam dobio ime.
Heap je pogodan za implementaciju efikasnog niza sa prioritetima (Priority Queue).
Složenost algoritma iznosi (𝑛 log2𝑛).
Brzina algoritma je odlična, ali je od njega bolji dobro implementiran Quicksort
Algoritam radi u mestu jer se promene mesta elemenata odvijaju u istom fizičkom nizu.
Algoritam započinje IZGRADI-HEAP metodom. Nadalje najveći elemenat u nizu (koji je u korenu hipa)
zamenjuje sa poslednjim elementom niza A, skraćuje niz za 1 i koriguje poredak (poziv Max-Hipify (A, 1) ).
Nastavlja se sa prethodnim korakom dokle god ima elemenat u nizu A.
Visina hipa od 𝑛 elemenata je broj logičkih nivoa ℎ = log2𝑛.
Složenost sortiranja hipom je O(nlog2n)
OPERACIJE SA HIPOM
– REORGANIZUJ-HIP (Max-Heapify) održava max-heap osobinu (složenost 𝑂(log2𝑛))-izgradnja Heap-a
• Ako je u korenu podstabla vrednost manja nego u „deci“, proslediti tu vrednost „na dole“ tako da
se održi osobina Heap-a.
– IZGRADI-HIP (Build-Max-Heap) pravi max-heap na osnovu nesortiranog ulaznog niza (složenost
𝑂(𝑛))
Koristi se Reorganizuj-Hip metoda tako što se primeni (unazad) na svim elementima hipa koji nisu
lišče (imaju dete)
– SORTIRAJ-HIPOM (Heapsort) sortira niz u mestu (složenost 𝑂(nlog2𝑛))
Hip struktura je pogodna za realizaciju reda sa prioritetima (složenost operacija 𝑂(log2𝑛))
10. HEAP STRUKTURA PODATAKA (OPIS, METODE, NAMENA)
Hip je niz elemenata koji se može predstaviti (logički) kao binarno stablo.
Binarno stablo je skoro kompletno, tj. moguće je da poslednji nivo nije popunjen do kraja.
VRSTE HIPA
– MAX-HEAP (ima osobinu A[Roditelj(i)] A[i]), najveći elemenat je u korenu
– MIN-HEAP (ima osobinu A[Roditelj(i)] A[i]), najmanji elemenat je u korenu
Levo nije hip; desno jeste mim heap
OPERACIJE SA HIPOM
– REORGANIZUJ-HIP (Max-Heapify) održava max-heap osobinu (složenost 𝑂(log2𝑛))
– IZGRADI-HIP (Build-Max-Heap) pravi max-heap na osnovu nesortiranog ulaznog niza (složenost
𝑂(𝑛))
– SORTIRAJ-HIPOM (Heapsort) sortira niz u mestu (složenost 𝑂(nlog2𝑛))
NAMENA HIP STRUKTURE
Hip struktura je pogodna za realizaciju reda sa prioritetima (složenost operacija 𝑂(log2𝑛))
11. RED SA PRIORITETIMA (OPERACIJE, REALIZACIJA, PRIMENA)
Priority Queue organizuje skup podataka S gde svaki elemenat ima udružen prioritet kao „ključ“.
MAX PRIORITY QUEUE PODRŽAVA OPERACIJE
– DODAJ(S, X) dodaje elemenat x u skup S (S = S {x}) (INSERT).
– MAKSIMUM(S) vraća element iz S sa najvećim ključem (MAXIMUM).
– IZDVOJ-MAKSIMUM(S) uklanja i vraća element iz S sa najvećim ključem (EXTRACT-MAX).
– POVEĆAJ-KLJUČ(S,x,k) povećava vrednost (ključa) elementa x na k (pod uslovom da je k > tekućeg
ključa)
PRIMER UPOTREBE
Raspoređivač zadataka u operativnom sistemu u redu sa prioritetima čuva zadatke spremne na
izvršenje.
12. POREĐENJE KAO MODEL RAČUNANJA (STABLO ODLUČIVANJA)
Model računanja koji se oslanja na poređenje se može primeniti na proizvoljan tip podataka tj. elementi
koje posmatramo su apstraktni tipovi podataka (ADTs – Abstract Data Types).
Postoje operacije poređenja elemenata (>, ≤, …)
Trajanje algoritma (u modelu poređenja) se iskaže brojem operacija poređenja.
Svaki algoritam gde se upotrebljava model poređenja može se prikazati kao stablo sa svim mogućim
ishodima poređenja (za dato 𝑛).
Primer BINARNA PRETRAGA (𝑛 = 3)
STABLO ODLUČIVANJA
– Unutrašnji čvorovi (na svim nivoma sem donjeg) imaju binarne odluke: 0-1 ili Da-Ne
– List (na donjem nivou) je izlaz (algoritam je gotov)
– Putanja od korena (gonji čvor) do lista predstavlja izvršavanje algoritma
– Dužina putanje (dubina) odgovara vremenu izvršavanja
– Visina stabla je najgori slučaj izvršavanja algoritma (predstavlja najdužu putanju)
DONJA GRANICA BRZINE PRETRAGE
Svih 𝑛 elemenata je preprocesirano (npr. sortirano)
Broj listova ≥ broja mogućih odgovora ≥ – (barem jedan ishod za svaki elemenat A(i) )
Stablo odlučivanja je binarno stablo
Visina stabla ≥ log2𝑛
ZAKLJUČAK: Problem pretrage u modelu poređenja je složenosti Ω(log2𝑛). Binarna pretraga je
optimalna (kada se posmatra u modelu poređenja).
Sortiranje u modelu poređenja je složenosti Ω(log2𝑛).
13. ALGORITMI SORTIRANJA SLOŽENOSTI O(N)
Dosadašnji algoritmi sortiranja koriste međusobna poređenja vrednosti.
Model poređenja pokazuje da je najmanja složenost Ω(log2𝑛).
Moguće je realizovati brži algoritam gde vreme trajanja linearno raste sa veličinom niza.
Primeri takvih algoritama su: Counting sort, Bucket sort i Radix Sort.
Oni su brži od teorijske granice jer upotrebljavaju dodatne informacije, a ne oslanjaju se samo na
poređenje vrednosti (counting sort zahteva da su ključevi celi brojevi u manjem opsegu).
COUNTING SORT
Algoritam podrazumeva da se sortiraju brojevi koji su u opsegu 0. . 𝑘
• Princip: za svaki element 𝑥, algoritam izbroji koliko ima brojeva manjih od 𝑥 – Primer: ako postoji 17 brojeva
manjih od 𝑥, onda se 𝑥 nalazi na 18. poziciji u sortiranom nizu
Implementacija algoritma ima dva dodatna niza
– 𝐵[1. . 𝑛] je niz sortiranih brojeva
– 𝐶[0. . 𝑘] je privremeni niz
Algoritam ima 3 koraka:
1. prebroji pojave iste vrednosti i zapiše u niz C
2. napravi kumulativnu sumu pojava da dobije pozicije gde će se naći poslednje pojave iste vrednosti
3. rasporedi vrednosti u novi niz B
Algoritan je stabilan – brojevi iste vrednosti se u
izlaznom nizu pojavljuju u istom poretku kao što
su u ulaznom nizu. Algoritam ne radi u mestu
(koristi dva pomoćna niza B – niz sortiranih, C –
niz privremenih).
Algoritam radi sa pozitivnim celim brojevima.
Složenost algoritma ja Θ(𝑛 + 𝑘).
RADIX SORT
Radix Sort koristi Counting Sort algoritam da sortira cifru-po-cifru polazeći od najniže cifre. – Ovo je
moguće jer je Counting sort stabilan algoritam.
RADIX SORT ILI QUICK SORT?
Složenost Radix sort je ʘ(n), a Quick Sort je ʘ(nlog2n).
- ʘ(n) je bolje od ʘ(nlog2n), ali konstantan faktor Radix sort-a je lošiji od Quicksort-a (dobre
implementacije Quicksort-a su brže od Radix sort).
BUCKET SORT
Kod niza čije vrednosti imaju uniformnu raspodelu u intervalu [0,1) srednje vreme izvršavanja Bucket sort-a je 𝑂(𝑛)
U radu sa celim brojevima niz se sortira tako što se prave „posude“ (liste) sa intervalima u koje se
ubacuju elementi, zatim se sortiraju u rastućem redosledu u okviru intervala. Zatim se pravi sortiran niz
tako što se redom “prazne” liste sa intervalima, redosledom kako su elementi ubacivani.
U radu sa realnim brojevima prave „posude“ (liste) sa intervalima u koje se ubacuju elementi za dati
interval. Zatim svaki interval zasebno treba sortirati. Na kraju se sortiran niz formira tako što se sortirani
intervali vraćaju u niz redom.
14. REDOSLEDNA STATISTIKA (OPIS, MIN, MAX, JEDNOVREMENI MIN I MAX, MEDIJANA)
MINIMUM = redosledno prvi elemenat i = 1
MAKSIMUM = redosledno n-ti elemenat i = n
MEDIJANA = redosledno na sredini minimuma i maksimuma
AKO JE BROJ ELEMENATA U NIZU NEPARAN i = n / 2 AKO JE BROJ ELEMENATA U NIZU PARAN
- NIŽA MEDIJANA i = floor( (n + 1) / 2 )
- VIŠA MEDIJANA i = ceil( (n + 1) / 2 )
definicija problema
PROBLEM: Odrediti i-ti redosledni elemenat na skupu od n različitih elemenata
ULAZ: skup A sa n različitih elemenata, celobrojna i ( 1 ≤ i ≤ n)
IZLAZ: elemenat koji je veći od i – 1 drugih elemenata
OVO JE PROBLEM SELEKCIJE KOJI SE MOŽE REŠITI U DVA KORAKA
1. Sortiranjem niza A
2. Izborom i-tog elementa
Prethodno rešenje ima složenost O(nlog2n), i asimptotski je neefikasno. Traže se brža rešenja, složenosti
O(n).
MINIMUM I MAKSIMUM
Najmanji broj operacija poređenja neophodno za pronalaženje minimuma je n – 1 (najmanji broj se mora
uporediti sa svakim drugim brojem) - nije efikasno.
JEDNOVREMENO TRAŽENJE MINIMUMA I MAKSIMUMA
Nije potrebno 2(n-1) poređenja već 3 ⌊n /2⌋ poređenja. Umesto poređenja (jednog) i-tog elementa sa
tekućom najmanjom i najvećom vrednosti, treba posmatrati po 2 elementa (parove elemenata) iz niza A.
MEDIJANA
Problem selekcije i-tog elementa je teži od traženja minimuma ili maksimuma.
Posmatramo dva algoritma:
1. RANDOMIZED-SELECT – je modifikovana verzija Quicksort algoritma, jer se rekurzivno particionisanje
odnosi samo na jednu stranu (polovinu) niza A gde se nalazi traženi elemenat. To čini da je očekivana
složenost algoritma O(n), podrazumevajući da su svi elementi različiti. Najgori slučaj ima složenost O(n2), ali
samo kada se particionisanje dešava oko najvećeg(ili) najmanjeg elementa.
Slučajnost izbora pivota (koja je posledica poziva Random funkcije) niti jedan poseban ulaz ne forsira najgori
slučaj.
2. SELECT – algoritam vrši selekciju u linearnom vremenu za najgori slučaj.
1.
Podeli A na ⌈n/5⌉ grupa, gde svaka grupa ima 5 elemenata (poslednja može imati manje
elemenata)
2.
Nađi medijanu u svakoj od grupa upotrebom insertion sorta
3.
Upotrebi SELECT rekurzivno na novi niz sastavljen od medijana svih grupa iz prethodnog koraka
nađi x
4.
Primeni modifikovan Partition oko medijane-medijana (x iz koraka 3) koja je k-ti najmanji
elemenat
Levu grupu čine elementi 1..k-1; Desnu grupu čine elementi k k+1...n
5.
Ako je i == k kada je rešenje pronađeno, inače nastavi rekurzivno sa levom grupom ako je i < k, ili
traži (i – k)-ti elemenat u desnoj grupi
……………………………………………………………………………………………………………………………………………………………………
15. STRUKTURE PODATAKA – STEK, RED I STABLA UOPŠTENO (ORGANIZACIJA PODATAKA, OPERACIJE,
OSOBINE, NAMENA) ELEMENTARNE STRUKTURE
– Stek (Stack)
– Red (Queue)
– Povezane liste (List)
– Stabla (Tree)
Stek i red su dinamički skupovi gde se elementi uklanjaju unapred određenim redosledom. Kod steka se
briše poslednji (najmlađi) dodat elemenat. Naziva se LIFO procesiranje (last-in, first-out). Kod reda se
briše prvi (najstariji) dodat elemenat. Naziva se FIFO procesiranje (first-in, first-out).
Stek se može predstaviti nizom S[1..S.vrh] koji sadrži elemente –
S[1] je elemenat na dnu, a S[S.vrh] je na vrhu steka (poslednji
dodat). – S.vrh je indeks prvog praznog mesta na steku. Ako je
S.vrh == 0, onda je stek prazan. Greška je kada se pozove POVUCI
na praznom steku (greška tipa underflow). Greška je kada se
pozove GURNI na „punom“ steku gde nema dodatnog mesta jer je
popunjen sav planiran prostor (overflow).
STEK OPERACIJE
- Dodavanje elementa, “guranje” u stek – GURNI – (Push)
– Uklanjanje i preuzimanje (brisanje) elementa, povlačenje
– POVUCI – (Pop)
Sve operacije su brze. Svaka traje 𝑂(1). Jedino nedostaje provera „prepunjenosti steka“
RED OPERACIJE
– dodavanje elementa – DODAJ – (Enqueue) –
- preuzimanje i uklanjanje elementa – PREUZMI – (Deqeueu)
- provera: da li ima elemenata?
Glava“ (head) pokazuje na prvi elemenat reda. Preuzima se (dequeue) element sa početka – glave reda. Rep
- (tail) pokazuje na poslednji elemenat reda. Dodavanje elementa ga smešta na kraj – rep reda.
GREŠKE:
--Greška je kada se pozove PREUZMI na praznom redu (greška tipa underflow)
-- Greška je kada se pozove DODAJ na punom redu (overflow)
IMPLEMENTACIJA REDA
niz Q[1..n] je prostor za najviše n-1 elemenata reda
– Q se koristi kao kružni bafer
STABLO (UOPŠTENO)
Svaki roditelj može imati više dece što se može predstaviti na razne načine. Ukoliko uglavnom svi roditelji
imaju jednak broj dece onda se elemenat stabla može proširiti poljima: dete2 , dete2 , ..., detek (umesto polja
levo i desno).
Ukoliko broj dece varira od elementa do elementa – tada se mogu upotrebiti samo dva pokazivača:
1. na levo (prvo) dete - levo
2. na brata/sestru
Bitno je naglasiti da se pravi kompromis memorijskog zauzeća i povezanosti elemenata.
ELEMENT STABLA SADRŽI
- ključ – neka stabla mogu da sadrže elemente sa istim ključem
- satelitske podatke
TIPOVI
- Binarno stablo pretrage
- 2-3-4 stablo
- Crveno-Crno stablo
- AVL stablo
- B-stablo
OMOGUĆAVA EFIKASNE OPERACIJE 1. UPITI NAD SKUPOM
- pretraga skupa 𝑆 po ključu 𝑘 – PRETRAŽI(S,k) - Search
- vraća elemenat sa najmanjim ključem – MINIMUM(S) - Minimum
- vraća elemenat sa najvećim ključem – MAKSIMUM(S) - Maximum
- vraća sledeći elemenat od 𝑥 – NAREDNI(S,x) - Successor
- vraća prethodni elemenat od 𝑥 – PRETHODNI(S,x) - Predecessor
2. OPERACIJE IZMENA SKUPA
- dodaje elemenat 𝑥 u skup 𝑆 – DODAJ(S,x) – Insert
- briše elemenat 𝑥 – OBRIŠI(S,x) – Delete
16. STRUKTURE PODATAKA – LISTE (ORGANIZACIJA PODATAKA, OPERACIJE, OSOBINE, NAMENA)
Liste su strukture podataka gde su elementi uređeni u linearnom poretku. Za razliku od nizova gde je
poredak uređen preko indeksa, kod lista imamo pokazivače na susedne elemente.
Pogodne su za:
– Česta dodavanja i brisanja elemenata
– Česta posećivanja elemenata niza – iteriranje
kroz listu.
NISU POGODNE ZA PRETRAGE!
TIPOVI LISTA:
JEDNOSTRUKO SPREGNUTE LISTE gde element pokazuje na naredni element. Omogućeno je kretanje samo u
jednu stranu.
DVOSTRUKO SPREGNUTE LISTE gde element pokazuje i na naredni i na prethodni elemenat. Omogućeno je
kretanje na obe strane.
CIRKULARNE LISTE – elementi su u „prstenu“ (poslednji el. pokazuje na prvi, ...).
Dodatno: Lista može biti sortirana na osnovu ključa – Npr. prvi elemenat je sa najmanjim ključem, a
poslednji sanajvećim.
DVOSTRUKO SPREGNUTA LISTA
Svaki elemenat sadrži pokazivač na naredni elemenat (next) (== Nil kada je
poslednji), pokazivač na prethodni elemenat (prev) (== Nil kada je prvi), ključ koji
je prisutan kod sortiranih lista (key) i može sadržati druge satelitske podatke.
Pokazivač na prvi elemenat je L.glava (.head). Ako je L. glava == NIL lista je u tom
slučaju prazna.
Pokazivač na poslednji elemenat – L.rep (.tail) – nije uvek prisutan!
JEDNOSTRUKO SPREGNUTA LISTA
Jednostavnija je od dvostruko spregnute liste. Elementi nemaju polje prethodni koje pokazuje na prethodni
elemenat.Takođe nema ni L.rep.
Omogućava kretanje (samo) od početka (L.glava) ka narednim elementima.
Nema mogućnost kretanja ka prethodnom elementu (jedini način da se dođe do prethodnog elementa je
ponovno kretanje od L.glava).
PRETRAGA U LISTI
U najgorem slučaju traženi elemenat je na kraju liste.
Složenost pretrage je O(𝑛), gde je 𝑛 broj elemenata u
listi. PRETRAGA JE PRIMENLJIVA NA JEDNOSTRUKO I
DVOSTRUKO SPREGNUTE LISTE!
DODAVANJE ELEMENTA U LISTU
BRISANJE ELEMENTA IZ LISTE
UPOTREBA „ČUVARA“
Implementacije operacija se pojednostavljuju ako se ignorišu granični uslovi. Podaci se organizuju
u cirkularnu listu gde se dodaje čuvar (sentinel) kao fiktivan (prazan) objekat. Dodaje se pokazivač
na njega L.nil i poređenje sa NIL se svodi na poređenje sa L.nil
16.dodatak moj:
IMPLEMENTACIJA LISTE POMOĆU NIZOVA:
• Npr. implementacija liste sadrži 4 niza:
– vrednosti ključeva
– satelitske podatke
– indekse narednih elemenata
– indekse prethodnih elemenata
• Nizovi su „usklađeni“ – na indeksu 𝑖 u svim nizovima nalaze se polja istog elementa.
• Nil vrednost se može predstaviti sa 0 ili -1.
Implementacija liste preko jednog niza
• Jedan niz sadrži sve elemente sa indeksima gde se nalaze prethodni i naredni elementi.
• Ograničenje: ključ i drugi korisni podaci elementa se moraju „uklopiti“ sa tipovima podataka upotrebljenim za indekse
(tipično celobrojne)
17. BINARNO STABLO PRETRAGE (sortirano binarno stablo BST)
Binarno stablo pretrage je sortirano binarno stablo. Svaki čvor u stablu ima uporedivi ključ čija je vrednost: veća od ključeva u levom podstablu (>=)
- manja od ključeva u desnom podstablu (<=)
OSOBINE
(+) pretraga, ubacivanje i brisanje elemenata se može uraditi efikasno () stablo može izgledati degenerisano ili izgledati kao spregnuta lista.
SVAKI ELEMENAT STABLA SADRŽI POKAZIVAČE NA
– Roditelja - p, – Levo dete - left – Desno dete - right.
- Element u korenu stabla x ima polje x.p = NIL
- Element koji nema dece (ili ima samo jedno) polja left i/ili
right postavlja na NIL.
- Struktura binarnog stabla sadrži pokazivač na koren stabla
T.root
- Stablo bez elemetana ima T.root = NIL
Svaki čvor 𝑥 ima:
– Ključ 𝑘𝑙𝑗𝑢č(𝑥) – BSP osobina
– Roditelja 𝑟(𝑥) - pokazivač
– Levo dete 𝑙𝑒vo 𝑥 - pokazivač
– Desno dete 𝑑𝑒𝑠𝑛𝑜(𝑥) – pokazivač
OPERACIJE BSP
- Dodaj: DODAJ(𝑥)
- Obriši: OBRIŠI(𝑥)
- Pronađi po ključu: PRONAĐI(ključ)
- Pronađi min/max: NAJMANJI(), NAJVEĆI()
- Sledeći manji/veći elemenat: PRETHODNI(𝑥), NAREDNI(𝑥)
- Promeni vrednost udruženu sa ključem
SLOŽENOST OPERACIJA
Ako je ℎ visina stabla, onda su sve operacije složenosti 𝑂(ℎ).
DODAVANJE U BSP
Dodaje se čvor 𝑧 sa postavljenim ključem i Nil pointerima za decu.
PRETRAGA BSP
Posmatramo elemenat 𝑥. Ako je njegov ključ jednak traženom onda je gotovo. Ako je traženi ključ manji onda se
možda nalazi u levom podstablu, pa pretragu tamo nastavljamo. Ako je traženi ključ veći onda se možda nalazi u
desnom podstablu, pa pretragu tamo nastavljamo.
MINIMUM I MAKSIMUM
Elemenat sa najmanjim ključem se nalazi sasvim levo, a sa najvećim
sasvim desno.
Ideja je da se krećemo ulevo (udesno) dokle god je moguće.
Poslednji posećen čvor sadrži minimum (maksimum).
NAREDNI/PRETHODNI ELEMENAT
Posmatra se dati čvor i tražimo naredni (sledećeg veći).
Traženi čvor je sa desne strane (ako postoji). Ako dati
čvor sadrži desno podstablo onda je traženi čvor
minimum tog podstabla npr. 6, 7.
Ako dati čvor ne sadrži desno podstablo onda je traženi
čvor prvi roditelj koji se nalazi sa desne strane npr. 12,
18 (roditelji 10, 6, 3 sa putanje od 12 do 18 su sa leve
strane). Ovo se može obrnuto posmatrati: 18 ima
prethodni elemenat koji se nalazi kao maksimum levog
podstabla (=12).
ZAMENA ČVORA DRUGIM ČVOROM
Čvor 𝑥 se zamenjuje čvorom 𝑦. Nakon toga je 𝑥 nebitan.
Potrebna ažuriranja: – roditelj od 𝑥 treba da ukazuje na 𝑦
(dilema: sa leve ili desne strane?) – postaviti novog roditelja za y.
BRISANJE ČVORA
Posmatra se čvor 𝑧.
Lako je kada 𝑧 nema više od jednog podstabla (nijedno ili levo ili desno). Tada
se 𝑧 zameni tim podstablom (ili sa 𝑁𝑖𝑙) Podsećanje: ključ roditelja je van
opsega ključeva tog podstabla tako da se ne naručava osnovna osobina BSP.
Ako 𝑧 ima oba podstabla, onda tražimo npr. sledeći veći elemenat 𝑦.
Podsećanje: 𝑦 nema levo podstablo, dok može imati desno podstablo 𝑥. Ideja
je da se zameni 𝑧 sa 𝑦, ali se prvo zamenjuje 𝑦 sa 𝑥. Ako je 𝑦 dete od 𝑧 tada je
to jednostavniji slučaj.
17.dodatak moj
VISINA BINARNOG STABLA
Optimalna visina stabla je 𝑂(log2 𝑛) i tada kažemo da je stablo balansirano
• Međutim, složenost većine operacija sa BSP je 𝑂 ℎ ≥ 𝑂(log2 𝑛)
• Nažalost, visina BSP zavisi od redosleda dodavanja elemenata!
Posledica: Dobija se nebalansirano ili degenerisano stablo
• Npr. dodavanje sortiranih elemenata
dovodi do visine 𝑂 𝑛
– Ovo je najgori slučaj „biranog stabla“ gde ono postaje lista
BSP SA JEDNAKIM KLJUČEVIMA
Jednaki ključevi komplikuju implementaciju BSP
– ako su česti elementi sa jednakim ključevima dobija se degenerisano stablo
• Treba modifikovati metod za dodavanje elementa tako što se posebno proverava jednakost ključeva. Ima
nekoliko rešenja:
1. U svaki čvor se doda bulova promenljiva koja menja vrednost samo kada se doda isti ključ.
Npr. kada je neistina novi čvor se doda levo i vrednost se promeni na istinu, i obrnuto.
2. Umesto dodate bulove promenljive slučajno se bira strana na koju se dodaje elemenat
3. Čvorovi sa istim ključem se organizuju u listu
18. CRVENO-CRNO STABLO
Crveno-crno (CC) stablo je u osnovi sa osobinama i strukturom BSP. Dodatno, svaki čvor ima boju: crnu ili crvenu.
CC je stablo praktičnije od 2-3-4 stabla jer 2-3-4 stablo nije binarno odnosno 2-3-4 stablo ima više ključeva u čvoru,
više poređenja.
CC stablo ima složeniju implementaciju i nije idealno balansirano kao što 2-3-4 jeste (da je jednako dugačka
putanja od korena do svakog lista), ali ima osobinu da su sve dužine putanja do listova unutar opsega sa faktorom
2, tj. da je najduža putanja „samo“ do 2 puta duža od najkraće putanje.
Posmatrajući takve osobine, to je dovoljno da kažemo da je crveno-crno stablo aproksimativno balansirano.
Kako je operacije (dodavanja i brisanja čvora, pretrage, minimuma, maksimuma, prethodnog i narednog)
izvršavaju u vremenu 𝑂(ℎ), za balansirano stablo to je 𝑂(log2𝑛).
PRAVILA CC STABLA
1. Svaki čvor je crn ili crven
2. Čvor u korenu je crn
3. Svi listovi su crni i ne sadrže ključeve/vrednosti
4. Ako je čvor crven oba deteta su crna – putanja nikada nema dva susedna crvena čvora
5. Za svaki čvor, sve putanje od njega do listova (u njegovom podstablu) su sa jednakim brojem crnih čvorova
Ova pravila moraju biti ispunjena i nakon dodavanja/brisanja čvorova – npr. Ako se ukloni crni čvor na putanji
...crveni-crni-crveni... Pravilo 4. Se naručava! Da bi se očuvale gornje osobine potrebno je
transformacijama preurediti strukturu stabla: – rotacijama i/ili – promenama boje nekih čvorova.
ROTACIJE
Rotira se grana (npr. x-y), tj. roditelj (y) i dete (x) zamenjuju mesta.
Posledica je da se levo podstablo b (čvora x promovisanog u
roditelja) prevezuje kao desno podstablo prethodnog roditelja (y).
Naravno, analogno se može izvršiti suprotna rotacija.
DODAVANJE
Dodavanje čvora se vrši na dno –
uvek. Kada posmatramo neku
održavati malim.
putanju broj crnih čvorova bi trebalo
Ako pokušamo da dodamo crni
generišemo dodatni nivo, što je
možemo imati „problem“ kada se
čvor, to ne remeti pravila, ali time
loše. Zato dodamo crveni čvor, ali
nadovezuje na postojeći crveni čvor.
Mogu se pojaviti 3 nedozvoljene
(transformacijama).
situacije koje se rešavaju korekcijama
POZIV METODE KORIGUJ-DODAJ
Radi pojednostavljenja koda
sve Nil vrednosti ukazuju na
KOREKCIJE NAKON DODAVANJA
obačen je jedan čuvar T.Nil u celo stablo i
njega.
ZAMENA ČVORA DRUGIM ČVOROM
Zamena je nalik onoj iz BSP ali je ovde prilagođena za CC stablo.
Nil je zamenjen sa T.Nil.
Uslov if y Nil je sklonjen iz 6. reda jer postoji y.r i kada y pokazuje na
„čuvara“.
BRISANJE ČVORA
Slično je BSP brisanju čvora, ali brisanje crvenog čvora ne kvari pravila odnosno ne menja se broj crnih čvorova na
putanjama.
Ne mogu se pojaviti dva susedna crvena čvora i koren nikada nije crven, tako da crni koren ostaje.
Brisanje crnog čvora te se y pomera pa mu je možda potrebno promeniti boju (red #20).
x se takođe pomera!
SLUČEJEVI KOREKCIJE BRISANJA
19. AVL STABLO
Adelson-Velsky & Landis-ovo stablo je samobalansirajuće BSP.
BALANSIRA SE VISINA STABLA ODNOSNO ZA SVAKI ČVOR RAZLIKA VISINA LEVOG I DESNOG PODSTABLA JE
NAJVIŠE 1.
NAJGORI SLUČAJ: desno podstablo je za 1 više od levog podstabla za svaki čvor (ili obratno).
Visina AVL stabla je ℎ = 𝑂(log2𝑛)
VISINA ČVORA
Svaki čvor pamti svoju visinu kao dodatni atribut.
Visina čvora je dužina (broj grana) najduže putanje do lista.
VISINA LISTA
Visina lista = 0 (visina nepostojećeg potomka, označenog sa Nil, je −1) .
Visina svakog drugog čvora = max(𝑣𝑖𝑠𝑖𝑛𝑎 𝑙𝑒𝑣𝑜𝑔 𝑝𝑜𝑑𝑠𝑡𝑎𝑏𝑙𝑎, 𝑣𝑖𝑠𝑖𝑛𝑎
𝑑𝑒𝑠𝑛𝑜𝑔 𝑝𝑜𝑑𝑠𝑡𝑎𝑏𝑙𝑎) + 1.
DODAVANJE ČVORA U AVL STABLO
1. Ubaciti čvor kao da je BSP uz ažuriranje visina čvorova
2. Ako je narušena balansiranost – primeniti rotacije (AVL balansiranost je narušena u čvoru gde je razlika
visina njegovih podstabla veća od 1)
BRISANJE ČVORA IZ AVL STABLA
1. Obrisati čvor kao da je BSP uz ažuriranje visina čvorova (zamena čvorova menja visinu (metoda ZAMENI))
2. Ako je narušena balansiranost – primeniti rotacije.
ALGORITAM ZA POPRAVLJANJE BALANSIRANOSTI AVL STABLA
Neka je 𝑥 najniži čvor gde je narušena AVL balansiranost. Neka
je 𝑦 desna strana od 𝑥 čija je visina veća.
Kada je desna strana 𝑦 veća ili je 𝑦 balansiran čvor uraditi ROTIRAJ-LEVO(𝑥) u suprotom (leva strana od 𝑦 je 𝑧 i
ona je teža) uraditi dve rotacije: ROTIRAJ-DESNO(𝑦) i ROTIRAJ-LEVO(𝑥).
Ukoliko rotacije narušavaju balansiranost roditeljskog čvora (pre rotacije(a) je to bio roditelj od 𝑥) primeniti
algoritam na njega i tako sve do vrha – dokle god je narušena bansiranost čvorova.
Opisani postupak treba prilagoditi kada je 𝑦 leva strana od 𝑥 čija je visina veća.
VISINA ČVORA
Svaki čvor pamti svoju visinu kao dodatni atribut.
Visina čvora je dužina (broj grana) najduže putanje do lista.
VISINA LISTA
Visina lista = 0 (visina nepostojećeg potomka, označenog sa Nil, je −1) .
Visina svakog drugog čvora = max(𝑣𝑖𝑠𝑖𝑛𝑎 𝑙𝑒𝑣𝑜𝑔 𝑝𝑜𝑑𝑠𝑡𝑎𝑏𝑙𝑎, 𝑣𝑖𝑠𝑖𝑛𝑎
𝑑𝑒𝑠𝑛𝑜𝑔 𝑝𝑜𝑑𝑠𝑡𝑎𝑏𝑙𝑎) + 1.
DODAVANJE ČVORA U AVL STABLO
3. Ubaciti čvor kao da je BSP uz ažuriranje visina čvorova
4. Ako je narušena balansiranost – primeniti rotacije (AVL balansiranost je narušena u čvoru gde je razlika
visina njegovih podstabla veća od 1)
BRISANJE ČVORA IZ AVL STABLA
3. Obrisati čvor kao da je BSP uz ažuriranje visina čvorova (zamena čvorova menja visinu (metoda ZAMENI))
4. Ako je narušena balansiranost – primeniti rotacije.
ALGORITAM ZA POPRAVLJANJE BALANSIRANOSTI AVL STABLA
Neka je 𝑥 najniži čvor gde je narušena AVL balansiranost. Neka
je 𝑦 desna strana od 𝑥 čija je visina veća.
Kada je desna strana 𝑦 veća ili je 𝑦 balansiran čvor uraditi ROTIRAJ-LEVO(𝑥) u suprotom (leva strana od 𝑦 je 𝑧 i
ona je teža) uraditi dve rotacije: ROTIRAJ-DESNO(𝑦) i ROTIRAJ-LEVO(𝑥).
Ukoliko rotacije narušavaju balansiranost roditeljskog čvora (pre rotacije(a) je to bio roditelj od 𝑥) primeniti
algoritam na njega i tako sve do vrha – dokle god je narušena bansiranost čvorova.
Opisani postupak treba prilagoditi kada je 𝑦 leva strana od 𝑥 čija je visina veća.
19.MOJ DODATAK:
AVL stablo je vrsta binarnog stabla pretrage koje je samobalansirajuće. Osnovna karakteristika AVL stabala je da se visina stabla
održava balansiranom. Za svaki čvor u AVL stablu, razlika visina njegovog levog i desnog podstabla (poznata kao faktor
balansiranosti) ne sme biti veća od 1.
Najgori slučaj za AVL stabla nastaje kada je razlika visina desno podstabla veća za 1 u odnosu na levu stranu (ili obrnuto) za
svaki čvor.
Visina AVL stabla je ograničena na ℎ = 𝑂(log2𝑛), gde je 𝑛 broj čvorova u stablu.
Svaki čvor u AVL stablu pamti svoju visinu kao dodatni atribut. Visina čvora definiše se kao dužina (broj grana) najduže putanje od
tog čvora do lista.
Visina lista je 0 (visina nepostojećeg potomka, označenog sa Nil, je -1). Visina svakog drugog čvora se određuje kao maksimum
visina njegovih levog i desnog potomka, plus 1.
Algoritam za dodavanje čvora u AVL stablo sastoji se od ubacivanja čvora kao u binarno stablo pretrage, uz ažuriranje visina
čvorova. Ako se naruši balansiranost AVL stabla (kada je faktor balansiranosti veći od 1 ili manji od -1), primenjuju se rotacije kako
bi se povratila balansiranost.
Algoritam za brisanje čvora iz AVL stabla takođe uključuje brisanje čvora kao u binarnom stablu pretrage, uz ažuriranje visina
čvorova. U slučaju narušavanja balansiranosti, primenjuju se rotacije radi obnavljanja balansiranosti stabla.
Algoritam za popravljanje balansiranosti AVL stabla primenjuje se kada se naruši balansiranost u određenom čvoru. Neka je 𝑥
najniži čvor u kojem je balansiranost narušena. Ako je desna strana čvora 𝑦 veća ili je 𝑦 balansiran čvor, primenjuje se rotacija
ROTIRAJ-LEVO(𝑥). U suprotnom, kada je leva strana čvora 𝑦 veća i narušava balansiranost, primenjuju se dve rotacije: ROTIRAJDESNO(𝑦) i ROTIRAJ-LEVO(𝑥). Ako rotacije naruše balansiranost roditeljskog čvora pre rotacija, algoritam se primenjuje na taj čvor
i tako se nastavlja sve do korena stabla, sve dok se balansiranost čvorova ne obnovi.
20. PROŠIRENO CRVENO-CRNO STABLO (STABLO REDOSLEDNE STATISTIKE I INTERVALNO STABLO)
Traži se 𝑖-ti po redosledu element u skupu od elemenata,
tj. 𝑖-ti „najmanji ključ“. Videli smo da se može pronaći u
nesortiranom nizu u vremenu 𝑂(𝑛).
Sada se posmatra dinamička struktura podataka i zato
koristimo CC stablo. Svaki čvor CC stabla 𝑥 se proširi
brojem elemenata u podstablu 𝑥. 𝑏𝑟𝑒𝑙 = 𝑥. 𝑙𝑒𝑣𝑜. 𝑏𝑟𝑒𝑙 +
𝑥. 𝑑𝑒𝑠𝑛𝑜. 𝑏𝑟𝑒𝑙 + 1. Sada se svaka selekcija može uraditi u vremenu 𝑂(log2𝑛).
STABLO REDOSLEDNE STATISTIKE
Stablo redosledne statistike je CC stablo sa modifikacijom čvora – dodatim 𝑏𝑟𝑒𝑙 (u primeru gornji broj je ključ, a a
donji 𝑏𝑟𝑒𝑙). Primetiti da se ključevi ponavljaju!
ODREĐIVANJE REDNE POZICIJE ČVORA
Za čvor 𝑥 treba odrediti koji je po redu u redoslednoj statistici.
AŽURIRANJE POLJA DODATOG U STRUKTURU ČVORA
Bitne operacije su dodavanje i brisanje.
Dodavanje u CC stablo ima dve faze:
1. pronalaženje mesta novom čvoru polazeći od korena – za svaki posećeni čvor se poveća 𝑏𝑟𝑒𝑙 za 1. Za
dodati čvor je 𝑏𝑟𝑒𝑙 = 1
2.
eventualne strukturne promene – rotacije (utiče samo na 2 čvora)
Brisanje takođe ima 2 faze:
1. briše se čvor ili se pomeri nagore u stablu – za svaki čvor od obrisanog do korena se umanji 𝑏𝑟𝑒𝑙 za 1.
2. eventualne strukturne promene – rotacije (utiče samo na 2 čvora).
OBE OPERACIJE IMAJU SLOŽENOST 𝑂(LOG2𝑛)!
INTERVALNO STABLO
Intervalno stablo je prošireno CC stablo koje podržava operacija na dinamičkim intervalima.
Zatvoreni interval [𝑡1,𝑡2] predstavlja skup 𝑡 ∈ ℝ:𝑡1 ≤ 𝑡 ≤ 𝑡2 (mogu se posmatrati i otvoreni i polu-otvoreni
intervali).
Primeri intervala su vremenski intervali – Interval 𝑖 ima parametre: početak 𝑝𝑜č𝑒𝑡𝑎𝑘 i kraj 𝑘𝑟𝑎𝑗 (𝑖. 𝑝𝑜č𝑒𝑡𝑎𝑘 = 𝑡1,
𝑖. 𝑘𝑟𝑎𝑗 = 𝑡2) – Intervali 𝑎 i 𝑏 se preklapaju kada je 𝑎. 𝑝𝑜č𝑒𝑡𝑎𝑘 ≤ 𝑏. 𝑘𝑟𝑎𝑗 i 𝑏. 𝑝𝑜č𝑒𝑡𝑎𝑘 ≤ 𝑎. 𝑘𝑟𝑎𝑗
IMPLEMENTACIJA INTERVALNOG STABLA
Čvor intervalnog stabla sadrži interval u polju 𝑖𝑛𝑡 sa dva broja 𝑝𝑜č𝑒𝑡𝑎𝑘 i 𝑘𝑟𝑎𝑗.
Ključ je 𝑖𝑛𝑡. 𝑝𝑜č𝑒𝑡𝑎𝑘
Polje 𝑚𝑎𝑥 koje sarži maksimalnu vrednost kraja intervala iz podstabla u čijem korenu je 𝑥 𝑥. 𝑚𝑎𝑥 = max(𝑥. 𝑖𝑛𝑡.
𝑘𝑟𝑎𝑗, 𝑥. 𝑙𝑒𝑣𝑜. 𝑚𝑎𝑥, 𝑥. 𝑑𝑒𝑠𝑛𝑜. 𝑚𝑎𝑥).
Intervalno stablo ima osnovne operacije: dodavanja, brisanja i pretrage intervala, ali se mogu dodati i druge
operacije, npr. presek sa datim intervalom itd.
PRESEK SA DATIM INTERVALOM
Operacija se svodi na pretragu - pronalaženja intervala (čvora) koji se preklapa sa zadatim intervalom 𝑖. Ukoliko
nema takvog intervala u stablu vraća se T. 𝑁𝑖𝑙.
VREME IZVRŠAVANJA JE 𝑂(log2𝑛).
21. REČNIK PODATAKA I HEŠIRANJE (PRIMENE, PRIHEŠ I HEŠ, KOLIZIJE, AMORTIZOVANO VREME IZVRŠAVANJA)
Rečnik podataka (dictionary) je tip podataka(ADT-Abstract Data Type). Sadrži i održava skup elemenata gde svaki
ima ključ(key).
Elemenat (item) se može posmatrati kao uređeni par {ključ, vrednost}
Dictionary se koristi kada su potrebne brze operacije insertion, deletion i find-element, jer u teoriji te
operacije se mogu izvesti u vremenu O(1).
PRIMENE (VEROVATNO NAJČEŠĆE UPOTREBLJAVANA STRUKTURA PODATAKA ) - baze podataka
- prevodioci: imena → promenljive
- rutiranje mrežnog saobraćaja: IP adresa → žica
- virtuelna memorija: virtuelna memorija → fizička lica
- pretraga podstringova (Google search) - sinhronizacija sadržaja datoteka - kriptografija
- IMPLEMENTIRAN u savremenim programskim jezicima
HEŠ FUNKCIJE SE MOGU KORISTITI ZA SKLADIŠTENJE SVIH TIPOVA PODATAKA!
PRIHEŠ - je funkcija koja uzima deo podataka kao ulaz, mi ćemo to zvati ključ (key), a kao izlaz daje ceo broj,
poznatiji kao heš vrednost (hash-value). Praktično, ključ se prevodi u indeks. Dok je elemenat u tabeli, njegova
priheš funkcija hp se ne sme menjati, jer ga onda ne možemo pronaći. hp: k → i
HEŠ - redukuje potencijalno velike vrednosti brojeva i mapira naš ključ u određeni indeks u heš tabeli. Na početku
mi koristimo heš funkciju da odredimo gde u heš tabeli, da smestimo određeni ključ. Kasnije ćemo koristiti istu
heš funkciju da odredimo gde u tabeli da tražimo zadati ključ. Iz ovog razloga potrebno je da se heš funkcija
ponaša dosledno i da kao izlaz daje istu heš vrednost za identične ključeve.
Problem sa kojim se suočavamo u formiranju rečnika jeste kolizija.
KOLIZIJA je pojava kada se dva ključa mapiraju na isti indeks u tabeli.
METODE REŠAVANJA KOLIZIJE
1. Heširanje ulančavanjem
2. Heširanje otvorenim adresiranjem
PRIMER: RADIMO SA STRINGOVIMA
Recimo da naša heš funkcija daje heš vrednost koja je bazirana na osnovu prvog slova ključa reč “Alen” počinje,
tako da je mapirana na poziciji 0 heš tabele. Slično “Boris”, je mapiran na indeks 1, a “Ciceron” je mapiran na
indeks 2. Ako se pitamo da li je reč “Dragan” u tabeli, stavićemo istu u heš funkciju i kao izlaz ćemo dobiti indeks
3, pošto nema ništa smešteno na tom indeksu, i možemo reći da “Dragan” nije u tabeli, iako smo proverili samo
jedan od 26 indeksa u tabeli.
U slučaju da u tabelu želimo da smestimo reč “Anđela”, heš funkcija će nam vratiti vrednost 0, kao za reč “Alen”.
DESILA SE KOLIZIJA. TO ZNAČI DA SE SE REZULTATI DVA KLJUČA HEŠUJU NA ISTI INDEKS. ČAK IAKO JE NAŠA
HEŠ TABELA VEĆA NEGO NEGO NAŠ SKUP PODATAKA I IZABRALI SMO DOBRU HEŠ FUNKCIJU, JOŠ UVEK
TREBA DA NAĐEMO REŠENJE ZA REŠAVANJE KOLIZIJE!
22. HEŠIRANJE ULANČAVANJEM
Kod ove metode je u stvari niz pokazivača u spregnutoj listi. Kada se kolizija pojavi, ključ može biti ubačen u
konstantnom vremenu na glavu odgovarajuće spregnute liste.
Kada želimo sada da potražimo reč “Alen” u našoj listi, u najgorem slučaju moramo da prođemo celu uvezanu
listu, koja počinje na indeksu 0.
Vreme izvršavanja za zadati ulaz u najgorem slučaju je O(n/k), gde je k veličina heš tabele. Iako je se n/k svodi na
n, u stvarnom svetu je O(n/k) veliko poboljšanje u odnosu na O(n).
JEDNOSTAVNO UNIFORMNO HEŠIRANJE
Svaki ključ ima podjednaku šansu da se mapira(hešira) u bilo koji red u tabeli, nezavisno od mesta gde se heširaju
ostali ključevi.
Definiše se faktor popunjenosti tabele (load factor) α = m/n
- n je broj elemenata koje smeštamo u T
- m je broj mesta(redova) u T
- α određuje očekivani broj elemenata po mestu = očekivana dužina ulančane liste.
PREFORMANSE
Očekivano trajanje pretrage je Θ (1 + α)
- 1 za primenu heš funkcije i pristup redu tabele, a α za prolaz kroz listu.
- Ako je m = Ω(n), tada je α = O(1), pa je trajanje pretrage O(1)
Ako je m veliko to je bačen prostor. m je promenljivo, po pokretanju malo, a može se po potrebi povećavati. Kada
je m = n tabelu treba duplirati.
AMORTIZOVANO VREME IZVRŠAVANJA
Operacija ima amortizovano vreme izvršavanja T(n), ako je za k operacija trajanje ≤ k*T(n). Grubo gledano
amortizovano vreme je prosečno vreme za ponovljene operacije.
OPERACIJE SA HEŠ TABELOM
1. Dodavanje – amortizovano vreme izvršavanja je O(1).
2. Pretraga – O(1) jer se održava m = Θ (n) i tada je α konstanta (ova osobina za α važi za uniformno heširanje).
3. Brisanje – amortizovano vreme izvršavanja je O(1).
Kada n padne ispod m/4 tabelu treba prepoloviti
Ako se tabela prepolovi kada je n = m/2, a duplira kada je n = m+1, tada za n = m i niz operacija insert, delete,
insert, delete dobijaju linearno vreme izvršavanja!
23. OTVORENO ADRESIRANJE
Nema ulančanih elemenata. Najviše ide jedan elemenat po redu u T, tj. m >= n (n – broj elemenata, m – broj
redova ).
Heš funksija je “proširena”: pored ključa koristi i broj pokušaja heširanja. ℎ: 𝑡 × 0,1, … , 𝑚 − 1 → 0,1 , … , 𝑚 − 1 }
h je funkcija koja mapira par <ključ, pokušaj>, na vrstu u tabeli T.
Ako se pokušaj i povećava h(k, i) (a k se ne menja) biće adresirani svi redovi u tabeli.
DODAVANJE
Uporno probati dok se ne pronađe prazan red.
Onda dodati elemenat u red.
PRETRAGA
Pokušavati primenu heš funkcije dok se u
indeksiranom slotu ne nađe traženi ključ ili se ne
„natrči“ na prazan slot.
BRISANJE
Povećavanjem broja pokušaja 𝑖 za istu vrednost ključa pravi „prividno ulančavanje“ (koje je posledica kolizije) i
stoga se ne može jednostavno ukloniti elemenat iz 𝑇 (tako što se postavi prepiše sa Nil) jer se „prekida“ zamišljeni
lanac i nakon toga pretraga neće raditi.
Uvodi se posebna oznaka sa značenjem „obriši me“ za svaki red (slot) u tabeli 𝑇 – dodavanje ignoriše tu oznaku
(tretira je kao Nil), ali pretraga je tumači kao da je red popunjen (da se „lanac pretrage“ ne bi prekinuo) – kod
smanjivanja tabele označeni redovi se brišu.
STRATEGIJA HEŠIRANJA SA „POKUŠAJIMA“
Linearno dodavanje pokušaja (LINEAR PROBING) ℎ 𝑘, 𝑖 = ℎ ′ 𝑘 + 𝑖 mod 𝑚 gde je ℎ ′ (𝑘) „obična“ heš funkcija.
Problem je jer dovodi do zauzeća uzastopnih redova – prave se zauzeti blokovi koji vremenom postaju sve veći.
Duplo heširanje
gde su ℎ1(𝑘) i ℎ2(𝑘) „obične“ heš funkcije.
POREĐENJE OTVORENOG ADRESIRANJA I ULANČAVANJA
Otvoreno adresiranje (OA) zauzima manje memorije (ne zahteva pokazivače). Ulančavanje je manje osetljivo na
izbor heš funkcije. Kod otvorenog adresiranja treba paziti da se izbegnu blokovi zauzetih redova.
OSOBINE DOBRE HEŠ FUNKCIJE
1. Koristi sve informacije koje daje ključ – u cilju da da maksimalni broj heš vrednosti (na primer kod reči
je potrebno iskoristiti sva slova reči “vode”, “vodenast”, ako heš funkcija izbroji samo 3,4 slova
pojaviće se kolizija, jer želimo da te dve reči stavimo na dve različite pozicije u tabeli)
2.
Heš vrednosti treba da se šire jednako preko heš tabele – Ovo će smanjiti dužinu uvezanih lista
3.
Mapira slične ključeve u što različitije heš vrednosti
4.
Korišćenje samo brzih operacija – umetanje, brisanje i traženje elementa.
24. FIBONAČIJEV HIP
PREDNOSTI
Neke operacije se brže izvršavaju nego upotrebom „običnog“ hipa.
Omogućava objedinjavanje-uniju hip struktura
OSNOVNE OPERACIJE (POSMATRA SE MIN-HIP) – Napravi-Prazan-Hip()
– DODAJ(H, x) – dodaj elemenat 𝑥 u hip 𝐻
– Minimum(H) – vrati elemenat sa minimanom vrednosti ključa
– Izdvoj-Minumum(H) – vrati i obriši elemenat sa minimalnom vrednosti ključa
– Unija(H1 , H2 ) – poveži dva hipa u jedan
– Umanji-Ključ(H, x, k) – za dati elemenat 𝑥 u hipu 𝐻 postavi ključ na manju vrednost 𝑘 – Obriši(H, x) –
ukloni elemenat 𝑥 iz hipa H
SLOŽENOSTI OPERACIJA
Uglavnom ima teorijsku osnovu. Iako je složenost manja od
binarnog hipa, konstante su dosta veće, pa su realne brzine
manje.
Praktična opravdanost je retka, sem u nekim slučajevima kod
velike količine podatakaka.
I binarni i Fibonačijev hip imaju spore operacije pretrage.
STRUKTURA FIBONAČIJEVOG HIPA
Zasnovan je na nekoliko stabala (kolekciji stabala) koja su uređena kao min-hip.
U svakom stablu su zadovoljene osobine min hipa: ključ čvora je veći ili jednak ključu roditelja.
Ceo hip sadrži – pokazivač min na korenski čvor sa najmanjim ključem (to je minimalan čvor).
Korene stabala
𝑛 – broj čvorova/elemenata u hipu.
Svaki elemenat se posmatra kao čvor nekog stabla i sadrži:
– Ključ – Stepen (degree) – broj dece
– Oznaku – indikator da je izgubio dete od trenutka kada je
postavljen kao dete drugom čvoru.
Svaki novododani čvor, kao i čvor koji se postavi kao dete
drugom čvoru ima oznaku „laž“.
FIZIČKA STRUKTURA FIBONAČIJEVOG HIPA
Koreni stabala su preko pokazivača levo i desno povezani u dvostruko spregnutu cirkularnu listu.
SVAKI ČVOR SADRŽI
–
Pokazivač na roditeljski čvor
–
Pokazivač na jednog od potomaka (dece) – Pokazivače levo i desno
Deca su povezana u dvostruko spregnutu cirkularnu listu – Deca u listi nisu posebno uređena.
DODATNE OSOBINE
Posledica strukture (postojanja stabala koja nemaju propisan oblik, a mogu biti i pojedinačni elementi) je
mogućnost izvršavanja nekih operacija u „lenjom maniru“ gde se deo posla odlaže za kasnije pozive.
Spajanje hipova se svodi na spajanje dve liste stabala; umanjenje ključa nekada odvoji čvor od roditelja i formira
nova stabla. Ipak, kasniji pozivi preslažu čvorove (konsoliduju hip) da bi se „uveo red“ i postiglo željeno
(amortizovano) vreme trajanja operacija.
Stepeni čvorova ostaju niski, ne veći od 𝑂(log2𝑛).
Veličina podstabla čiji koren ima stepen 𝑘 je najmanje 𝐹(𝑘+2), gde je 𝐹(𝑖) 𝑖-ti Fibonačijev broj. Ovo je postignuto
pravilom da se može odvojiti najviše jedno dete od roditelja koji nije koren. Kada se odvoji drugo dete čvora tada
se taj čvor odvaja od svog roditelja i postaje koren novog stabla.
Broj stabala se smanjuje operacijom izdvoj minimum i data se stabla povezuju (konsoliduje se hip)
OPERACIJE NAD FIBONAČIJEVIM HIPOM
Operacije odlažu konsolidaciju – koliko mogu. Neke operacije su brze jer su jednostavne (dodavanje, dodaje čvor
u listu korena hipa). Druge operacije preslažu čvorove (vrše konsolidaciju) – (Izdvoj-Minimum ukloni čvor ali onda
traži najmanji čvor, što je sporo ako su svi dodati čvorovi u listi pa iz zato preslaže - konsoliduje, da bi naredne
operacije bile brže – Nakon preslaganja veličina korenske liste je najviše 𝐷(𝑛 + 1), a svako stablo ima stepen
jedinstven u toj listi)
Napravi-Prazan-Hip() – Jednostavna operacija konstantnog trajanja 𝑂(1)
Minimum(H) – H.min ukazije na minimalan čvor. Jednostavna operacija konstantnog trajanja 𝑂(1)
DODAVANJE ČVORA
Doda se novi čvor kao koren stabla. Potencijal se poveća za 1.
Razlika pre i posle dodavanja ΔΦ = 1.
Stvarno trajanje operacije je 𝑂(1), a amortizivano je 𝑂(1) + 1 = 𝑂(1)
UNIJA DVA HIPA
Spajanje dve liste se vrši
u konstantnom
vremenu.
ΔΦ = Φ 𝐻 − Φ 𝐻1 + Φ
𝐻2 = 0
Trajanje je jednako amortizovanoj složenosti Θ(1).
IZDVOJ MINUMUM
Sprovodi se u tri faze:
a) Izbaci se koren sa minimumom
b) Njegova deca postaju koreni novih stabala
c)
Ovde se pojavljuje konsolidacija
KONSOLIDACIJA
Pomoćna operacija koja prepakuje korenska stabla, tj. svako stablo ili ostavlja ili ga spoji sa drugim stablom iste
veličine. Na kraju sva stabla imaju drugačiju veličinu – Niz 𝐴 ukazuje na stabla veličina 0,1,2...
SLOŽENOST IZDVAJANJA MINIMUMA
Brisanje stabla sa minimumom u korenu i postavljanja njegovih 𝐷(𝑛) dece kao nove korene zahteva 𝑂(𝐷(𝑛)) i
poveća potencijal za 𝐷(𝑛) − 1.
Broj iteracija ne može biti veći od broja korena, tj. 𝐷(𝑛) + 𝑡(𝐻). Stvarno vreme je O(𝐷(𝑛) + 𝑡(𝐻))!
Konsolidacija traje 𝑂(𝑚 + log2𝑛) gde je 𝑚 broj korena pre konsolidacije (a na kraju je 𝑂(log2𝑛) i svaki koren ima
drugačiji stepen).
UMANJI-KLJUČ
Ako umanjenje ključa 𝑥 narušava strukturu hipa onda se 𝑥 odvaja od roditelja 𝑦. Time roditelj 𝑦 gubi dete, ali ako
je to drugo dete treba ga postaviti kao korensko stablo i to se kaskadno primenjuje na njegovog roditelja. Oznaka
se postavi kada se odvoji prvo dete. Amortizovano vreme izvršavanja je 𝑂(1)!
BRISANJE ČVORA
Svodi se na smanjenje ključa na -∝ kako bi ga uklonilko izdvajanje
minimuma.
Amortizovano vreme izvršavanja je 𝑂(𝐷(𝑛)) = 𝑂(log2𝑛)
25. 2-3-4 STABLO I B-STABLO
Više se ne upotrebljava, ali ima istorijsku važnost. Sastoji se od
čvorova sa po 2 ili 3 ili 4 deteta. Stablo je idealno balansirano (svaki
list je podjednako udaljen od korena).
Pretraga je slična kao kod BSP, ali se kod čvorova sa više ključeva
poredi sa svima njima i ako traženi ključ nije među njima prelazi se na
odgovarajuće dete u zavisnosti od pridruženog intervala vrednosti
ključeva.
DODAVANJE U 2-3-4 STABLO
Dodavanje je dozvoljeno samo na poslednji nivo (u lišće). Iako postoji prostor u nekom čvoru na višem nivou ne
može se dodati novi ključ jer bi se narušila osobina da je putanja do svakog lista jednaka.
Dodavanje u čvorove sa 1 ili 2 ključa je trivijalno. Ako treba dodati element u čvor sa postojeća 3 ključa, onda se
taj čvor „cepa“ na dva čvora, a srednji ključ (element) se prebacuje u roditeljski čvor (u viši sloj).
Npr. Dodaje se 5 u čvor [4,7,8] pa se 7 prebacuje u roditeljski čvor. Da bi se izbeglo naknadno proširivanje
roditeljskog čvora (i potencijalno rekurzivno proširivanje sve do korena stabla) u postupku dodavanja, koji kreće
od korena, na putanji koja vodi do lišća se pri nailasku na svaki čvor sa 3 ključa vrši njegovo „cepanje“.
Na ovaj način se potencijalno pravi prostor koji neće biti
popunjen, ali je cilj da se svakako obezbedi prostor za dodavanje
elementa na poslednji nivo bez potrebe da se naknadno
koriguju gornji nivoi (znači, postoji samo jedan prolaz na dole).
B-STABLO
Sve operacije sa BSP su trajanja 𝑂(ℎ) gde je ℎ visina stabla – ℎ je između log2 𝑛 i 𝑛.
Motiv: balansirano stablo održava ℎ = 𝑂(log2𝑛).
SVE OPERACIJE SA BSP SU TRAJANJA 𝑂(LOG2𝑛)!
PRETRAŽIVANJE STABLA
Pretraživanje, kao i kod drugih vrsta stabala, počinje od korena stabla i nastavlja se tako što se pri svakom koraku
pretrage ustanovljava da li tražena vrednost ključa postoji u trenutno pretraživanom čvoru, u nekom od njegove
dece ili ne postoji u stablu.
DODAVANJE NOVOG ELEMENTA
Slučaj prekoračenja dozvoljenog broja elemenata prilikom dodavanja novog. Novi element se uvek dodaje na dno
stabla, kao novi elemenat u nekom od listova. Ukoliko u nekom trenutku broj elemenata u nekom od čvorova
pređe dozvoljenu vrednost od 2k, elemenat najbliži sredini niza elemenata biva izdvojen iz niza i dodat u roditelja
čvora kome je pripadao, istovremeno postajući roditelj svih elemenata sa njegove leve odnosno desne strane.
VISINA B-STABLA
Teorijski, stablo sa 𝑛 ključeva i minimalnim stepenom 𝑡 ≥ 2, ima visinu ℎ ≤ log𝑡𝑛 + 1.Najmanje 1 ključ u korenu, svi
ostali čvorovi 𝑡 − 1. Znači, najmanje 2 čvora na dubini 1, najmanje 2𝑡 čvorova na dubini 2, najmanje 2𝑡 2 čvorova
na dubini 3, … najmanje 2𝑡 ℎ−1 čvorova na dubini ℎ Ukupno ključeva: 𝑛 ≥ 1 + 𝑡 − 1 σ𝑖=1 ℎ 2𝑡 𝑖−1 = 1 + 2 𝑡 − 1 𝑡 ℎ−1
𝑡−1 = 2𝑡 ℎ − 1 Odatle je: 𝑡 ℎ ≤ (𝑛 + 1)/2
Da je prethodno opisanim operacijama dozvoljeni broj elemenata u roditeljskom čvoru bio narušen, proces bi bio
ponovljen i za njega. Ukoliko do ovakve situacije dođe u korenu stabla, neminovno je povećanje visine stabla za
jedan.
BRISANJE ELEMENTA IZ STABLA
Operacija brisanja elementa može rezultovati gubljenjem osobina B-stabla. Pritom se isključivo radi o povredi
pravila o minimalnom broju elemenata po čvoru. Pristup problemu se sastoji u tome da se u čvor koji nakon
brisanja poseduje k-1 elemenata ubaci element iz roditeljskog čvora. Ovaj proces se može ponavljati rekurzivno,
od dna stabla prema vrhu.
Pritom se izdvaja slučaj kada stablo iz koga se briše jedan element ima minimalan broj elemenata u svakom čvoru.
Ovo znači da će na kraju procesa koren stabla koga čini samo jedan element biti utopljen u jedno od svoje dece a
pritom će svako od njih imati tačno po k elemenata.
U ovom slučaju završni korak je stapanje to dvoje dece u novi čvor koji će postati koren stabla. Jedna od posledica
brisanja u ovom slučaju je smanjenje visine stabla h za jedan.
26. SLOŽENOST RAČUNANJA I KLASE PROBLEMA (P, NP, EXP, R, PROBLEM ODLUČIVANJA, PRIMERI)
Probleme ćemo za početak podeliti u dve “interne” kategorije:
1. Jednostavni problemi – do sada smo posmatrali samo njih. To su pretrage sortiranja, obilazak grafa,.. Za
jednostavne probleme postoje efikasni algoritmi lija je vremenska složenost O(P(n)) ograničena nekim
polinomom P(n), zavisan od veličine ulaza n. Klasu efikasnih algoritama označavamo sa P jer imaju
polinomsko vreme izvršavanja( ~nc).
-U ovu klasu problema spadaju i problemi čija je složenost npr. O(n10), O(n100),... To nisu brzi
algoritmi, a i izmišljeni su!
-U praktičnoj primeni je obično mali stepen vremenske složenosti p algoritama (npr. n2
)
Takođe, rešenje P problema se može jednostavno proveriti
2. Složeni problemi - su svi oni problemi koji nemaju rešenje u obliku jednostavnih algoritama, što znači ne
mogu se rešiti u polinomskom vremenu. Postoji dosta algoritama za čije rešenje se ne zna ni jedan algoritam
polinomske složenosti.
OSNOVNE KLASE PROBLEMA
P – problemi rešivi u polinomskom vremenu ( ~nc)
EXP – problemi rešivi u eksponencijalnom vremenu ((~2n)c)
R – problemi rešivi u konačnom vremenu
Nerešivi problemi
PRIMERI SLOŽENIH PROBLEMA
1. Problem “Trgovačkog putnika”.Preduzeće koje isporučuje pošiljke koristi vozila za prevoz. Svako vozilo u
radnom danu treba da preveze n paketa na n lokacija i da se vrati u garažu.
-To znači da vozilo treba da poseti n + 1 lokaciju.
-Predpostavimo da se za prevoz iz svake u svaku drugu lokaciju poznaju troškovi prevoza.
(tabela sa (n + 1)*( n+1) vrednosti)
-Treba odrediti rutu koja polazi i završava se u garaž, a da su ukupni troškovi prevoza što je moguće manji!
Koliko je težak ovaj problem? Koliko ima različitih putanja? Broj putanja je n! (faktorijel)
Realni podaci: vozilo u proseku prevozi 170 paket od kojih se nekoliko isporuči na istu adresu. Neka
se radi o svega 20 različitih adresa, što daje 20! = 2.432.902.008.176.630.000 putanja.
-Ako program generiše/procesira 1012 (nerealno velik broj) putanja svake sekunde treba mu mesec
dana da obradi svoje putanje!
-Ako program generiše/procesira 109(i dalje veliki broj) putanja svake sekunde treba mu oko 1000
meseci!
- Ta obrada se odnosi samo na jedno vozilo i jedan dan. Veliki isporučioci imaju desetine hiljada
vozila i rade svaki dan u nedelji.
- Rešavanje problema analizom svih mogućih putanja nema smisla, jer dok pronađemo odgovarajuću
koja daje najmanje troškove – nije praktičan algoritam!
- Postoji polinomsko rešenje ovog algoritma, ali još ne postoji algoritam. Isto tako, nije dokazano ni
da ne postoji algoritam. Mi kao inženjeri uzimamo rešenje koje nije najbolje ali je dovoljno dobro.
- Za ovu klasu problema postoje brojni aproksimativno algoritmi. Npr. aproksimativni algoritam za
problem trgovačkog putnika radi u polinomskom vremenu, a daje putanju koja je 50% duža od
optimalne.
2. Otkrivanje zatvorene putanje u usmerenom grafu čije je pojačanje negativno ε P.
3. Šah na tabli n x n ∈ EXP (ne pripada ∉ P)
4. Tetris ∈ EXP, ali se ne zna da li je ∈ P (Da li se sekvenca datih oblika može preživeti)
5. Halting problem ∉ R
- Da li se neki kompijuterski program završava ili se beskonačni izvršava?
-Ni jedan algoritam ovo ne rešava korektno u konačnom vremenu za proizvoljni dati program(ulaz)
- Ujedno je i problem odlučivanja čiji je izlaz {Da, Ne}
6. Traženje najkraćeg/najdužeg puta u grafu.
- Traženje najkraćeg puta u grafu G(V,E) od datog čvora je algoritam složenosti O((m + n)*log2n)
-Traženje nadužeg puta u grafu između dv čvora je NP – kompletan problem
7. Ojlerova putanja/Hamiltonov ciklus u grafu
-Ojlerova putanja u grafu je kružna putanja koja prolazi kroz svaku granu grafa(tačno jednom) i pri tome
dozvoljava višestruke posete istom čvoru. Grane ojlerove putanje se mogu odreditu u O(m) vremenu.
-Hamiltonov ciklus je zatvorna putanja koja sadrži svaki čvor grafa sadrži tačno jednom
PROBLEM ODLUČIVANJA
Problem odlučivanja je funkcija f: N → {0,1}
- Ulaz je binarni string ~ celobrojan nenegativan broj N
-Izlaz je {Da, Ne} {0,1}
Ovo se može posmatrati kao mapiranje gde se svakom mogućem ulazu dodeljuje 1 bit. Time se
dobija beskonačan niz bita (0.1101101001...) što je definicija realnog broja, tj. problema odlučivanja
ima |R|.
- Ako posmatramo sve moguće programe (program ~ konačan binarni string) i sve moguće
probleme ispada da je broj programa mnogo manji od problema |N|<<|R|. Ovo je teorijski
interesantno, ali srećom, većina praktičnih problema ima rešenje.
27. NP PROBLEMI (DEFINICIJA P I NP PROBLEMA, VRSTE NP PROBLEMA, REDUKCIJA)
DEFINICIJA
• NP problem je podskup problema odlučivanja. Rešiv je u polinomskom vremenu uz
upotrebu nedeterminističkog modela računanja (nedetrminističke mašine).
-Gde svako računanje ima grananje i ona se mogu jednovremeno sračunati.
• Nedeterministički model računanja se mže sprovoditi na determinističkoj mašini(~klasičan
računar), ali sporo( rekurzivno, bez mogućnosti jednovremenog računanja).
Deterministička mašina bi radila fikasno kao i nedeterministička kada bi kod svakog
odlučivanja “srećno” pogodila granu (put) koji vodi ka rešenju (bez probanja svih opcija kod
grananja).
• Kod NP problema se ne zna algoritam za “brzo” dobijanje rešenja (rešenje se ne dobija u
polinomskom vemenu), ali se dobijeno rešenje može proveriti pomoću determinističke
mašine u polinomskom vremenu.
Primeri:
1. Problem sume podskupa. Dat je skup celih brojeva. (Da li prostoji neprazan podskup čija
je suma nula?
-Na skupu {-2, 3, 15, 14, 7, -10} postoji podskup {-2,-3,-10,15} čija je suma 0
-Jednostavno se proverava – u linearnom vremenu (treba samo sabrati sve elemente
podskupa).
-Teško se pronalazi jer treba probati 2n – 1 kombinacija (što je eksponencijalno vreme).
2. Tetris NP (za datu listu ulaza određuje da li će igrač “preživeti”)
-Nedeterministički algoritam – odluka kod svakog poteza
-Dokaz za “preživljavanje” je jednostavan – treba imlementirati ponašanje poteza i
primeniti ih.
•
Svaki P problem je ujedno i NP problem je ne samo da se za dato rešenje P problema
može proveriti da je ono konkretno, nego se za P vreme može i pronaći takvo rešenja.
•
Milenijumski problem: P = NP ili P ≠ NP. Da li za svaki problem za koji neki algoritam
može brzo da se proveri dato rešenje (u polinomskom vremenu) takođe postoji algoritam
koji brzo pronalazi takvo rešenje (u polinomskom vremenu) tj. da li su svi NP problemi
ujedno i P?
-
Većina smatra da je P≠ NP ali za to nema dokaz.
U načelu traženje rešenja problema (ili dokazivanje da je rešenje korektno) je teže od
njegove same provere.
- Jedan od 7 matematičkih problema definisan 2000. godina od strane Clay Mathematics
instituta za korektno rešenje donosi nagradu od 1 milion $.
KLASE NP PROBLEMA
1. NP – težak (NP –hard) je problem težak kai svaki NP problem. Ne mora biti NP problem
jer se njihova rešenja mogu proveriti u polinomskom vremenu. VRATI SE
2. NP – kompletni prolemi (NP – complete) su “ najteži u NP klasi problema.
Problem je tipa NP – kompletan ako zadovoljava 2 uslova:
a) On je podklasa NP problema (rešenje se može proveriti u polinomskom
vremenu).
b) Ako za problem postoji algoritam koji se izvršava u polinomskom vremenu,
onda postoji način da se svaki NP problem konvertuje u taj problem na način da
se svi oni izvršavaju u polinomskom vremenu, tj. efikasan algoritam za NP –
kompetan problem postoji akko za svaki NP – kompletan problem postoji
efikasan algoritam.
Rasprostranjeno je verovanje da NP – kompletni problemi nemoju efikasan algoritam, ali to nije
dokazano, a ni obrnuto. Danas se za dosta problema zna da su klase NP – kompletni.
Postoje u brojnim oblastima: bulova logika, aritmetika, dizajn mreža, skupovi i particionisanje,
skladištenje i očitavanje podataka, algebra i teorija brojeva, teorija igara, slagalice, automati,
optimizacija, biologija, hemija, fizika,...
NP – kompletni problemi se rešavaju tehnikama koje daju približno rešenje – rešenja nisu
optimalna (najbolja moguća).
-Približno rešenje je bolje nego nikakvo.
-Približno rešenje je obično dovoljno dobro.
Primeri NP –kompletnih problema
1) Problem ranca (Knapsack problem) – je problem kombinatorne optimizacije, takav
da u ranac poznate nosivosti staviti što je veći broj stvari (maksimalno) mokuće.
2) Hamiltonov put – problem teorije grafova. Da li postoji putanja u grafu koja u kojoj
se svaki čvor posećuje samo jednom?
3) Trgovački putnik – problem kombinatorne optimizacije, gde je dat spisak gradova i
mežusobnih rastojanja. Koja je najkraća putanja gde se svaki grad posećuje samo
jednom i vraća se u polaznu tačku.
4) Izomorfizam podgrafova – data su dva grafa. Da li je drugi sadržan u prvom (da li je
njegov podgraf jednak drugom podgrafu)?
5) Problem sume podskupa – Dat je skup celih brojeva. Da li postoji neprazan podskup
čija je suma nula?
6) Klik problem – problem teorije grafova. Traži se maksimalan podgraf gde su svi
čvorovi međusobno povezani saki sa svakim.
7) Bojenje grafa – teorija grafova. Traži se minimalan broj boja u grafu kojima možemo
obojiti čvorove tako da susedni čvorovi budu ražličitih boja.
8) Najduža zajednička podsekvenca od n stringova (DNK).
9) Puzzle igre
•
•
Kako znamo da je NP problem kompletan?
Kada određujemo da je problem NP – kompletan, onda definišemo koliko je problem
težak, uz ogradu da se radi o problemima odlučivanja. Pokušavamo da dokažemo da je za
očekivati da ne postoji efikasan algoritam koji rešava problem
•
Tri koncepta se koriste da se pokaže da je problem NP – kompletan:
1) Problem se svodi na problem odluke (rešenje problema svodi na
odgovor”da/ne”).
2) Problem se redukuje (u polinomskom vremenu) na drugi problem za koji se
predpostavlja da je iz klase NP i tako redom dok se transformacijama ne svede
na “prvi NP – kompletan problem”.
3) na “prvi NP – kompletan problem” je problem za koji je dokazano da je NP –
kompletan
•
Kada se za neki problem proglasi da je NP – kompletan, onda je to dovoljan dokaz da ga
za sada ne možemo efikasno rešiti. Ne traži se uzaludno brz algoritam, već se energija
usmerava ka razvoju algoritma za aproksimativno rešenje. Mnofi često sretani i
interesantni problemi se čine od problema sortiranja, graf pretrage i sl., ali su NP –
kompletni problemi
REDUKCIJA – je konvertovanje problema koji se rešava, u problem za koji imamo rešenje. Najčešće
upotrebljavana tehnika rešavanja problema.
28. SEKVENCIJALNI I PARALELNI ALGORITMI (OPIS, AMDALOV ZAKON, PRIMERI I POTEŠKOĆE IMPLEMENTACIJE)
OPIS
1. Paralelni algoritmi – u poslednje vreme je jedan od glavnih pravaca razvoja računarstva,
gde se u računaru sa procesorom od više jezgara i/ili više procesora. Razvijaju se različite
tehnike i modeli izračunavanja koje u osnovi omogućavaju jednovremeno izvršavanje
delova algoritma.
2. Sekvencijalni algoritmi – su svi algoritmi sortiranja i pretrage grafova koje smo do sada
radili. Osnovne mere složenosti sekvencijalnih algoritama su:
-vreme izvršavanja
-veličina upotrebljene memorije.
Dok, kod paralelnih algoritama se gledaju isti indikatori složenosti, al i se vodi računa i o
drugim resursima: npr. broj angažovanih procesora.
Nisu svi problemi pogodni za rešavanje paralelnim algoritmima! Suštinski sekvencijalni
problemi se ne mogu brže izvršavati ni kada imamo neograničen broj procesora.
Većina algoritama se može makar delom “paralelizovati”, ali ne u svim delovima
npr.
problem koji je idealan za paralelizovanje će se 2 x brže izvršavati upotrebom dva procesora u
odnosu na upotrebu jednog procesora(to nije realno očekivati!).
AMDALOV ZAKON (Amdahl’s law)
- Ovaj zakon daje teorijski maksimalno ubrzanje obrade algoritma kada se upotrebi više
procesora. Vreme izvršavanja upotrebom više procesora po zakonu iznosi:
n – broj procesora (niti izvršavanja), B - ϵ [0,1] – deo algoritma koji je sekvencijalan,
T(1) – vreme izvršavanja upotrebom jednog procesora.
Odnosno ubrzanje iznosi:
Primer amdalovog zakona
• Neka je za izvršavanje algoritma na jednom procesoru potrebno 30 min. Taj algoritam ima deo od 3 min koji
se ne može paralelizovati, dok se preostalih 27 min izvršavanja (90%) može paralelizovati.
• Maksimalno ubrzanje ne može biti bolje od 10 puta:
• Ubrzanje sa 4 procesora je 3.08 puta:
26.
27.
28.
29.
.
.
.
GRAFOVI (DEFINICIJA, TIPOVI, PRIMENA, VRSTE ALGORITAMA)
DEFINICIJA
•
Grafovi (graphs) – se izučavaju u teoriji grafova ( oblast diskretne matematike i računarske nauke). Graf je
matematička strktura za modelovanje odnosa između parova objekata.
•
Graf se sastoji od:
- čvorova (objekata) – nodes, vertices &
-grana (koje povezuju parove objekata) – edges
Matematička definicija
- Graf G = (V,E) se sastoji od skupa čvorova V, i skupa grana E.
- Grane su dvoelementni podskup od V
- Red grafa je broj čvorova |V|
- Veličina grafa je broj grana |E|
TIPOVI
Grafovi se dele na dva tipa:
1. sa stanovišta usmerenosti grana:
- neusmereni,
- usmereni,
- mešoviti (samo deo grana je orijentisan) - aciklični (nema “petlje”- kružne putanje)
2. sa stanovišta parametara grana:
- direktni
- težinski
PRIMENA GRAFOVA
•
•
•
Grafovi se upotrebljavaju za modelovanje mnogih praktičnih problema.
Tipično modeliraju relacije i dinamiku procesa u fizičkim, biološkim, socijalnim i informatičkim sistemima.
U računarstvu se grafovi koriste za predstavljanje računarske mreže, organizacije podataka i sl.
-DODATAK (BOJANA)
Grafovi se izučavaju u teoriji grafova. Graf je matematička struktura za modelovanje odnosa između parova objekata.
Sastoji se od čvorova (objekata) i grana (povezuju parove objekata)
Grafovi su u matematici dvoelementni podskupovi od V (skup čvorova), red grafa je broj čvorova |V|, a veličina grafa je
broj grana |E|
Tipovi:
1. sa stanovišta usmerenosti grana - neusmereni, usmereni, mešoviti (samo deo grana je orijentisan)
2. sa stanovišta parametara grana - direktni i težinski
3. sa stanovišta postojanja petlji - aciklični, ciklični
Primena - za modelovanje mnogih praktičnih problema, za modelovanje relacije i dinamike procesa u fizičkim,
biološkim, socijalnim i informatičkim sistemima, za predstavljanje računarske mreže i organizacije podataka u
računarstvu isl.
Primena:
- za modelovanje mnogih praktičnih problema, tipično relaciju i dimaniku procesa u fizičkim, biološkim, socijalnim i
informatičkim sistemima.
- u računarstvu se koriste za predstavljanje računarske mreže, organizacije podataka isl.
Vrste algoritama??? (za topološko sortiranje i obilazak grafa??)
30.
TOPOLOŠKO SORTIRANJE GRAFA
Topološko soritranje usmerenog grafa – je linearno uređivanje čvorova, tako da je čvor u ispred čvora v, kada ih
spaja grana (u,v). Poredak ne mora biti jedinstven.
PRINCIP
1. Svakom čvoru, pridružujemo broj ulaza = broj grana koje završavaju u čvoru
2. Biramo čvor bez ulaza (broj ulaza je 0). Postavimo ga na kraj sortiranog reda, uklonimo ga iz grafa
Topološko sortiranje direktnog acikličnog grafa (DAG) se može sprovesti na osnovu DFS-a.
DODATAK (BOJANA)
Topološko sortiranje usmerenog acikličnog grafa je linearno uređivanje čvorova tako da je čvor u ispred čvora v
kada ih spaja grana (u,v). Poredak ne mora biti jedinstven
Dobija se niz čvorova sortiran definisanim poretkom (koji ne mora biti jedinstven)
Princip:
1. svakom čvoru pridružujemo broj ulaza (broj grana koje završavaju u čvoru)
2. biramo čvor bez ulaza (broj ulaza == 0), dodamo ga u izlazni niz (sortian), ukolimo ga iz grafa, smanjimo broj
ulaza u čvorovima sa kojima je povezan (korak 2 ponavljamo dok ima čvorova u grafu)
Topološko sortiranja DAG se može sprovesti na osnovu DFS-a.
MOJ DODATAK:

Topološko sortiranje može se primeniti samo na usmerene
aciklične grafove (DAG). Ako graf sadrži cikluse, ne postoji
mogućnost topološkog sortiranja.

Topološko sortiranje je korisno za rešavanje problema zavisnosti
ili redosleda izvršavanja. Na primer, u planiranju rasporeda
aktivnosti, topološko sortiranje omogućava određivanje
redosleda aktivnosti tako da se zadovolje uslovi zavisnosti.
31.

Poredak dobijen topološkim sortiranjem ne mora biti jedinstven.
Graf može imati više od jednog mogućeg topološkog redosleda.

Princip topološkog sortiranja uključuje dodeljivanje broja ulaza
svakom čvoru. Broj ulaza predstavlja broj grana koje završavaju u
tom čvoru. Čvorovi bez ulaza (broj ulaza je 0) biraju se kao
početni čvorovi u sortiranom redosledu.

Nakon što se čvor bez ulaza dodaje u sortirani redosled, taj čvor
se uklanja iz grafa, a broj ulaza se smanjuje u svim čvorovima koji
su povezani s njim. Ovaj korak se ponavlja sve dok ima čvorova u
grafu.

Topološko sortiranje grafa može se efikasno sprovesti na osnovu
DFS-a (Dubina-Prvi Pretraga). DFS može obići čvorove grafa u
dubinu i sortirati ih u obrnutom redosledu povratka, dodajući
svaki čvor na početak sortiranog redosleda.

DFS se često koristi za rešavanje problema topološkog sortiranja,
ali postoje i druge efikasne metode, kao što je algoritam
zasnovan na indeksima ulaza.

Topološko sortiranje se koristi u različitim oblastima, kao što su
računarstvo, bioinformatika, planiranje rasporeda, analiza
podataka, optimizacija i mnoge druge.
OBILAZAK GRAFA U ŠIRINU
•
•
BFS algoritam je jedan od najednostavnijih algoritama za pretragu grafova. Predstavlja osnovu drugim
algoritmima.
Pretraga polazi od izvornog čvora i pokušava da dopre do svakog čvora koji je dostupan, dajući informaciju
njgove udaljenosti (polje d u strukturi - distance) od izvornog čvora.
•
Nazvan je po načinu rada gde se “front” pretrage širi tako da nakon obilaska čvorova na rastojanju k od izvora
nastavlja sa otkrivanjem čvorova na rastojanju k + 1.
•
Ako neki čvor iz matrice susedstva nema vezu sa ostalim čvorovima (predstava ostrva) taj čvor neće ni ulaziti u
obradu.
•
•
Za svaki čvor daje najkraći put od izvornog čvora.
Algoritam radi sa orijentisanim i neorijentisanim grafovima.
PRINCIP RADA
•
Posle inicijalizacije, algoritam nikad ne beli čvor. Na osnovu uslova u Queue se dodaju samo beli čvorovi.
Ukupan broj operacija Enqueue i Dequeue složenosti O(1) je n, gde je n broj čvorova.
• Kada se čvor ubaci u Q onda se skenira njegova lista susedstva. To se radi za svaki dostupan čvor na istoj
udaljenosti od predhodnog, te se skeniraju sve grane u grafu. (bez ostrva)
Ukupno vreme izvršavanja
algoritma je O (V + E).
DODATAK JA:
BFS algoritam je jedan od najjednostavnijih algoritama za pretragu grafova, predstavlja osnovu drugim algoritmima
(Dijkstra, minimalno stablo razapinjanja...)
Algoritam radi i sa orijentisanim i neorijentisanim grafovima i za svaki čvor daje najkraći put polazeći od izvornog čvora
Pretraga polazi od izvornog čvora i pokušava da dopre do svakog čvora koji je dostupan, dajući informaciju njegove
udaljenosti od izvornog čvora
Nazvan je po načinu rada gde se front pretrage tako da nakon obilaska čvorova na rastojanju k od izvora nastavlja sa
otkrivanjem čvorova na rastojanju k+1
Ako neki čvor iz matrice susedstva nema vezu sa ostalim čvorovima, taj čvor neće ni ulaziti u obradu
Tokom rada algoritam svaki čvor boji u: belo (još nije uzet u obradu), sivo (čeka na obradu) i crno (obrađen) [tokom bojenja
svaki čvor osim izvora tačno 2 puta promeni boju]
Algoritam izgrađuje stablo pretrage u širinu
Princip rada:
- posle inicijalizacije, algoritam nikad ne beli čvor - na osnovu Queue se dodaju samo beli čvor
- ukupan broj operacije Enqueue i Dequeue je složenosti O(1) ne n (n je broj čvorova)
- kada se čvor ubaci u Q onda se skenira njegova lista susedstva; to se radi za svaki dostupan čvor na istoj
udaljenosti od prethodong, te se skeniraju sve grane u grafu (osim ako nisu odvojena)
- ukupno vreme izvršavanja algoritma je O(V + E)
Algoritam izgrađuje stablo pretrage u širinu (eng. Breadth-first tree)
– U korenu stabla je polazni (izvorni) čvor
– Svaki drugi čvor ima vezu ka roditeljskom čvoru u stablu
• Veza ka roditelju je predstavljena poljem pred
Čvorovi sadrže:
• boju - boja
• vezu ka prethodnom čvoru - pred
• rastojanje od polaznog čvora (u
broju pređenih grana) - d
32.
OBILAZAK GRAFA U DUBINU
DFS algoritam je koncipiran tako da pretražuje u dubinu sve grane koje se nalaze u grafu, bile one usmerene ili
neusmerene algoritam radi. Pošto pretražuje sve čvorove grafa, za razliku od BFS-a pretražuje i ostrva, koja nisu u
relaciji sa izvornim čvorom. (što je i jedna od primena DFS-a)
Vremenske značke (polja) niza struktura V
strukture G:
G. – struktura
|
|
Adj.matrix n x n matrix – matrica susedstva
v 1xn – niz struktura, liste susedstva reda n
|
(.d) - kada je otkriven čvor (discovery time)
|
(.f) – kada je obrada čvora završena (finish time)
|
(.color) – trenutno stanje (bela, siva, crna)
|
(.pred) – ID predhodnog čvora
U usmerenom grafu:
• Grane stabla (eng. tree edge) – grane preko kojih se posećuju čvorovi (u primeru
debele sive grane) – grana koja završava u belom čvoru
• Povratne grane (eng. back edge) – ka prethodnom čvoru u stablu (u primeru
označene sa „P“) – grana koja završava u sivom čvoru
• Preskočna grana (eng. forward edge) – ka čvoru u stablu dalje od tekućeg (u primeru
označene sa „S“) – grana (𝑢, 𝑣) koja završava u crnom čvoru i 𝑢. 𝑑 < 𝑣. 𝑑
• Unakrsne grane (eng. cross edge) – između dva podstabla (koja nemaju zajedničke
čvorove - pretke) (u primeru označene sa „U“) – grana koja završava u crnom čvoru i
𝑢. 𝑑 > 𝑣. 𝑑
PRINCIP RADA
•
DFS za usmeren graf forsira preodiranje u dubinu po principu izbora manjeg ID –a u slučaju da jedan čvor ima
više suseda. Kada stigne do kraja (neki čvor nema više suseda), taj čvor postaje crn i njegovo vreme se
registruje u polju (.f), tada prelazi u suseda od (.pred) sa najmanjim ID – om. Gleda sve njegove susede i onda
se rekurzivno vraća unazad, dok svi ne postanu crni. Prvi siv u (.d) biva poslednji crn u (.f) za tekuće ostrvo,
zbog osobine rekurzije ovog algoritma. Kada obradi celo ostrvo prelazi na sledeće sa početnim najmanjim ID
– om.
•
Klasifikacija grana na osnovu DFS –a na usmerenom grafu:
- Grane stabla (edges)
- Preskočna grana (farward edge)
- Povratne grana (backward edge)
- Unakrsne grana (cross edge)
CIKLUS
Detekciju kružne grane vrši DFS – kružna putanja postoji ako postoji povratna grana.
**
DFS algoritam je napravljen tako da pretražuje u dubinu sve grane koje se nalaze u grafu, bez obzira na usmerenost
Za razliku od BFS-a pretražuje i ostrva koja nisu u relaciji sa izvornim čvorom (jedna od primena DFS-a)
Struktura graf je imala nxn matricu susedstava, ili 1xn listu susedstava
Struktura čvora u grafu je saržala polja .d (kada je otkriven čvor), .f (kada je obrada čvora završena), .color (boju) i .pred
(pret)
Klasifikacije grana na osnovu DFS-a u usmerenom grafu:
~ grane stabla, preskočna grana, povratna grana*, unakrsna grana
Detekciju kružne grane vrši DFS - kružna putanja postoji ako postoji povratna grana
Vreme izvršavanja algoritma: (-)(V + E)
Princip rada:
DFS za usmeren graf forsira prodiranje u dubinu tako što bira manji ID u slučaju da jedan čvor ima više čvorova
Kada stigne do kraja (nema više suseda), taj čvor postaje crn i njegovo vreme se registruje u polju .f i tada prelazi u suseda
od .pred sa najmanjim ID-om
Gledaju se svi njehovi susedi i onda se rekurzivno vraća unazad, dok svi ne postanu crni
Prvi siv u .d postaje poslednji crn u .f za tekuće ostrvo (zbog osobine rekurzije)
Kada obradi celo ostrvo, prelazi se na sledeće polje sa početnim najmanjim ID-om
KRUŽNA PUTANJA:
Detekcija kružne putanje
• Kružna putanja postoji kada se kratanjem po grafu naiđe na ranije posećen čvor.
• Da li graf ima kružnu putanju (ciklus)? - je važno pitanje
• Detekciju vrši DFS
• Graf ima kružnu putanju ako postoji povratna grana!
– Kružna putanja se dobija, polazeći od povratne grana, prateći grane stabla (tree edge)
33.
NAJKRAĆI PUT U GRAFU (DEFINICIJA, VARIJANTE, ALGORITMI)
DEFINICIJE
1. Netežinski grafovi:
BFS – pronalazi najkraći put u netežinkom grafu – razmatra se broj grana
2. Težinski grafovi:
• Posmatra se usmereni težinski graf G = (V,E,w) gde su težine zadate funkcijom w : E --> R
• Težina w(p) putanje p = (v0, v1, v2, ... ,vk) je suma težina grana te putanje, a cilj je pronaći p sa najmanjom
težinom.
•
•
Dijkstra algoritam – ograničava težine na nenegativne težine grana. Složenost je O( V*log2(V+E) ).
Belman Ford – graf može imati i pozitivne i nenegativne težine grana. Omogućava detekcije kružne putanje
nenegativnog pojačanja. Složenost je O (V*E) i ona ne zavisi od težina w.
3. DAG – umseren aciklični graf (linked topological-sort)
Algoritam dozvoljava grane negativne težine, ali to ne utiče na algoritam, jer DAG po definiciji nema ciklus
(negativne) backward edges.
VARIJANTE NAJKRAĆEG PUTA
1.
2.
3.
4.
Najkraći put od zadatog čvora, do svih ostalih čvorova u grafu. (osnovni problem)
Najkraći put do zadatog čvora od svih ostalih čvorova u grafu ( problem se rešava kao osnovni problem)
Najkraći put između zadatih čvorova i odredišta ( rešava se kao osnovni problem)
Najkraći put između svih čvorova u grafu (može se rešiti na principu br. 2 za svaki čvor, ali se rešava posebnim
algoritmom)
POTEŠKOĆE
•
•
Grane sa negativnim težinama
-Zašto imamo grane sa negativnim težinama?
-Kako ih predstaviti kao pozitivne?
Kružne putanje sa negativnim pojačanjem
- Da li je moguće da se algoritam nikada ne završi jer se d.v stalno smanjuje?
~ Netežinski grafovi:
BFS - pronalazi najkraći put u netežinskom grafu, razmatra se broj grana između čvorova
~ Težinski grafovi (težina putanje je suma težina grana te putanje, cilj je pronaći putanju sa najmanjom
težinom):
Dijkstra algoritam - ograničava težine na nenegativne težine grana, složenost O(V*log2V + E)
Bellman Ford - graf može imati i pozitivne i negativne težine grana, put ne mora da ima najmanji broj grana,
omogućava detekciju negativnog ciklusa, složenost O(V*E)
~ DAG:
Algoritam dozvoljava grane negativne težine ali to ne utiče na algoritam jer DAG po definiciji nema ciklus (a
samim tim ni negativav ciklus)
Varijante najkraćeg puta:
1. od zadatog čvora do svih ostalih čvorova u grafu (osnovni problem)
2. do zadatog čvora od svih ostalih čvorova u grafu (rešava se kao osnovni)
3. između zadatih čvorova i odredišta (rešava se kao osnovni problem)
4. između svih čvorova u grafu (poseban algoritam)
Poteškoće: grane sa negativnim težinama, negativni ciklusi (kružne putanje sa negativnim pojačanjem)
Generalna struktura algoritma najkraćeg puta:
1 inicijalizacija - svaki čvor u matrici dobija težinu Inf, prethodnika NIL i udaljenost od početnog 0
2 ponavljaj - nekako izaberi granu, relaksiraj granu (u,v): ako je trenutna putanja duža od zbira dve manje
putanje, ažuriraj
~ i to dok ne bude važilo za sve grane da se trenutna putanja ne može više smanjiti
Problem: "gruba sila" - loš izbor grana može dovesti do eksponencijalnog trajanja algoritma
Rešenje: primena osobina nejednakosti trougla i osobine da su delovi najkraćeg puta od u do t takođe najkraći
putevi
DAG-najkraća-putanja(G, w, s)
Topološki sortirati čvorove G u listu L
Inicijalizacija-izvora(G, s)
for each čvor u iz liste L
for each v iz G.susedi(u)
Relaksacija(u, v, w)
Inicijalizacija-izvora(G, s)
for each v iz G.V
v.d = Inf
v.pred = NIL
s.d = 0
Relaksacija(u, v, w)
if v.d > u.d + w(u,v)
v.d = u.d + w(u, v)
v.pred = u
34.
DIJKSTRA ALGORITAM
•
Dijkstra algoritam nalazi najkraći put id zadatog čvora u težinskom usmerenom grafu gde sve težine grana
nisu nenegativne (ima negativnih). Vreme izvršavanje je bolje od Belman- forda. PRINCIP RADA
•
Algoritam održava skup čvorova S gde su rastojanja od polaznog čvora određena (neće se menjati). Zatim bira
čvor u ϵ(V\S) sa najmanjim rastojanjem od u.d(prethodnog), dodaje ga u S i koriguje (relaksira) rastojanja do
svih čvorova preko grana koje izlaze iz u.
•
Inicijalizacija na početku:
-početni čvor ima težinu 0,
•
-ostali čvorovi su daleko ∞.
Kretanje se dogaža prema svim susedima i koriguju se njihove trenutna rastojanja na nova (relax). Bira se
komšija sa najmanjom težinom (udaljenošću) od početnog čvora i stavlja se u skup S. Gledaju ponovo svi
njegovi susedi i radi se relax. Ako su neki čvorovi već obrađeni, a imaju veće težine od one koja bi trebale da
dobiju od čvora koji se trenutno obrađuje, ponovo se radi njihov relax i koriguje se ratojnje.
PRINCIP RADA
Pretpostavimo da su težine grana
dužine deonica
2. Iz polaznog čvora krenu trkači
jednakim brzinama (u svim
dopustivim granama)
3. Kada prvi trkač stigne u neposećen
čvor
 zabeleži se vreme
 (to odgovara njegovoj najkraćoj
 razdaljini od polaznog čvora)
 preda se „štafeta“ drugim trkačima
 (kojih može biti više i trče svim
 dopustivim granama)
VREME IZVRŠAVANJA
Algoritam održava red sa minimalnom prioritetima (min – priority queue)
|V|=n
|E|=m
1. Implementacija Q nizom indeksiranim rednim brojem čvora (1, 2, ...,n):
• Operacije:
- Insert = O(1)
- Extract – min = O(n) – jer se pretražuje ceo niz
- Decrease key = O(1)
• Vreme izvršavanja: O(n2)
2. Implementacijom binarnog min-heap sve operacije traju O(log2n), a vreme izvršavanja je O ((m+n)*log2n)
U slučaju da je graf redak bolji je drugi način
Radi sa težinskim usmerenim grafom sa nenegativnim težinama
Nalazi najkraći put od zadatog čvora u grafu do svih ostalih čvorova
Vreme izvršavanja bolje od Belman-Forda
Princip rada:
- algoritam napravi skup čvorova S u kom se nalaze rastojanja od polaznog čvora (koja se neće menjati)
- bira se čvor iz tog skupa sa najmanjim rastojanjem od prethodnom i dodaje se u S i koriguje (relaksira) do svih čvorova
preko grana koje izlaze iz tog čvora
+ inicijalizacija: početni čvor ima težinu 0, ostali čvorovi su Inf
+ kretanje se događa prema svih susedima i koriguje njihova trenutna rastojanja na nova (relax), bira se komšija sa
najmanjom udaljenošću od početnog i stavlja se u skup S
+ ponovo se gledaju njegovi susedi i radi se relax
+ ako su neki čvorovi već obrađeni a imaju veće težine od one koja bi trebale da dobiju od čvora koje se trenutno obrađuje,
ponovo se radi relax i koriguje se rastojanje
Vreme izvršavanja - algoritam održava red sa minimalnim prioritetima
Implementacija Q sa nizom: O(n^2)
dodaj (-)(1), izvdoj-minium O(n), relaksacija (-)(1)
Implementacija Q sa binarnim min-heap: O((|E|+|V|)*log2|V|) [ovaj način je bolji za redak graf]
dodaj O(log2n), izdvoj-minimum O(log2n), relaksacija O(log2n)
Implementacjia Q sa Fibonačijevim hipom O(|E| + |V|*log2|V|)
izdvoj-minimum O(log2n), relaskacija O(1)
Dajkstra(G, w, s)
Inicijalizacija-Izvora(G,s)
S = (/)
Q = G.V
while Q!=(/)
u = Izdvoj-Minimum(Q)
S = S unija {u}
for each v iz G.susedi(u)
Relaksacija(u, v, w)
35.
BELLMAN-FORD ALGORITAM
Zasniva se na principu Relaksacije putanje
– Teorijski najdužu direktnu putanju (u najgorem slučaju) u grafu sa 𝑛 čvorova čine svi čvorovi grafa
i ona ima 𝑛 − 1 granu.
– Ako se u 𝑛 − 1 prolaza relaksiraju sve grane grafa, onda će se posle prvog prolaza sigurno dobiti
najkraće rastojanje 𝑠 → 𝑣1 (relaksira se 𝑣0, 𝑣1 ), posle drugog prolaza 𝑠 → 𝑣2 (relaksira se
𝑣1, 𝑣2 ), i tako redom, do poslednjeg prolaza 𝑠 → 𝑣𝑘 (relaksira se 𝑣𝑘−1, 𝑣𝑘 ).
Time se dobilo 𝑣𝑘. 𝑑 = 𝛿 𝑠, 𝑣𝑘 , što je najkraće rastojanje.
OSOBINE BELLMAN-FORD ALGORITMA:
• Rešava problem traženja najkraćih puteva za svaki čvor i kada postoje nenegativne težine grana otkriva
postojanje kružnih putanja nenegativnog pojačanja.
• Radi u polinomskom vremenu O(V*E) PRINCIP RADA
•
Radi tako što stalno koriguje(relaksira) sve grane u grafu, odnosno testira da li može da poboljša najbolju
putanju do traženog čvora kroz iteracije u grafu. Za jednu iteraciju algoritam je potrebno da prođe kroz sve
putanje koje su određene usmerenjima i težinama grana i u iteracijama se teži poboljšanju trenutnih stanja
čvorova. Iteracija ima onoliko koliko ima čvorova.
2.
primer
1.
3.
4.
•
Dogodila bi se još jedna iteracija provere ali je u ovom slučaju nepotrebna tako da može da se napusti
loop ranije.
•
Na kraju se proveravaju negativne kružne putanje, jer ako one postoje onda algoritam nije dobar.
dC ≤ dA + w |4 ≤
1 + 3 dA ≤ dB +
w|1 ≤ 6 - 5 dD ≤dB
+ w|6 ≤ 6 + 1 dD ≤
dC + w|6 ≤ 4 + 2
dA ≤ dS + w
|1 ≤ 0 + 4
dB ≤ dS + w |6 ≤ 0 + 6
**
JOŠ NEKE OSOBINE:
Radi sa grafovima koji imaju i negativne težine i otkriva postojanje negativnih ciklusa, radi u polinomskom
vremenu O(V*E)
Princip rada:
- stalno koriguje (relaksira) sve grane u grafu, odnosno testira da li može da poboljša najbolju putanju do
traženog čvora kroz iteracije u grafu
- za jednu interaciju algoritam treba da prođe kroz sve putanje koje su određene usmerenjima i težinama
grana i u iteracijama se teži poboljšanju trenutnih stanja čvorova
- iteracija ima onoliko koliko ima čvorova
- na kraju se proveravaju negativni ciklusi, jer ako one postoje onda algoritam nije dobar
Bellman-Ford(G, w, s)
Inicijalizacija-Izvora(G, s)
for i = 1 to |V|-1
for each (u,v) iz E
Relaksacija(u,v,w)
for each (u,v) iz E
if v.d > u.d + w(u,v)
return "postoji negativna kružna putanja"
36.
FLOYD-WARSHALL ALGORITAM
Pronalazi najkraći put između svih čvorova u grafu‚
Vreme računanja je (-)(n^3)
Koristi matricu susedstva (do sada se koristila lista susedstva)
Koristi dinamičko programiranje i iterativno popravlja rastojanje između svaka dva čvora dok procena nije
optimalna
Posmatra se međučvor u putanji i putanja se deli na dva dela - od polaznog čvora do međučvora i od međučvora
do krajnjeg
Ako je novi čvor k van podskupa koji čine trenutnu putanju, onda se putanja deli na dva dela
Na osnovu ovoga se formira rekurzivno računanje rastojanja sa međučvorovima u kom se bira minimalna težina
putanje
Formira se matrica rastojanja
Algoritam detektuje negativne cikluse tako što se na dijagonali nađe negativna vrednost
Mogu se rekonstruisati najkraće putanje na osnocu matrice prethodnika
DP kod tipova problema gde naivna detljna pretraga dovodi do EXP spoženosti imaju P složenost (gruba sila se ubrzava
preko pamćenja međurešenja - memoizacija)
Osnovna primena je u optimizacionim problemima (gde se vrši izbor između više mogućnosti)
Do rešenja se dolazi traženjem optimalnih rešenja za jednostavnije potprobleme (potproblemi se preklapaju)
Način pamćenja manjih rešenja zavisi od pristupa (od dole ka gore, od gore ka dole)
Rekurzija se upotrebljava u definisanju veza potproblema koji podseća na "podeli i osvoji", ali on radi sa disjunktnim
skupovima dok kod DP imamo preklapanja potproblema
Osnovna ideja DP:
- definiši potprobleme
- pokaži kako se rešenja datog problema može konstruisati polazeći od rešenih potproblema (upotrebiti rekurziju)
- prepoznaj i reši osnovne slučajeve
PSEUDOKOD:
1
n = W.kolona
2
D(0) = W
3
for k = 1 to n // određuje sve putanje od k čvorova
4
D(k) = new [dij (k)] // matrica n x n
5
for i = 1 to n // dve petlje uzimaju sva rastojanja
6
for j = 1 to n
7
dij (k) = min(dij (k-1), dik (k-1) + dkj (k-1))
8
return D(n)
Algoritam detektuje negativne cikluse tako što se na dijagonali 𝐷
𝑛 nađe negativna
vrednost, tj. 𝑑𝑖𝑖 < 0 za neko 𝑖 = 1,2, … 𝑛
• Dodatno, mogu se rekonstruisati najkraće putanje na osnovu matrice prethodnika
37.
MINIMALNO STABLO RAZAPINJANJA (PROBLEM, IDEJA, KRUSKAL ALG., PRIM ALG.)
Neusmeren težinski graf
Minimalno stablo razapinjanja je aciklični graf sačinjen od grana T koje povezuju sve čvorove V tako da je suma težina u T
minimalna
Ideja - postepena izgradnja stabla razapinjanja tj dodavanje po jedne grane u njega dok se ne povežu svi čvorovi; nezgodan
deo je izbor "sigurne grane" (ona ne može povezivati čvorove istog stabla A)
Kruskalov algoritam - na početku ima šumu stabala od po jednog čvora i kao sigurnu granu bira granu najmanje težine koja
povezuje dva stabla
Koristi operacije sa disjunktnim skupovima - formiranje, pretraga po skupovima, unija
Složenost zavisi od implementacije, može se postili složenost O(|E|*log2|V|)
Primov algoritam - izgrađuje jedno stablo tako što kao sigurnu granu bira najlakšu granu koja povezuje stablo sa čvorom koji
nije u stablu
Radi slično Dajkstra algoritmu
Složenost: sa min heap O(|E|*log2|V|), sa Fib. heap O(|E| + |V|log2|V|)
MSR-Generički(G,w)
A = (/)
while A!=stablo razapinjanja
Pronađi sigurnu granu(u,v)
A = A unija {(u,v)}
return A
MSR-Kruskal(G, w)
A = (/)
for reach v iz G.V
Napravi-Skup(v)
# svaki čvor postavi u zaseban skup
Sortiraj sve grane po težini (u rastućem redosledu)
for each (u,v) iz sort(G.E)
if Pronađi-Skup(u) != Pronađi-Skup(v) # sigurna grana ?
A = A unija {(u,v)}
Unija-Skupova(u,v)
return A
MSR-Prim(G, w, r)
for each u iz G.V
u.ključ = Inf
u.pred = Nil
r.ključ = 0
Q = G.V
while Q!=(/)
u = Izdvoj-Minimum(Q)
for each v iz G.susedi(u)
if v iz Q & w(u,v) < k.ključ
v.pred = u
v.ključ = w(u,v)
# r je polazni čvor
# po ključu
38.
DINAMIČKO PROGRAMIRANJE: PRIMER SEČENJA CEVI
Algoritmi koji se zasnivaju na dinamičkom programiranju obično se implementiraju koristeći tabele ili matrice u kojima se pamte
rešenja podproblema. Na početku, ove tabele su inicijalizovane odgovarajućim vrednostima. Zatim se rešenja podproblema
izračunavaju iterativno ili rekurzivno, a rezultati se upisuju u tabele. Kada se rešenje glavnog problema izračuna, može se dobiti
iz tabele.
Dinamičko programiranje se često primenjuje na problemima optimizacije, kao što su problem najduže zajedničke podsekvence,
problem putovanja trgovca ili problem ranca. Takođe se koristi u raznim oblastima računarstva i matematike, kao što su algoritmi
za grafove, bioinformatika, veštačka inteligencija itd.
Firma se bavi prodajom parčadi cevi sa utvrđenim cenovnikom, parčadi cevi se prave sečenejm dugačke cevi (dužine n),
kako iseći tu cev da bi se postigla najveća zarada?
Cev i mesta gde se može seći: ako se svaka pozicija sečenja predstavi jednim bitom (1-seci, 0-nemoj), onda je rešenje reč od
n bita -> broj mogućih rešenja je 2^n-1 (eksponencijalna složenost)
Sečenje će napraviti dve kraće cevi; kada se sečenje desi na izabranoj poziciji onda se optimalno rešenje problema svodi na
rešavanje dva manja problema što je isti polazni problem ali je dužina drugačija
Ovo se može pojednostaviti ako razmišljamo da mesto reza treba usaglasiti sa tabelom cenovnika tako da se rezanje može
pojaviti samo na zadatim rastojanjima
Sada izračunamo zarade ta razne dužine cevi (0, 1, 2...)
Rešenje od gore ka dole (memoizacija) - složenost (-)(n^2)
Rešenje od dole ka gore - složenost (-)(n^2)
Sečenje-cevi-gd(c, n)
new z[0..n] je niz ili rečnik
for i = 0 to n
z[i] = -Inf
return Sečenje-cevi-memo(c, n, z)
Sečenje-cevi-memo(C, n, z)
if z[n] >= 0
return z[n]
if n == 0
q=0
else q = -Inf
for k = 1 to n
q = max(q, c + Sečenje-cevi-memo(c,n-k,z))
z[n] = q
return q
Sečenje-cevi-dg(C,n)
new z[0...n] je niz ili rečnik
z[0] = 0
for i = 1 to n
q = -Inf
for k = 1 to i
q = max(1, c[k] + z[i-k])
z[i] = q
return z[n]
39.
DINAMIČKO PROGRAMIRANJE: PRIMER PORAVNAVANJA TEKSTA
Problem tekst procesora, poput MS Word-a ili Open Office-a, dati niz treba poravnati u stupcu (sa obe strane)
Definiše se skor s(i,j) na svakom redu koga čine reči od i do j-1; podeliti tekst tako da se minimizuje ukupan skor po svim
redovima
{skor = Inf, kada tekst ne staje u red / (širina stupca - ukupna širina slova)^3}
Počeci redova: 0 -> p[0] -> p[p[0]] -> p[p[p[0]]]...
(p - parent pointers)
DODATAK:
Definisanje podproblema: Prvi korak je identifikacija podproblema za rešavanje problema poravnanja teksta. U ovom slučaju,
podproblemi mogu se odnositi na poravnanje delova teksta različitih dužina.
Rekurentna relacija: Sledeći korak je definisanje rekurentne relacije koja opisuje vezu između trenutnog podproblema i
manjih podproblema koji su već rešeni. U slučaju poravnanja teksta, može se koristiti relacija koja uzima u obzir podudaranje
karaktera između dva teksta i dodaje ili oduzima odgovarajući skor.
Struktura podataka: Važno je odabrati odgovarajuću strukturu podataka za čuvanje rezultata podproblema. U slučaju
poravnanja teksta, može se koristiti matrica ili tabela u kojoj će se čuvati skorovi za sve moguće kombinacije delova teksta.
Popunjavanje matrice: Nakon definisanja rekurentne relacije i strukture podataka, matrica se iterativno popunjava redom.
Svaki element matrice se izračunava na osnovu već izračunatih podataka i prethodnih elemenata matrice.
Traženje optimalnog poravnanja: Nakon popunjavanja matrice, možemo odrediti optimalno poravnanje teksta na osnovu
skorova koji se nalaze u poslednjem elementu matrice. Ovo se može postići praćenjem puta od poslednjeg elementa unazad
do prvog, uzimajući u obzir pravila poravnanja.
Vremenska i prostorna složenost: Važno je razmotriti vremensku i prostornu složenost algoritma zasnovanog na dinamičkom
programiranju. U slučaju poravnanja teksta, vremenska složenost zavisi od broja elemenata matrice, dok prostorna složenost
zavisi od dimenzija matrice.
40.
DINAMIČKO PROGRAMIRANJE: PRIMER ZAGRADA
Treba odrediti optimalno izračunavanje asocijativnih izraza upotrebom zagrada
Npr. množenje matrica A0A1A2...An-1 -> izraz B(m x r)*C(r x n) ima m*r*n množenja
Gde ubaciti zagrade?
Posmatramo poslednje množenje (Ai...An), i jedno množenje pre njega (Ai...Aj)(Aj+1...An) - potproblem je optimalno
množenje (Ai...Aj) gde se posmatra deo originalnog problema kao substring
Redosled-dg(p)
n = p.length-1
m[1...n , 1...n], s [1...n-1, 2...n]
for i = 1 to n
m[i,i] = 0
for l = 2 to n # dužina lanca činioca
for i = 1 to n-l+1
j = i+l-1
m[i,j] = Inf
for k = i to j-1
q = m[i,k] + m[k+1,j] + p(i-1)p(k)p(j)
if q < m[i,j]
m[i,j] = q
s[i,j] = k
return m,s
Problem parenja zagrada se odnosi na proveru ispravnosti izraza koji sadrže različite vrste zagrada (npr. okrugle
zagrade (), uglaste zagrade [], vitičaste zagrade {}). Cilj je proveriti da li su sve zagrade pravilno uparene i balansirane,
odnosno da svaka otvorena zagrada ima odgovarajuću zatvorenu zagradu i da su pravilno uređene.
Jedan pristup rešavanju ovog problema je korišćenje dinamičkog programiranja i steka (eng. stack) za praćenje stanja
zagrada. Ideja je da prolazimo kroz izraz karakter po karakter i koristimo stek za pamćenje otvorenih zagrada. Kada
naiđemo na otvorenu zagradu, dodajemo je na vrh steka. Kada naiđemo na zatvorenu zagradu, proveravamo da li se
ona podudara sa vrhom steka. Ako se podudara, skidamo zagradu sa steka. U suprotnom, izraz nije ispravno paren i
balansiran.
41.
ALGORITAM ZA NALAŽENJE NAJDUŽE ZAJEDNIČKE PODSEKVENCE (DEFINICIJE SEKVENCE, STRINGA..., LCS ALG.)
String je niz(sekvenca) karaktera it datog skupa karaktera
Sekvenca je niz elemenata gde je bitan njihov redosled, isti element se može ponavljati
Podsekvenca je deo sekvence tako što se neki elementi sekvence mogu ukloniti
Podstring je deo stringa koji sadrži uzastopne karaktere
Svaki podstring je ujedno i podsekvenca (obrnuto ne važi)
~ Najduža zajednička podsekvenca (LCS algoritam)
Algoritam koristi dinamičko programiranje (ideja je da je podsekvenca podstringa ujedno i podsekvenca originalnog stringa)
Algoritam ima dve faze - izgrađuje pomoćnu tabelu dimenzije (n+1)(m+1) (n i m su dužine stringova) - složenost (-)(m*n)
Pomoću tabele se nalazi LCS - složenost O(n+m)
Ako je x(n) = y(m), onda je to rešenje, ako nije, onda se odbacuje ili x(n) ili y(m) (moraš probati obe opcije odbacivanja)
42.
ALGORITMI PODUDARNJA STRINGOVA (ALG.: NAIVNI, RABIN-KARP, KONAČNIM AUTOMATOM, KMP)
•
•
•
String je niz (sekvenca) karaktera – skup karaktera čine slova(velika i mala), cifre,
interpkcija, matematički i neki drugi simboli.
Niz (sequence) je lista elemenata gde u kojoj je bitan njihov redosled.
- Isti elemenat se može ponavljati u nizu.
- String se može posmatrati kao niz slova.
Podniz (subsequence) nekog niza je novi niz koji se dobija od početnog brisanjem nekih
elemenata niza, bez promene relativnog redosleda preostalih elemenata.
Primer 1:
{B, C, D, G} - je podniz
od niza {A, C, B, D, E, G,
C, E, D, B, G }
sa odgovaraju’im niyom indeksa {3, 7, 9, 11}
Primer 2:
{A, B, C, D, A, A, D, D, C, B, A, A} ima podnizove
{A, B, C, D, A, A, D, D, C, B, A, A},{A. A. A}, {A. B. C .D}, {A. C. A. D. B. A} itd., ali {B. B. B} i {A. B.
C. C. D} nisu podnizovi.
•
Podrstring (substring) je deo stringa koji sadrži uzastopne karaktere. Svaki string je ujedno i
podniz, ali obrnuto ne važi.
Primer: {ABCDAADDCBAA} ima podstringove
- A,BCDA, CBAA, ABCDAA, itd., ali
- AAA,ACADBA nisu podstringovi
ALGORITMI (primerima je prikazana primena na genetiku)
1. Najduži zajednički podniz (longest common subsequence LCS) za data dva stringa pronalazi
majduži subsequence koji se nalazi u oba stringa.
Primer:
- stringovi CATCGA i GTACC imaju dva LCS: CTCA i TCGA.
- Algoritam koristi dinamičko programiranje (ideja je da je subsequence podstringa
ujedno i subsequence originalnog stringa) - Algoritam ima dve faze:
• Izgrađuje pomoćnu tabelu dimenzije (n+1)(m+1) gde su n i m dužine datih
stringova – složenosti Θ(nm)
• Pomoću tabele nalazi LCS – složenosti O(n+m)
2. Transformacija jednog stringa u drugi - potrebno je
transformisati string X u string Z upotrebom
minimalnog broja operacija.
- X čine karakteri xi,i = 1,2,...n
- Z čine karakteri zj,j = 1,2,...m
Operacije:
- Copy – kopiranje karaktera : zj = xi, i = i + 1, j = j +
1
- Replace – zamena karaktera zj = xi = a, i++, j++
- Delete – brisanje karaktera i++ (preskoči
karakter u X - Insert – ubacivanje karaktera zj =
a, j++ (X se ne dira).
Primer: ATGATCGGCAT postaje CAATGTGAATC ...
Cena ove transformacije je 5ck + 5cz + cb + cu gde su ck cena kopiranja, cz cena zamene, cb
cena brisanja i cu cena ubacivanja. Problem je za date ck , cz, cb, cu naći najjeftiniju
transformaciju.
3. Podudaranje stringova (string matching) – pronalaženje (pattern –a) u datom tekstu.
• Imamo dva stringa: string teksta T(dužine n) i string paterna P (dužinem, m ≤ n), i
želimo da pronađemo sve pojave P u T.
Primer:
• tekst je GTAACAGTAAACG, a patern je AAC
•
•
Poređenje paterna sa podstringovima koji počinje na poziciji k (shift amount + 1) je
primitivan algoritam složenosti O((n-m)m)
Efikasniji algoritam koji koristi ideju konačnog automata (finite automation) i ima
složenost Θ(𝑛).
Treba pronaći tekst šabloma (pattern-a) u datom tekstu; imamo dva stringa - stringa teskta T dužine n i string
šablona P dužine m (m<=n), želimo da pronađemo sve pojave P u T
~Algoritam grube sile - vrši poređenje šablona sa podstringom koji počinje na poziciji k, slovo po slovo
Složenost (-)(m*n), "naivan" je jer ne koristi informacije iz prethodnih poređenja
~ Rabin-Karp - poredi heš vrednost šablona i heš vrednost podstringova (iz teksta) dužine šablona (koristi se
rolling heš)
Složenost O((n-m)m), poklapanje može biti "lažno"
~ Konačni automat - tokom poređenja sa šablonom prelazi iz stanja u stanje
Složenost O(n)
Konačni automat sadrži skup stanja, početno stanje, podskup različitih dozvoljenih stanja, konačan skup ulaznih
vrednosti (ulazni alfabet) i funkciju za opis prelaza
~ KMP - pogodan kada šablon ima podstringove koji se ponavljaju tako da tokom poređenja šablon "pomera" iza
podstringa koji se ponavlja
Složenost (-)(n)
Neslaganje karaktera šablona "preskače" ponovno poređenje početnih k karaktera šablona
Download