Konstrukcija i analiza algoritama odgovori na pitanja Anja Bukurov Nikola Ajzenhamer Vojislav Stanković 11. juni 2015. 1
Sadržaj 1 Pravila izvođenja, valjani dokazi, rezolucija. Pravila izvođenja sa kvantifikatorima. 4 2 Metodi dokazivanja teorema; teoreme sa kvantifikatorima primeri. 4 2.1 Metodi dokazivanja teorema................................... 4 2.2 Dokazivanje teorema sa kvantifikatorima............................ 5 3 Primeri dokaza matematičkom indukcijom; Ojlerova formula V + F = E + 2 6 3.1 Ojlerova formula: V + F = E + 2................................ 7 4 Nalaženje binarnih cifara celog broja, dokaz korektnosti. 8 5 Analiza algoritama, O notacija, vremenska i prostorna složenost 8 6 Asimptotsko ponašanje rešenja rekurentne relacije T (n) = at (n/b) + cn k. 9 7 Rešenje rekurentne relacije T (n) = 2 n n T (i) + n 1, n 2, i=1 T (1) = 0 (prosečna složenost algoritma kvik sort) 10 8 Pohlepni (greedy) algoritmi; primer: nalaženje Hofmanovog koda 12 9 Izračunavanje vrednosti polinoma 14 10 Nalaženje maksimalnog indukovanog podgrafa grafa sa stepenovima čvorova ne manjim od zadatog broja 14 11 Nalaženje maksimalnog podskupa S A datog skupa A na kome je zadata funkcija f : A A sa osobinom 1 1 15 12 Algoritam za nalaženje takvog i da su u kvadratnoj 0 1 matrici svi elementi i te vrste (sem i tog) 1, i svi elementi i te kolone (sem i tog) 0 16 13 Računanje svih faktora ravnoteže binarnog stabla 17 14 Nalaženje maksimalnog (uzastopnog) podniza datog niza realnih brojeva 18 15 Binarna pretraga, primeri primene; interpolaciona pretraga 18 15.1 Binarna pretraga, primeri primene............................... 18 15.2 Interpolaciona pretraga..................................... 21 16 Istovremeno nalaženje najmanjeg i najvećeg elementa u nizu 22 17 Nalaženje k-tog najmanjeg od n zadatih brojeva 22 18 Nalaženje dve najbliže tačke u datom skupu od n tačaka u ravni 23 19 Dinamičko programiranje, problem ranca. 26 20 Algoritam za nalaženje edit rastojanja dva niza i približno trazenje reči u tekstu. 27 21 KMP algoritam za nalaženje jednog stringa u drugom. 29 21.1 Izračunavanje pomoćnog niza za algoritam KMP....................... 31 22 Heš tablice. 31 23 Struktura podataka pogodna za problem nalaženja unije. 32 24 Predstavljanje grafova: matrica povezanosti, lista povezanosti. 34 25 Nalaženje Ojlerovog ciklusa u povezanom neusmerenom grafu. 35 2
26 Pretraga u dubinu neusmerenog grafa. 35 27 Pretraga grafa u širinu. 37 28 Topološko sortiranje acikličkog grafa 38 29 Nalaženje svih najkraćih puteva iz zadatog čvora grafa aciklički slučaj. 39 30 Nalaženje svih najkraćih puteva iz zadatog čvora grafa 41 31 Minimalno povezujuće stablo grafa. 43 32 Nalaženje svih najkraćih puteva u grafu. 44 33 Tranzitivno zatvorenje grafa. 45 34 Stepenovanje prirodnim brojem. 46 35 Euklidov algoritam 48 36 Vinogradov i Štrasenov algoritam za množenje matrica 49 37 Brza Fruijeova transformacija i množenje polinoma 50 37.1 Direktna Furijeova transformacija................................ 51 37.2 Inverzna Furijeova transformacija................................ 53 38 Algoritam za nalaženje trouglova u neusmerenom grafu, dobijen svodenjem na množenje matrica. 54 39 Redukcije polinomijalne vremenske složenosti, tranzitivnost. 55 40 Nedeterministički algoritmi, Kukova teorema. 55 40.1 Kukova teorema......................................... 56 41 Dokaz NP kompletnosti problema nalaženje pokrivača čvorova grafa. 56 42 Dokaz NP kompletnosti problema nalaženje dominirajućeg skupa grafa. 57 43 Dokaz NP kompletnosti problema 3 SAT. 58 44 Dokaz NP kompletnosti problema klika. 59 45 Dokaz NP-kompletnosti problema 3-obojivosti grafa 60 46 Mogući kompromisi prilikom rešavanja teških (NP kompletnih) problema; pretraga sa vraćanjem, 3 bojenje grafa. 61 47 Grananje sa odsecanjem, primena na bojenje grafa. 62 48 Približni algoritam za nalaženje pokrivača grana na osnovu maksimalnog uparivanja. 64 49 Približni algoritmi za rešavanje 1 D problema pakovanja. 64 50 Približni algoritmi za rešavanje Euklidskog problema trgovačkog putnika. 65 3
1 Pravila izvođenja, valjani dokazi, rezolucija. Pravila izvođenja sa kvantifikatorima. Pravila izvođenja predstavljaju osnovu ispravnog zaključivanja. Neka od pravila izvođenja su: Ime Pravilo Pravilo zadato tautologijom 1 Modus ponens p p = q (p (p = q)) = q q 2 Dodavanje p p q p = (p q) 3 Uprošćavanje p q p (p q) = p 4 Konjunkcija p q (p q) = (p q) p q 5 Modus tolens q p = q ( q (p = q)) = p p 6 Hipotetički silogizam p = q q = r ((p = q) (q = r)) = (p = r) p = r 7 Disjunktivni silogizam p q p ((p q) p) = q q 8 Rezolucija p q p r q r ((p q) ( p r)) = (q r) Pravila izvodenja sa kvantifikatorima: Ime 1 Univerzalna specijalizacija 2 Univerzalna generalizacija 3 Egzistencijalna specijalizacija 4 Egzistencijalna generalizacija Pravilo xp (x) P (c) P (c) xp (x) xp (x) P (c) P (c) xp (x) 2 Metodi dokazivanja teorema; teoreme sa kvantifikatorima primeri. 2.1 Metodi dokazivanja teorema Dokazi se odnose na teoreme oblika p = q. Direktni dokaz (najjednostavnije) Kreće se od pretpostavke da je p tačno i pokazuje se da je i q tačno. Primer:,,Ako je n neparan, onda je i n 2 neparan broj. Dokaz: Pošto je n neparan, može se zapisati u obliku n = 2 k + 1. Onda je n 2 = (2 k + 1) 2 = 4 k 2 + 4 k + 1 = 2 (2 k 2 + 2 k) + 1, i to je takode neparan broj. 4
Indirektni dokaz Umesto implikacije p = q dokazujemo njenu kontrapoziciju, odnosno q = p. Primer:,,Ako je 3 n + 2 neparan, ona je i n neparan broj. Dokaz: Pretpostavimo suprotno, n je paran broj i možemo ga zapisati u obliku n = 2 k. Onda je 3 n + 2 = 3 (2 k) + 2 = 2 (3dotk + 1). To je paran broj, što znači da je q = p tačno, pa je tačno i p = q. Prazan dokaz Ako je p netačno, implikacija p = q će uvek biti tačna. Primer: P (n):,,ako je n > 1, onda n 2 > n. Dokazati P (0). Trivijalan dokaz Ako je q tačno, implikacija p = q će uvek biti tačna. Primer: P (n):,,ako je a, b N, a b, onda a n b n. Dokazati P (0). Dokaz izvodenjem kontradikcije Tvrdenje p dokazujemo tako što pretpostavimo suprotno, tj. da je tačno p i iz toga izvedemo kontradikciju. Primer:,, 2 je iracionalan broj. Dokaz: Pretpostavimo suprotno, 2 je racionalan broj. To znači da se može napisati kao skraćen (nesvodljiv) razlomak. a 2 = b / b b 2 = a/ 2 2 b 2 = a 2 = a 2 je paran broj, pa je i a paran i možemo ga zapisati u obliku a = 2 k! 2 b 2 = (2 k) 2 2 b 2 = 4 k 2 / : 2 b 2 = 2 k 2 = b 2 je paran broj, pa je i b paran broj. Ako su i a i b parni brojevi znači da razlomak a nije skraćen. Dakle, pretpostavka je pogrešna! b Dokaz razmatranjem slučajeva Tvrdenje oblika (p 1... p n ) = q dokazujemo tako što pokazujemo da vazi: p 1 = q... p n = q. Primer:,,Dokazati da važi nejednakost trougla: x + y x + y. Dokaz: 1. x 0 y 0: x + y = x + y, x + y = x + y 2. x < 0 y < 0: x + y = (x + y), x + y = x y = (x + y) 3. x 0 y < 0: x + y = x y (a) x < y : x + y = (x + y) = x y x y x 0 (b) x > y : x + y = x + y = x + y x y y 0 4. x < 0 y 0: x + y = x + y (a) x < y : x + y = x + y = x + y x + y x 0 (b) x > y : x + y = (x + y) = x y x + y y 0 Dokaz ekvivalentnosti Tvrdenje oblika p q dokazujemo tako što dokazujemo p = q i q = p. Primer:,,Sledeća tri tvrđenja su ekvivalentna: P 1 :,,n je paran. P 2 :,,n 1 je neparan. P 3 :,,n 2 je paran. 2.2 Dokazivanje teorema sa kvantifikatorima Prva tri dokaza odnose se na teoreme sa kvatifikatorom, a četvrta na teoreme sa kvantifikatorom. Konstruktivni dokaz Treba pronaći neko a, tako da je P (a) tačno. Primer:,,Dokazati da postoji n N koji se može napisati na 2 načina kao zbir 2 kuba. Dokaz: 1729 = 10 3 + 9 3 = 12 3 + 1 3 5
Nekonstruktivni dokaz Treba pokazati da postoji a, tako da je P (a) tačno, ali se a ne pronađe konkretno. Primer:,,Dokazati da postoje x, y I takvi da je x y racionalan broj. Dokaz: Neka je x = 2, y = 2, i a = x y = 2 2. Ako je a racionalan, onda je to kraj dokaza. Ako je a iracionalan, onda uzmemo da je x = 2, 2 a y = 2. ( 2 ) 2 2 Onda je a = = ( 2) 2 2 = ( 2) 2 = 2 Q. U oba slučaja dobijamo da je a racionalan broj, ali ne znamo koji od ta dva slučaja imamo, nismo konkretno odredili i zato je to nekonstruktivan dokaz. Dokaz jedinstvenosti xp (x) y((y x) = P (x)). Primer:,,Svaki celi broj ima jedinstveni aditivni inverz. Dokaz: x ima inverz x i x. Onda važi: x + x = 0 i x + x = 0 x = x + 0 = x + (x + x ) = (x + x) + x = 0 + x = x Kontraprimeri Dovoljno je pronaći jedno a takvo da P (a) bude netačno. Primer:,,Svaki prirodan broj je zbir 3 kvadrata. Dokaz: 7 = x 2 + y 2 + z 2, x y z. Najveći vrednost koju mogu da uzmu ovi brojevi je 2, jer je 3 2 = 9. Moramo imati bar jednu 2, jer 1 2 + 1 2 + 1 2 = 3. Ne možemo imati dve 2, jer je 1 + 2 2 + 2 2 = 9 > 7. Preostaje nam da napravimo kombinaciju od dve 1 i jedne 2, a to je 1 2 + 1 2 + 2 3 = 6. 3 Primeri dokaza matematičkom indukcijom; Ojlerova formula V + F = E + 2 Primer: Formirajmo trougao Slika 1: Trougao neparnih brojeva. Koliki je zbir brojeva u i-tom redu? U 1. redu je 1, u 2. redu je 8, u 3. redu je 27, u 4.redu je 64... Pretpostavimo da je zbir elemenata u i-tom redu, S i jednak: S i = i 3 Slika 2: Slikoviti prikaz ideje rešenja. S i+1 = S i + i 2i + a i+1 (i + 1) 3 = i 3 + 2i 2 + a i+1 6
Ostaje da se dokaže da je odnosno a i+1 = i 3 + 3i 2 + 3i + 1 i 3 2i 2 = i 2 + 3i + 1 = (i + 1) 2 + (i + 1) 1 a i = i 2 + i 1 Dokaz (indukcijom po i) Baza Indukcije: i = 1; a i = 1 1 2 + 1 1 = 1 I.H. : Pretpostavimo da je tačno a i = i 2 + i 1 I.H. I.K. : Iz konstrukcije se vidi a i = 2(i + 1) + a i = 2i + 2 + i 2 + i 1 = i 2 + 3i + 1 = (i + 2) 2 + (i + 1) 1 Primer: Dokazati da je 1 2 + 1 2 2 + + 1 2 n < 1 Dokaz (indukcijom po n) 1 Baza Indukcije: n = 1 2 < 1 I.H. : važi za n I.K. : 1 2 + 1 2 2 + + 1 2 n + 1 2 n+1 = 1 2 + 1 2 (1 2 + 1 2 2 + + 1 2 n ) I.H. < 1 2 + 1 2 1 = 1 3.1 Ojlerova formula: V + F = E + 2 Povezana planarna mapa V -broj čvorova E -broj grana F -broj oblasti (računa se i spoljašnja/beskonačna oblast) Dokaz (indukcijom po F) B.I. : F = 1 - beskonačna oblast V = E + 1 Poddokaz: (indukcijom po V) B.I. : V = 1 E = 0 1 = 0 + 1 I.H. : Pretpostavimo da je tačno za V = n I.K. : Dokazati da je tačno za V = n + 1 U stablu sa n + 1 čvrova mora da postoji bar jedan viseći čvor. Za to stablo važi: V = n + 1 E Nakon skidanja jednog visećeg čvora i grane, dobijamo stablo sa V = V 1, E = E 1 To stablo zadovoljava V = E + 1 po induktivnoj hipotezi. Zamenom dobijamo: V = E + 1 V 1 = E 1 + 1 V = E + 1 I.H. : Za povezanu planarnu mapu, ako je F = m onda je V + F = E + 2 I.K. : Posmatramo povezanu planarnu mapu sa F = m + 1 oblašću, V čvorova i E grana. Uklanjanjem grane koja je susedna sa beskonačnom oblasti dobijamo mapu sa brojem oblasti F = F 1; takode, važi V = V, E = E 1 i za nju važi induktivna hipoteza V + F = E + 2 V + F 1 = E 1 + 2 V + F = E + 2 7
4 Nalaženje binarnih cifara celog broja, dokaz korektnosti. Algoritam koji predstavlja binarnu reprezentaciju broja n Binarne cifre broja n Begin t = n k = 0 while (t>0) do k = k+1 b[k] = t mod 2 t = t/2 end Invarijanta petlje: t 2 k + b[1] + b[2] 2 + + b[k] 2 k 1 = n Dokaz korektnosti: (indukcijom po n) B.I. : k = 0 n+ ništa = n I.H. : t 2 k + b[1] + b[2] 2 + + b[k] 2 k 1 = n I.K. : U narednom prolasku kroz petlju k = k+1 t = t/2 b[k+1] = t mod 2 Zbir je sada Pri izlazu iz petlje, za t = 0, dobija se b[1] + b[2] 2 + + b[l] 2 l = n Dobija se ispravan izlaz. (t/2) 2 k+1 + b[1] + b[2] 2 + + b[k] 2 k 1 + (tmod2) 2 k = 2 k (2(t2) + tmod2) + b[1] + b[2] 2 + + b[k] 2 k 1 = t 2 k + b[1] + b[2] 2 + + b[k] 2 k 1 = n 5 Analiza algoritama, O notacija, vremenska i prostorna složenost Cilj analize algoritama je da proceni brzinu izvršavanja algoritma bez obzira na to koji računar ga koristi. Ideja je da se proceni brzina rada bez realizacije. Tačno ponašanje algoritma je nemoguće predvideti sem u najjednostavnijim slučajevima. Analiza algoritma mora biti približna. Ona omogućava poređenje algoritama koji rešavaju isti problem. Zanemaruju se konstantni faktori zato što se i izvršavanja na različitim računarima razlikuju za konstantu. Najinteresantnija je asimptotska analiza algoritama, odnosno kada veličina ulaza teži jako velikim vrednostima. Obično se veličina ulaza opisuje kao memorijski prostor koji je neophodan za korišćenje algoritma. Najčešće se koristi analiza najgoreg slučaja. Trajanje algoritma predstavlja funkciju u zavisnosti od ulazne veličine. Analiza asimptotskog ponašanja složenosti algoritma, i to u najgorem slučaju među ulazima određene veličine to je dakle aproksimacija vremena rada određenog algoritma na određenom ulazu, koja ipak najčešće dobro karakteriše osobine algoritma. Definicija 1: Neka su f i g pozitivne funkcije od argumenta n iz skupa N prirodnih brojeva. Kaže se da je g(n) = O(f(n)) ako postoje pozitivne konstante c i N, takve da za svako n > N važi g(n) cf(n). Oznaka O(f(n)) se ustvari odnosi na klasu funkcija, a jednakost g(n) = O(f(n)) je uobičajena oznaka za inkluziju g(n) O(f(n)). Jasno je da je funkcija f samo neka vrsta gornje granice za funkciju g. Na primer, pored jednakosti 5n 2 + 15 = O(n 2 ) (jer je 5n 2 + 15 6n 2 za n 4) važi i jednakost 8
5n 2 + 15 = O(n 3 ) (jer je 5n 2 + 15 n 3 za n 6). Ova notacija omogućuje ignorisanje multiplikativnih i aditivnih konstanti: umesto O(5n + 4) može se pisati O(n). Slično, u izrazu O(log n) osnova logaritma nije bitna, jer se logaritmi za različite osnove razlikuju za multiplikativnu konstantu: log a n = log a (b log b n ) = log b n log a b. Specijalno, O(1) je oznaka za klasu ograničenih funkcija. Lako se pokazuje da se O-izrazi mogu sabirati i množiti: O(f(n)) + O(g(n)) = O(f(n) + g(n)), O(f(n))O(g(n)) = O(f(n)g(n)). Drugi problem u vezi sa složenošću algoritma je pitanje donje granice za potreban broj računskih operacija. Dok se gornja granica odnosi na konkretan algoritam, donja granica složenosti odnosi se na proizvoljan algoritam iz neke određene klase. Zbog toga ocena donje granice zahteva posebne postupke analize. Definicija 2: Za funkciju g(n) kaže se da je asimptotska donja granica funkcije T (n) i piše se T (n) = Ω(g(n)), ako postoje pozitivni c i N, takvi da za svako n > N važi T (n) > cg(n). Tako je na primer n 2 = Ω(n 2 100), i n = Ω(n 0,9 ). Vidi se da simbol Ω odgovara relaciji. Definicija 3: Ako za dve funkcije f(n) i g(n) istovremeno važi i f(n) = O(g(n)) i f(n) = Ω(g(n)), onda one imaju iste asimptotske brzine rasta, što se označava sa f(n) = Θ(g(n)). Tako je na primer 5n log 2 n 10 = Θ(n log n), pri čemu je u poslednjem izrazu osnova logaritma nebitna. Definicija 4: f(n) Činjenica da je lim = 0 označava se sa f(n) = o(g(n)). n g(n) Ocena (vremenske) složenosti algoritma sastoji se u brojanju računskih koraka koje treba izvršiti. Međutim, termin računski korak može da podrazumeva različite operacije, na primer sabiranje i množenje, čije izvršavanje traje različito vreme. Zato se obično u okviru algoritma izdvaja neki osnovni korak, onaj koji se najčešće ponavlja. Tako, ako se radi o sortiranju, osnovni korak je upoređivanje. Ako je broj upoređivanja O(f(n)), a broj ostalih operacija je proporcionalan broju upoređivanja, onda je O(f(n)) granica vremenske složenosti algoritma. Pod prostornom složenošću algoritma podrazumeva se veličina memorije potrebne za izvršavanje algoritma, pri čemu se prostor za smeštanje ulaznih podataka najčešće ne računa. Kao i kod vremenske složenosti, i za prostornu složenost se najčešće traži njeno asimptotsko ponašanje u najgorem slučaju, za velike veličine problema. Prostorna složenost O(n) znači da je za izvršavanje algoritma potrebna memorija proporcionalna onoj za smeštanje ulaznih podataka. Ako je pak prostorna složenost algoritma O(1), onda to znači da je potreban memorijski prostor za njegovo izvršavanje ograničen konstantom, bez obzira na veličinu ulaza. 6 Asimptotsko ponašanje rešenja rekurentne relacije T (n) = at (n/b) + cn k. Pretpostavimo da nam je cilj analiza algoritma A, pri čemu broj operacija T (n) pri primeni algoritma A na ulaz veličine n (vremenska složenost) zadovoljava diferencnu jednačinu tipa ( n ) T (n) = at + cn k (1) b pri čemu je a, b, c, k 0, b 0, i zadata je vrednost T (1). Ovakva jednačina dobija se za algoritam kod koga se obrada ulaza veličine n svodi na obradu a ulaza veličine n/b, posle čega je potrebno izvršiti još cn k koraka da bi se od parcijalnih rešenja konstruisalo rešenje kompletnog ulaza veličine n. Jasno je zašto se za ovakve algoritme kaže da su tipa zavadi pa vladaj, (divide-and-conquer), kako se još zovu algoritmi zasnovani na dekompoziciji. Obično je u ovakvim diferencnim jednačinama b prirodan broj. 9
Asimptotsko ponašanje niza T (n), rešenja diferencne jednačine (7) dato je jed- Master teorema: nakošću O(n log b a ) za a > b k T (n) = O(n k log n) za a = b k (2) O(n k ) za a < b k : Dokaz teoreme biće sproveden samo za podniz n = b m, gde je m celi nenegativni broj. Pomnoživši obe strane jednakosti (7) sa a m /c, dobijamo diferencnu jednačinu tipa (5) t m = t m 1 + q m, t 0 = 1 c T (1), gde su uvedene oznake t m = 1 c a m T (b m ) i q = b k /a. Njeno rešenje je: Za q 1 je jednakostima m i=1 t m = t 0 + m i=1 q i = (1 q m+1 )/(1 q) 1, pa se asimptotsko ponašanje niza t m opisuje sledećim O(m) za q = 1 t m = O(1) za 0 < q < 1 O(q m ) za q > 1 (3) Pošto je T (b m ) = ca m t m, n = b m, odnosno m = log b n, redom se za 0 < q < 1 (b k < a), q = 1 (b k = a, odnosno log b a = k) i q > 1 (b k > a) dobija O(a m ) = O(b m log b a ) = O(n log b a ) za a > b k T (n) = O(ma m ) = O(log b n n log b a ) = O(n k log n) za a = b k (4) O((aq) m ) = O(b mk ) = O(n k ) za a < b k čime je tvrđenje teoreme dokazano. 7 Rešenje rekurentne relacije T (n) = 2 n n T (i) + n 1, n 2, T (1) = 0 (prosečna složenost algoritma kvik sort) Diferencna jednačina najopštijeg oblika F n = f(f n 1, F n 2,..., F 1, n) zove se potpuna rekurzija ili diferencna jednačina sa potpunom istorijom. Razmotriémo jedan primer ovakvih diferencnih jednačina. Diferencna jednačina i=1 T (n) = n 1 + 2 n 1 T (i), n 2, T (1) = 0 (5) n i=1 važna je, jer se do nje dolazi pri analizi prosečne složenosti sortiranja razdvajanjem, algoritma za uređivanje zadatog skupa brojeva po veličini (sortiranje, videti u knjizi pod 5.3.4). Ideja o,,eliminaciji istorije može se i ovde primeniti zbog toga je zgodno prepisati zadatu jednačinu tako da se u njoj uz sumu n 1 T (i) ne pojavljuje promenljivi činilac n: i=1 n 1 nt (n) = n(n 1) + 2 T (i). Zatim ovu jednakost treba oduzeti od one koja se od nje dobija zamenom n sa n + 1: (n + 1)T (n + 1) nt (n) = (n + 1)n + 2 n i=1 10 i=1 n 1 T (i) n(n 1) 2 T (i) = 2n + 2T (n), i=1
odnosno T (n + 1) = 2n n + 1 + n + 2 n + 1 T (n), n 2 Ovim je prvi cilj postignut: dobijena diferencna jednačina povezuje samo dva uzastopna člana niza. Rešavanje ove diferencne jednačine može se svesti na poznat problem rešavanja F (n + 1) F (n) = f(n) deljenjem sa n + 2 i smenom t n = T (n)/(n + 1): odnosno T (n + 1) n + 2 T (n) n + 1 = 2n (n + 1)(n + 2), t n+1 t(n) = 2n (n + 1)(n + 2). Zamenom n sa i i sumiranjem po i u granicama od 1 do n dobija se (t 1 = 0) t n+1 t n = n i=1 2i (i + 1)(i + 2). (6) Da bi se izračunala suma sa desne strane ove jednakosti, može se njen opšti član razložiti na parcijalne razlomke 2i (i + 1)(i + 2) = A i + 1 + B i + 2, gde se nepoznati koeficijenti A i B dobijaju tako što se u identitetu 2i = A(i + 2) + B(i + 1) stavi najpre i = 1 (dobija se A = 2), a onda i = 2 (odakle je B = 4). Sada je tražena suma jednaka n n = 2 i=1 = 2 i=3 i=1 1 n i + 1 + 4 i=1 n+1 1 i + 2 = 2 i=2 n+2 1 i + 4 i=3 1 i = 1 i 2 1 2 + 4 4 = 2H(n + 1) 4 + n + 2 n + 2, gde je sa H(n) = n i=1 ( ) 1 1 i = ln n + γ + O, (7) n označena parcijalna suma harmonijskog reda; γ 0, 577 je Ojlerova konstanta. Zamenom vrednosti sume u (6) dobija se rešenje diferencne jednačine (5) ( T (n + 1) = 2H(n + 1) 4 + 4 ) (n + 2) = 2(n + 1)H(n + 1) 4(n + 1), n + 2 odnosno T (n) = 2nH(n) 4n = 2n ln n + (2γ 4)n + O(1) = O(n log n). (8) U toku izvođenja korišćen je poznati asimptotski razvoj (7). Često je korisno znati i asimptotski razvoj za n!, Stirlingovu formulu n! = 2 ( n ) ( ( )) n 1 2πn 1 + O, e n odnosno log(n!) = O(n log n). (9) 11
8 Pohlepni (greedy) algoritmi; primer: nalaženje Hofmanovog koda Zadat je tekst sa n različitih znakova, tako da su učestanosti znakova zadate nizom F = f 1, f 2,..., f n. Odrediti prefiksni kod E koji minimizira broj bita L(E, F ) upotrebljenih za kodiranje. Slika 3: Predstavljanje prefiksnog koda stablom. Za prefiksni kod koji minimizira vrednost L(E, F ) kaže se da je optimalni kod; on očigledno zavisi od niza učestanosti znakova F. Cilj je za dati niz F odrediti optimalni prefiksni kod (bilo koji; u opštem slučaju postoji više različitih optimalnih kodova). Razmotrimo zbog toga malo detaljnije osobine optimalnih kodova: 1. Ako je f 1 > f 2, onda je l 1 l 2 (jer bi u protivnom, za l 1 > l 2 važilo da je (f 1 f 2 )(l 1 l 2 ) > 0, odnosno f 1 l 1 + f 2 l 2 > f 1 l 2 + f 2 l 1 što znači da bi broj bitova za prva dva slova bio veći od broja bitova ako zamenimo kodove, što je suprotno pretpostavci da se radi o optimalnom kodu) 2. U kodnom stablu, svaki unutrašnji čvor mora da ima oba sina, u protivnom bi se kod mogao pojednostaviti skraćivanjem kodnih reči u listovima podstabla ispod čvora sa samo jednim sinom (pogledati sliku 4) 3. Postoji optimalni kod u kojem su dva najređa slova u poslednjem nivou i sinovi istog oca (pogledati sliku 5) Slika 4: Kodno stablo u kome neki čvor ima samo jednog sina što nije kodno stablo optimalnog koda. 12
Slika 5: Transformacija kodnog stabla, posle koje dva znaka sa najmanjim frekvencijama f i i f j postaju sinovi istog oca. Realizacija. Operacije koje se izvršavaju prilikom formiranja Hofmanovog koda su umetanje u strukturu podataka, brisanje dva znaka sa najmanjim frekvencijama iz strukture, i konstrukcija kodnog stabla. Hip je pogodna struktura podataka za prve dve operacije, jer se tada te operacije u najgorem slučaju izvršavaju za O(log n) koraka. Algoritam za formiranje Hofmanovog koda glasi: Algoritam Hofman(S, F); Ulaz: S (string znakova koji se pojavljuju u tekstu) i F (frekvencije). Izlaz: T (kodno stablo Hofmanovog koda za S). ubaciti sve znake u hip H prema njihovim frekvencijama; while H neprazan do if H sadrži samo jedan znak X then formiraj stablo T koje ima samo koren, čvor X else skini sa hipa H znakove X, Y sa najmanjim frekvencijama fx, fy; zameni X i Y novim znakom Z sa frekvencijom fz = fx + fy; ubaci Z u hip H; poveži X i Y tako da budu sinovi Z u T; {Z još nema oca} end Primer: Neka je dat fajl u kome se pojavljuju znaci A, B, C, D, E i F sa frekvencijama redom 5, 2, 3, 4, 10 i 1. Dva znaka sa najmanjim frekvencijama su F i B; oni se zamenjuju novim znakom BF sa frekvencijom 1 + 2 = 3. Dalja zamenjivanja prikazana su u sledećoj tabeli. Slika 6: Dobijeno kodno stablo. 13
Slika 7: Stablo Hofmanovog koda iz primera. Složenost. Složenost dodavanja novog čvora stablu ograničena je konstantom. Umetanja i brisanja iz hipa izvršavaju se u O(log n) koraka. Složenost algoritma je dakle O(n log n). 9 Izračunavanje vrednosti polinoma Napomena: U nastavku će biti prikazan najoptimalniji algoritam za izračunavanje vrednosti polinoma. Konsultovati se sa profesorovom knjigom za ostale (manje efikasne) algoritme. Problem. Dati su realni brojevi a n, a n 1,..., a 1, a 0 i realni broj x. Izračunati vrednost polinoma P n (x) = n a i x i. i=0 Induktivna hipoteza. Umemo da izračunamo vrednost polinoma P n 1(x) sa koeficijentima a n, a n 1,..., a 1 u tački x. Ovakva induktivna hipoteza je pogodna jer se lako proširuje. Pošto je P n (x) = x P n 1(x) + a 0, za izračunavanje P n (x) polazeći od P n 1(x) dovoljno je jedno množenje i jedno sabiranje. Izračunavanje se može opisati sledećim izrazom: a n x n + a n 1 x n 1 +... + a 1 x + a 0 = ((...((a n x + a n 1 )x + a n 2 )...)x + a 1 )x + a 0, poznatim kao Hornerova šema. Algoritam Vrednost_polinoma(a, x); Ulaz: a (niz koeficijenata polinoma) i x (realni broj); Izlaz: P (vrednost polinoma u tački x); P = a[n]; for i = 1 to n do P = x * P + a[n-i]; end Složenost. Telo for petlje izvršava se n puta za vreme O(1), pa je stoga složenost O(n). 10 Nalaženje maksimalnog indukovanog podgrafa grafa sa stepenovima čvorova ne manjim od zadatog broja Neka je G = (V, E) neusmereni graf. Graf H = (U, F ) je indukovani podgraf grafa G ako U V i F sadrži sve grane iz E kojima su oba kraja u U, videti primer na slici 8. Stepen čvora je broj njemu susednih čvorova. 14
Slika 8: Primer indukovanog podgrafa. Grane su neuređeni parovi čvorova. Problem. Za zadati neusmereni graf G = (V, E) i zadati prirodni broj k pronaći maksimalni indukovani podgraf H = (U, F ) grafa G (tj. indukovani podgraf sa maksimalnim brojem čvorova) uz uslov da svi čvorovi podgrafa H imaju stepen bar k, ili ustanoviti da takav indukovani podgraf ne postoji. Umesto da algoritam posmatramo kao niz koraka koje treba izvršiti da bi se došlo do rezultata, možemo da sebi postavimo za cilj dokazivanje teoreme da algoritam postoji. Potrebno je pronaći maksimalni indukovani podgraf koji zadovoljava zadate uslove. : (indukcijom po broju čvorova n) (B.I.) Prvi netrivijalni slučaj pojavljuje se za n = k + 1, jer ako je n k, onda su stepeni svih čvorova manji od k. Ako je n = k + 1, onda samo u jednom slučaju postoji indukovani podgraf sa stepenima čvorova k: to je slučaj potpunog grafa (grafa sa svim mogućim granama). (I.H.) Pretpostavimo da umemo da rešimo problem sa v = n čvorova. (I.K.) Posmatramo graf G = (V, E), gde je sada V = n + 1. Ako su stepeni svih čvorova u G veći ili jednaki od k, onda graf H = G zadovoljava uslove i dokaz je završen. U protivnom, postoji čvor v stepena < k. Čvor v se može ukloniti iz G zajedno sa svim njemu susednim granama, ne menjajući uslove teoreme. Posle uklanjanja v, graf ima n čvorova, pa prema induktivnoj hipotezi mi umemo da rešimo problem do kraja. 11 Nalaženje maksimalnog podskupa S A datog skupa A na kome je zadata funkcija f : A A sa osobinom 1 1 Problem. Neka je zadat konačan skup A i preslikavanje f : A A. Odrediti podskup S A sa najvećim mogućim brojem elemenata tako da bude f(s) S i da restrikcija f na S bude bijekcija. Ako je f bijekcija, onda kompletan skup A zadovoljava uslove problema, pa je maksimalni podskup S = A. Ako je pak f(a) = f(b) za neke a b, onda S ne može da sadrži i a i b. Na primer, skup S u problemu sa slike 9 ne može da sadrži oba elementa 2 i 3, jer je f(2) = f(3) = 1. Slika 9: Primer preslikavanja skupa u samog sebe. 15
Međutim, nije svejedno koji će elemenat od ova dva biti eliminisan. Ako na primer eliminišemo 3, onda se zbog f(1) = 3 mora eliminisati i 1. Zatim se na isti način zbog f(2) = 1 mora eliminisati i 2. Dobijeni podskup sigurno nije maksimalan, jer je moguće eliminisati samo elemenat 2 umesto 1, 2 i 3. Rešenje problema na slici 8 je podskup {1, 3, 5}, što se može ustanoviti npr. proverom svih mogućih podskupova S A. Postavlja se pitanje nalaženja opšteg metoda za odlučivanje koje elemente treba uključiti u S. Algoritam. U svakom koraku pronalazimo elemenat u koga se ni jedan drugi ne preslikava, uklanjamo ga i nastavljamo rekurzivno. Realizacija algoritma ipak ne mora da bude rekurzivna. Svakom elementu i, 1 i n pridružuje se brojač c[i], čija je početna vrednost jednaka broju elemenata koji se preslikavaju u i. Vrednosti c[i] mogu se izračunati u n koraka prolazeći kroz vektor f i pri tome povećavajući za jedan odgovarajuće brojače. Zatim se u listu stavljaju svi elementi kojima je vrednost brojača dobila vrednost 0. U svakom koraku se prvi elemenat j iz liste uklanja iz liste i iz skupa, dekrementira se c[f[j]], a ako c[f[j]] dobije vrednost 0, f[j] se stavlja u listu. Rešavanje je završeno u trenutku kad je lista prazna. Složenost. Za uvodni deo (inicijalizaciju) treba izvršiti O(n) koraka. Svaki elemenat se u listu može staviti najviše jednom, a operacije potrebne da se elemenat ukloni iz liste izvršavaju se za vreme ograničeno konstantom. Prema tome, ukupan broj koraka je O(n). 12 Algoritam za nalaženje takvog i da su u kvadratnoj 0 1 matrici svi elementi i te vrste (sem i tog) 1, i svi elementi i te kolone (sem i tog) 0 Ovaj problem je poznatiji pod imenom,,problem nalaženja zvezde. Među n osoba zvezda je osoba koja nikoga ne poznaje, a koju svi ostali poznaju. Problem je identifikovati zvezdu (ako ona postoji) postavljajući pitanja oblika,,izvinite, da li poznajete onu osobu? Pretpostavlja se da su svi odgovori tačni, a da će čak i zvezda odgovarati na pitanja. Problem se može preformulisati u grafovski. Formiramo usmereni graf sa čvorovima koji odgovaraju osobama, u kome grana od osobe A ka osobi B postoji ako A poznaje B. Zvezda odgovara ponoru grafa, čvoru u koji ulazi n 1 grana, a iz koga ne izlazi ni jedna grana. Jasno je da graf može imati najviše jedan ponor. Ulaz problema se opisuje n x n matricom povezanosti M, čiji elemenat M ij je jednak 1 ako osoba i poznaje osobu j, odnosno 0 u protivnom; dijagonalni elementi su jednaki nuli. Bazni slučaj sa dve osobe je jednostavan. Posmatrajmo razliku između problema sa n 1 osobom i problema sa n osoba. Pretpostavljamo da znamo da pronađemo zvezdu među prvih n 1 osoba indukcijom. Pošto može da postoji najviše jedna zvezda, postoje tri mogućnosti: 1. zvezda je jedna od prvih n 1 osoba; 2. zvezda je n-ta osoba; 3. zvezda ne postoji. Pretpostavimo da osobu A pitamo da li poznaje osobu B. Ako A poznaje B, onda A nije zvezda, a ako pak A ne poznaje B, onda B nije zvezda. U oba slučaja se jedna osoba eliminiše postavljanjem samo jednog pitanja. Algoritam. Algoritam se deli u dve faze. U prvoj fazi se eliminišu sve osobe sem jednog kandidata za zvezdu, a druga faza je neophodna da se ustanovi da li kandidat jeste zvezda. Algoritam Zvezda(Poznaje); Ulaz: Poznaje (n n Bulova matrica sa nulama na dijagonali). Izlaz: Zvezda. i := 1; {osoba A} j := 2; {osoba B} Naredni := 3; {sledeći koji će se proveravati} 16
end {prva faza: eliminišu se svi kandidati sem jednog} while Naredni <= n + 1 do if Poznaje[i, j] then i := Naredni {eliminacija i} else j := Naredni; {eliminacija j} Naredni := Naredni + 1 {po izlasku iz petlje je ili i = n + 1 ili j = n + 1} if i = n + 1 then Kandidat := j else Kandidat := i {druga faza: provera da li je Kandidat zvezda} Jeste := true; {true ako Kandidat jeste zvezda} k := 1; while Jeste and k <= n do if Poznaje[Kandidat, k] then Jeste := false; if not Poznaje[k, Kandidat] then if Kandidat!= k then Jeste := false; k := k + 1; if Jeste then Zvezda := Kandidat else Zvezda := 0 {nema zvezde} Složenost. Postavlja se najviše 3(n 1) pitanja: n 1 pitanja u prvoj fazi da bi se eliminisala n 1 osoba, i najviše 2(n 1) pitanja za proveru da li je preostali kandidat zvezda. Primetimo da veličina ulaza nije n, nego n(n 1), broj elemenata matrice. Prikazano rexee pokazuje da je moguće odrediti zvezdu pregledajući najviše O(n) elemenata matrice povezanosti, iako je jasno da rešenje mora bitno da zavisi od svih n(n 1) elemenata matrice. 13 Računanje svih faktora ravnoteže binarnog stabla Neka je T binarno stablo sa korenom r. Visina čvora v je rastojanje od v do najdaljeg potomka. Visina stabla je visina njegovog korena. Faktor ravnoteže čvora v definiše se kao razlika visina njegovog levog i desnog podstabla. Na slici 10 prikazano je binarno stablo kod koga je uz svaki čvor upisan par h/b, gde je h visina čvora, a b njegov faktor ravnoteže. Slika 10: Binarno stablo sa oznakama h/b uz unutrašnje čvorove. Problem. Za zadato stablo T sa n čvorova izračunati faktore ravnoteže svih čvorova. Pojačana induktivna hipoteza. Znamo da izračunamo faktore ravnoteže i visine svih čvorova u stablima koja imaju < n čvorova. Bazni slučaj je trivijalan. Kad posmatramo koren proizvoljnog stabla, njegov faktor ravnoteže možemo lako da odredimo kao razliku visina njegovih sinova. Možemo da odredimo i visinu korena: to je veća od visina njegovih sinova, uvećana za jedan. 17
Lako je proveriti da se slučaj kad nema levog ili desnog podstabla, može rešiti tako da se visina nepostojećeg sina zameni sa 1. Karakteristika ovog algoritma je da on rešava nešto opštiji problem. Umesto da računamo samo faktore ravnoteže, mi izračunavamo i visine čvorova. Ispostavlja se da je opštiji problem lakši, jer se visine lako računaju. Ako je rešenje opštije (jer je problem proširen), onda induktivni korak može biti jednostavniji, jer posedujemo snažnija sredstva. Uobičajena greška pri rešavanju šireg problema je da se zaboravi na postojanje dva parametra, i da se svaki od ih mora posebno izračunati. 14 Nalaženje maksimalnog (uzastopnog) podniza datog niza realnih brojeva Problem. Zadat je niz x 1, x 2,..., x n realnih brojeva (ne obavezno pozitivnih). Odrediti podniz x i, x i+1,..., x j uzastopnih elemenata sa najvećom mogućom sumom. Za ovakav podniz reći ćemo da je maksimalni podniz. Na primer, u nizu (2, 3, 1.5, 1, 3, 2, 3, 3) maksimalni podniz je 1.5, 1, 3, sa sumom 3.5. Može da postoji više maksimalnih podnizova datog niza. Ako su svi članovi niza negativni, onda je maksimalni podniz prazan (po definiciji, suma praznog niza je 0). Induktivna hipoteza. Znamo da nađemo maksimalni podniz u nizovima dužine < n. Za n = 1 maksimalni podniz je broj x 1 ako je x 1 0, odnosno prazan podniz ako je x 1 < 0. Problem sa razmotrenom induktivnom hipotezom je u tome što x n može da produži podniz koji nije maksimalan u S i tako formira novi maksimalni podniz u S. Prema tome, nije dovoljno samo poznavanje maksimalnog podniza u S. Međutim, x n može da produži samo podniz koji se završava sa x n 1, odnosno sufiks niza S. Pojačana induktivna hipoteza. U nizovima dužine < n umemo da pronađemo maksimalni podniz, i maksimalni sufiks. Ako za podniz S znamo oba ova podniza, algoritam postaje jasan. Maksimalni sufiks proširujemo brojem x n. Ako je dobijena suma veća od sume (globalno) maksimalnog podniza, onda imamo novi maksimalni podniz (takođe i novi maksimalni sufiks). U protivnom, zadržavamo prethodni maksimalni podniz. Posao time nije završen: potrebno je odrediti i novi maksimalni sufiks. U opštem slučaju novi maksimalni sufiks se ne dobija uvek proširivanjem starog brojem x n. Može se dogoditi da je maksimalni sufiks koji se završava sabirkom x n negativan. Tada je novi maksimalni sufiks ustvari prazan podniz, sa sumom 0. Algoritam Max_uzast_podniz(X, n); Ulaz: X (niz dužine n). Izlaz: Glob_max (suma maksimalnog podniza). Glob_max := 0; {početna vrednost globalno maks. sume} Suf_max := 0; {početna vrednost sume maks. sufiksa} for i := 1 to n do if x[i] + Suf_max > Glob_max then Suf_max := Suf_max + x[i]; Glob_max := Suf_max; else if x[i] + Suf_max > 0 then Suf_max := Suf_max + x[i]; else Suf_max := 0; end 15 Binarna pretraga, primeri primene; interpolaciona pretraga 15.1 Binarna pretraga, primeri primene Osnovna ideja binarne pretrage je podela prostora na dva približno jednaka dela postavljanjem samo jednog pitanja. 18
Problem (čista binarna pretraga). Neka je x 1, x 2,..., x n niz realnih brojeva takav da je x1 x2... x n. Za zadati realni broj z treba ustanoviti da li se z pojavljuje u nizu, a ako je odgovor,,da, potrebno je pronaći indeks i takav da je x i = z. Ideja je prepoloviti prostor koji se pretražuje tako što se najpre proveri srednji član niza. Pretpostavimo zbog jednostavnosti da je n paran broj. Ako je z manje od x n/2+1, onda z može biti samo u prvoj polovini niza; u protivnom, z može biti samo u drugoj polovini niza. Pronalaženje z u prvoj ili drugoj polovini niza je problem veličine n/2, koji se rešava rekurzivno. Bazni slučaj n = 1 rešava se neposrednim upoređivanjem z sa elementom. Algoritam Binarna_Pretraga(X, n, z); Ulaz: X (niz od n brojeva, uredenih neopadajuće) i z (broj koji se traži). Izlaz: Poz (indeks i takav da je X[i] = z, ili 0 ako takav indeks ne postoji). Poz = Nadji(z, 1, n); end function Nadji(z; Levi;Desni) if Levi = Desni then if X[Levi] = z then Nadji = Levi; else Nadji = 0; else Srednji = (Levi + Desni)/2; if z < X[Srednji] then Nadji = Nadji(z, Levi, Srednji - 1) else Nadji = Nadji(z, Srednji, Desni) end Složenost. Složenost binarne pretrage niza od n elemenata može se opisati rekurentnom relacijom T (n) = T (n/2) + 1, odakle se dobija da je složenost O(log n) na osnovu Master teoreme. Problem. Za zadati rastuće uređeni niz celih brojeva a 1, a 2,..., a n utvrditi da li postoji indeks i, takav da je a i = i. Ovaj problem je mogući svesti na binarnu pretragu. Zaista, niz x i = a i i je neopadajući (jer je x i+1 x i = a i+1 a i 1 0), a uslov a i = i je ekvivalentan uslovu x i = 0. Prema tome, zadati problem rešava se binarnom pretragom niza x i, u kome se traži broj z = 0. Problem (binarna pretraga ciklički uređenog niza). Za zadati cikliqčki uređeni niz pronaći poziciju minimalnog elementa niza (zbog jednostavnosti može se pretpostaviti da je ta pozicija jedinstvena). Za niz x 1, x 2,..., x n kaže se da je ciklički uređen ako važe nejednakosti x i < x i+1 <... < x n < x 1 <... < x i 1, gde je x i najmanji elemenat niza. Da bismo pronašli minimalni elemenat x i u nizu, koristimo ideju binarne pretrage da jednim upoređivanjem eliminišemo polovinu niza. Uzmimo proizvoljna dva broja x k i x m takva da je k < m. Ako je x k < x m, onda i ne može biti u intervalu k < i m, jer je x i najmanji elemenat niza (u tom slučaju bilo bi x i < x m < x k suprotno pretpostavci da je x k < x m ). U protivnom, ako je x k > x m, onda i mora biti u intervalu k < i m, jer je tada monotonost niza prekinuta negde u intervalu indeksa [k, m]. Prema tome, jednim upoređivanjem može se eliminisati mnogo elemenata. Odgovarajućim izborom k i m, i se može odrediti pomoću O(log n) upoređivanja. Invarijanta glavne petlje algoritma je uslov da se i uvek nalazi u intervalu [Levi, Desni]. Algoritam Cikl_Binarna_Pretraga(X, n); 19
Ulaz: X (vektor sa ciklički uredenim nizom od n različitih brojeva); Izlaz: poz (indeks minimalnog elementa u X); poz = c_nadji(1, n); end function c_nadji(levi, Desni) if Levi = Desni then c_nadji = Levi; else Srednji = (Levi + Desni)/2; if X[Srednji] < X[Desni] then c_nadji = c_nadji(levi, Srednji); else c_nadji = c_nadji(srednji + 1, Desni); end Problem (Binarna pretraga niza nepoznate dužine). Posmatrajmo varijantu problema pretrage kad se zadati broj z traži u uređenom nizu nepoznate dužine. Da bi se problem sveo na već rešen, potrebno je pronaći bar jedan indeks i takav da je x i > z: tada se može preći na binarnu pretragu opsega indeksa od 1 do i. Može se postupiti na sledeći način. Najpre se z upoređuje sa x 1. Ako je z x 1, onda z može biti jednako samo broju x 1. Pretpostavimo da znamo indeks j takav da je z > x j. Posle upoređivanja z sa x 2j postoje dve mogućnosti. Ako je z x 2j, onda znamo da je x j < z x 2j, pa se z može pronaći pomoću O(log 2 j) upoređivanja. Ako je pak z > x 2j, onda je prostor za pretraživanje udvostručen, i treba nastaviti (indukcijom) tako što se j zameni sa 2j. Pretpostavimo da je i najmanji indeks takav da je z x i. Tada je dovoljno O(log 2 i) upoređivanja da se (udvostručavanjem) pronađe takvo x j koje je veće ili jednako od z, i novih O(log 2 i) upoređivanja da se pronađe z. Isti algoritam može se upotrebiti i ako je dužina niza poznata, ali očekujemo da je indeks i vrlo mali. Da bi ovaj algoritam bio bolji od obične binarne pretrage, potrebno je da bude priblino 2 log 2 i < log 2 n, odnosno i < n. Problem (Utvrđivanje da li zadata tačka pripada mnogouglu). P i tačka q. Ustanoviti da li je tačka u ili van mnogougla P. Zadat je prost mnogougao Posmatrajmo proizvoljnu polupravu sa temenom q. Vidi se da je dovoljno prebrojati preseke sa stranicama mnogougla, sve do dostizanja spoljašnje oblasti. Uopšte (specijalne slučajeve na trenutak zanemarujemo) tačka je u mnogouglu ako i samo ako je presek poluprave sa temenom q neparan. Specijalni slučajevi mogu biti nešto kompleksniji (npr. odabrana poluprava prolazi kroz teme mnogougla), pa autori preporučuju konsultovanje knjigom profesora. Potpun algoritam je dat sa: Algoritam Tačka_u_mnogouglu_2(P, q); {drugi pokušaj} Ulaz: P (prosti mnogougao sa temenima p1, p2,..., pn i stranicama e1, e2,..., en), i q (tačka sa koordinatama (x0, y0)). Izlaz: Pripada (bulova promenljiva, true akko q pripada P). Broj := 0; for sve grane ei mnogougla do if prava x = x0 seče ei then {Pretpostavljamo da presek nije ni teme ni stranica mnogougla} Neka je yi y-koordinata preseka prave x = x0 sa ei; if yi < y0 then {presek je ispod q} Broj := Broj + 1; if Broj je neparan then Pripada := true; else Pripada := false; end 20
15.2 Interpolaciona pretraga Problem (Interpolaciona pretraga) U okviru binarne pretrage prostor pretrage se svaki put polovi, što garantuje logaritamsku vremensku složenost. Međutim, ako se u toku pretrage naiđe na vrednost vrlo blisku traženom broju z, izgleda razumno da se pretraga usredsredi na,,okolinu tog indeksa umesto da se nastavi sa polovljenjem naslepo. Specijalno, ako je vrednost z vrlo mala, može se započeti sa pretragom negde na početku niza umesto od srednjeg indeksa. Slika 11: Interpolaciona pretraga ilustracija. Umesto da polovimo prostor pretrage, mi ga delimo tako da bude najveća,,verovatnoća uspeha. Odnos u kome se opseg indeksa deli određuje se interpolacijom, što je ilustrovano na slici 11. Recimo da je z = 7. Prvom interpolacijom dobija se indeks 6; ispostavlja se da je X[6] < z. Sledeća interpolacija u intervalu indeksa [6, 17] dovodi do rešenja X[7]. Algoritam, zajedno sa izrazom po kome se vrši interpolacija, dat je sa: 21
Složenost. Efikasnost interpolacione pretrage ne zavisi samo od dužine niza, nego i od svih njegovih elemenata, odnosno od kompletnog ulaza. Postoje ulazi za koje interpolaciona pretraga proverava praktično svaki član niza (videti zadatak 5.5 u profesorovoj knjizi). S druge strane, interpolaciona pretraga je vrlo efikasna za ulaze sa približno uniformno raspodeđenim elementima (odnosno ako su tačke (i, x i ) grupisane u okolini prave). Pokazuje se da je srednji broj upoređivanja u toku interpolacione pretrage (usrednjavanje po svim mogućim nizovima) jednak O(log log n). Ipak, interpolaciona pretraga nije mnogo bolja od obične binarne pretrage iz dva razloga. Najpre, sem za jako velike vrednosti n, već je log 2 n mala vrednost, pa njen logaritam nije mnogo manji. Drugo, kod izbora narednog indeksa u toku interpolacione pretrage potrebno je izvršiti nešto komplikovanije aritmetičke operacije. 16 Istovremeno nalaženje najmanjeg i najvećeg elementa u nizu Podelimo skup na dva podskupa sa jednakim brojem elemenata. Rešivši rekurzivno oba potproblema dobijamo dva minimalna (a 1 i a 2 ) i dva maksimalna elementa (b 1 i b 2 ), pri čemu su a 1 i b 1 iz prvog, a a 2 i b 2 iz drugog podniza. Potrebno je videti koliko upoređivanja je potrebno da je odrede maksimum i minimum od ova četiri broja. Lako je videti da će biti dovoljna 2 pitanja: Prvo pitanje je a 2 a 1? Ukoliko je odgovor,,da, onda se postavlja pitanje b 2 a 1? Ukoliko je odgovor,,da, onda se u rekurzivnom pozivu vraća par (a 2, b 2 ), a ukoliko je odgovor,,ne, onda se vraća par (a 2, a 1 ). Ukoliko je odgovor na prvo pitanje bio,,ne, onda se postavlja pitanje a 2 b 1? Ukoliko je odgovor,,da, onda se vraća par (a 1, a 2 ), a inače se vraća par (a 1, b 1 ). Dakle, rekurentna relacija izgleda odakle se dobija (n = 2 k ) T (n) = 2T (n/2) + 2, T (2) = 1, T (2 k ) = 2T (2 k 1 ) + 2 = 2(2T (2 k 1 ) + 2) + 2 = = 2 2 T (2 k 2 ) + 2 2 + 2 = = 2 3 T (2 k 3 ) + 2 3 + 2 2 + 2 = =... = = 2 k 1 T (2) + 2 k 1 +... + 2 2 + 2 = }{{} 2 k 2 = 2 k 1 + 2 k 2 T (n) = n 2 + n 2 = = 3n 2 2 17 Nalaženje k-tog najmanjeg od n zadatih brojeva Problem. Za zadati niz elemenata S = x 1, x 2,..., x n i prirodni broj k, 1 k n, odrediti k-ti najmanji elemenat u S. Ideja je primeniti dekompoziciju na isti način kao i kod algoritma sortiranje razdvajanjem, sem što je ovog puta dovoljno rešiti samo jedan od dva potproblema. Kod sortiranja razdvajanjem niz se razdvaja pomoću pivota na dva podniza. Dva podniza se zatim sortiraju rekurzivno. Ovde je dovoljno odrediti koji od podnizova sadri k-ti najmanji elemenat, a onda algoritam primeniti rekurzivno samo na taj podniz. Ostali elementi mogu se ignorisati. 22
Algoritam Selekcija(X, n, k); Ulaz: X (niz od n brojeva) i k (prirodni broj); Izlaz: S (k-ti najmanji elemenat; niz X je promenjen); if (k < 1) or (k > n) then print "greška"; else S = Sel(1, n, k); end function Sel(Levi, Desni, k); if Levi = Desni then Sel = Levi; else S = Razdvajanje(X, Levi, Desni); {videti sliku *} if S - Levi + 1 >= k then Sel = Sel(Levi, S, k); else Sel = Sel(S + 1, Desni, k - (S - Levi + 1)); end Složenost. Kao i kod sortiranja razdvajanjem, loš izbor pivota vodi kvadratnom algoritmu. Srednja složenost ovog algoritma može se oceniti na sličan način kao kod sortiranja razdvajanjem. Rekurentna relacija koja opisuje prosečnu složenost ovog algoritam je T (n) = T (n/2) + cn, odakle se iz Master teoreme dobije složenost O(n). 18 Nalaženje dve najbliže tačke u datom skupu od n tačaka u ravni Umesto da razmatramo tačke jednu po jednu, možemo da skup tačaka podelimo na dva jednaka dela. Induktivna hipoteza je takva da problem svodimo na dva problema sa n/2 tačaka. Zbog jednostavnosti pretpostavimo da je n stepen dvojke, tako da je skup uvek moguće podeliti na dva jednaka dela. Postoji više načina da se skup podeli na dva jednaka dela. Biramo način koji najviše odgovara našim ciljevima. Voleli bismo da dobijemo što više korisnih informacija iz rešea manjih problema, odnosno da što veći deo tih informacija važi i za kompletan problem. Izgleda razumno da se skup podeli na dva dela podelom ravni na dva disjunktna dela, tako da svaki od njih sadrži polovinu tačaka. Pošto se pronađe najmanje rastojanje u svakom delu, treba razmotriti samo rastojanja između tačaka bliskih granici skupova. Najjednostavniji način podele je sortirati tačke prema (na primer) x-koordinatama i podeliti ravan pravom paralelnom sa y-osom, koja deli skup na dva jednaka dela, videti sliku 12 (ako više tačaka leži na pravoj podele, tačke se mogu na proizvoljan način razdeliti između skupova). Način podele izabran je tako da se maksimalno pojednostavi objedinjavanje rešenja manjih problema. Sortiranje treba izvršiti samo jednom. 23
Slika 12: Problem nalaženja dve najbliže tačke. Zbog jednostavnosti ograničićemo se na nalaženje vrednosti najmanjeg rastojanja između tačaka (a ne i para tačaka za koje se ono dostiže). Pronalaženje dve najbliže tačke izvodi se na sledeći način. Neka je P skup tačaka i neka je n stepen dvojke. Najpre se skup P deli na dva istobrojna podskupa P 1 i P 2 na opisani način. Najmanje rastojanje u svakom podskupu pronalazi se na osnovu induktivne hipoteze. Neka je d 1 minimalno rastojanje u P 1, a d 2 minimalno rastojanje u P 2. Bez smanjenja opštosti može se pretpostaviti da je d 1 d 2. Potrebno je pronaći najmanje rastojanje u celom skupu, odnosno ustanoviti da li u P 1 postoji tačka na rastojanju manjem od d 1 od neke tačke u P 2. Primetimo najpre da je dovoljno razmatrati tačke u traci širine 2d 1, simetričnoj u odnosu na pravu podele (videti sliku 13). Ostale tačke ne mogu biti na rastojanju manjem od d 1 od neke tačke iz drugog podskupa. Na osnovu ovog zapažanja obično se iz razmatranja eliminiše veliki broj tačaka. Međutim, u najgorem slučaju sve tačke mogu biti u traci, pa ne možemo da sebi priuštimo primenu trivijalnog algoritma na njih. Drugo manje očigledno zapažanje je da za proizvoljnu tačku p u traci postoji samo mali broj tačaka u suprotnoj traci čije rastojanje od p može biti manje od d 1. Iskoristićemo činjenicu da je 2/2 > 0, 7. Neka je sa y p označena y-koordinata tačke p. Konstruišimo pravougaonik visine 2, 1d 1 < 3 2 2d1 i širine 1, 4d 1 < 2d 1 u suprotnoj traci (videti sliku 11), tako da nalože na pravu podele i da mu je y-koordinata preseka dijagonala jednaka y p. Podelimo ga jednom vertikalnom pravom i sa dve horizontalne prave na šest jednakih kvadrata stranice 0, 7d 1 (kojima je dijagonala manja od d 1!!!). U svakom od malih kvadrata može se naći najviše jedna tačka, jer je rastojanje bilo koje dve tačke u kvadratu manje od d 1. Sve tačke u drugom podskupu, sa rastojanjem od p manjim od d 1, očigledno se moraju nalaziti u pravougaoniku. Dakle, u drugom podskupu se može nalaziti najviše šest tačaka na rastojanju od p manjem od d 1 : tačka kandidat sa y-koordinatom y q mora da zadovolji i uslov y p y q < d 1, pa se mora nalaziti u jednom od 6 kvadrata. Prema tome, ako sve tačke u traci sortiramo prema y-koordinatama i pregledamo ih tim redom, dovoljno je da za svaku tačku proverimo rastojanje osam suseda u suprotnoj traci, četiri ispod i četiri iznad (a ne od svih n 1 tačaka u najgorem slučaju). 24
Slika 13: Ocena maksimalnog broja tačaka iz suprotnog podskupa, bliskih fiksiranoj tački. Složenost. Sortiranje složenosti O(n log n) izvršava se samo jednom. Zatim se rešavaju dva potproblema veličine n/2. Eliminacija tačaka van centralne trake može se izvesti za O(n) koraka. Za sortiranje tačaka u traci po y-koordinatama u najgorem sluqaju potrebno je O(n log n) koraka. Konačno, potrebno je O(n) koraka da se pregledaju tačke u traci, i da se provere rastojanja svake od njih od konstantnog broja suseda u sortiranom redosledu. Ukupno, da bi se rešio problem veličine n, treba rešiti dva potproblema veličine n/2 i izvršiti O(n log n) koraka za kombinovanje njihovih rešenja (plus O(n log n) koraka za jednokratno sortiranje tačaka po x-koordinatama na početku). Dobijamo diferencnu jednačinu T (n) < 2T (n/2) + cn log 2 n, T (2) = 1, pri čemu u T(n) nije uključeno početno sortiranje po x-koordinatama. Indukcijom se pokazuje da je njeno rešenje T (n) = O(n log 2 n). Ovo je bolje od kvadratne složenosti, ali se može poboljšati. Algoritam složenosti O(n log n). Osnovna ideja je pojačati induktivnu hipotezu. U toku objedinjavanja rešenja potproblema izvodi se O(n log n) koraka zbog sortiranja tačaka po y-koordinatama. Može li se sortiranje izvesti usput u toku nalaženja dveju najbližih tačaka? Drugim reqima, cilj je pojačati induktivnu hipotezu za problem dve najbliže tačke tako da obuhvati i sortiranje. Pojačana induktivna hipoteza. Za zadati skup od < n tačaka u ravni umemo da pronađemo najmanje rastojanje i da skup tačaka sortiramo po y-koordinatama. Već smo videli kako se može pronaći minimalno rastojanje ako se tačke u svakom koraku sortiraju po y-koordinatama. Dakle, potrebno je još samo proširiti induktivnu hipotezu tako da obuhvati sortiranje n tačaka kad su dva podskupa veličine n/2 već sortirana. Međutim, to je upravo sortiranje objedinjavanjem. Osnovna prednost ovog pristupa je u tome što se pri objedinjavanju re senja ne mora izvesti kompletno sortiranje, nego samo objedinjavanje dva već sortirana podniza. Pošto se objedinjavanje sortiranih podnizova izvodi za O(n) koraka, diferencna jednačina za složenost (bez početnog sortiranja po x-koordinatama) postaje T (n) < 2T (n/2) + cn, T (2) = 1. Njeno rešenje je T (n) = O(n log n), što je asimptotski jednako složenosti početnog sortiranja tačaka po x-koordinatama. 25