Deli in vladaj. J.Kozak: PSA II, / 75

Σχετικά έγγραφα
Diferencialna enačba, v kateri nastopata neznana funkcija in njen odvod v prvi potenci

Zaporedja. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 22. oktober Gregor Dolinar Matematika 1

Funkcijske vrste. Matematika 2. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 2. april Gregor Dolinar Matematika 2

matrike A = [a ij ] m,n αa 11 αa 12 αa 1n αa 21 αa 22 αa 2n αa m1 αa m2 αa mn se števanje po komponentah (matriki morata biti enakih dimenzij):

Tretja vaja iz matematike 1

Splošno o interpolaciji

Funkcije. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 14. november Gregor Dolinar Matematika 1

Odvod. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 10. december Gregor Dolinar Matematika 1

Funkcije. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 21. november Gregor Dolinar Matematika 1

Odvod. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 5. december Gregor Dolinar Matematika 1

Reševanje sistema linearnih

KODE ZA ODKRIVANJE IN ODPRAVLJANJE NAPAK

DISKRETNA FOURIERJEVA TRANSFORMACIJA

Zaporedja. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 15. oktober Gregor Dolinar Matematika 1

Funkcije. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 12. november Gregor Dolinar Matematika 1

V tem poglavju bomo vpeljali pojem determinante matrike, spoznali bomo njene lastnosti in nekaj metod za računanje determinant.

Podobnost matrik. Matematika II (FKKT Kemijsko inženirstvo) Diagonalizacija matrik

Dragi polinom, kje so tvoje ničle?

13. Jacobijeva metoda za računanje singularnega razcepa

Booleova algebra. Izjave in Booleove spremenljivke

IZPIT IZ ANALIZE II Maribor,

Matrike. Poglavje II. Matrika je pravokotna tabela realnih števil. Na primer: , , , 0 1

1 Fibonaccijeva stevila

*M * Osnovna in višja raven MATEMATIKA NAVODILA ZA OCENJEVANJE. Sobota, 4. junij 2011 SPOMLADANSKI IZPITNI ROK. Državni izpitni center

Navadne diferencialne enačbe

Kotne in krožne funkcije

SKUPNE PORAZDELITVE VEČ SLUČAJNIH SPREMENLJIVK

Iterativno reševanje sistemov linearnih enačb. Numerične metode, sistemi linearnih enačb. Numerične metode FE, 2. december 2013

Algebraične strukture

Matematika. Funkcije in enačbe

Enačba, v kateri poleg neznane funkcije neodvisnih spremenljivk ter konstant nastopajo tudi njeni odvodi, se imenuje diferencialna enačba.

Analiza 2 Rešitve 14. sklopa nalog

FAKULTETA ZA STROJNIŠTVO Matematika 4 Pisni izpit 22. junij Navodila

Lastne vrednosti in lastni vektorji

Kontrolne karte uporabljamo za sprotno spremljanje kakovosti izdelka, ki ga izdelujemo v proizvodnem procesu.

8. Posplošeni problem lastnih vrednosti

Problem lastnih vrednosti

Izpeljava Jensenove in Hölderjeve neenakosti ter neenakosti Minkowskega

Linearne preslikave. Poglavje VII. 1 Definicija linearne preslikave in osnovne lastnosti

Matematika 1. Gabrijel Tomšič Bojan Orel Neža Mramor Kosta

diferencialne enačbe - nadaljevanje

1. Definicijsko območje, zaloga vrednosti. 2. Naraščanje in padanje, ekstremi. 3. Ukrivljenost. 4. Trend na robu definicijskega območja

Matematika I (VS) Univerza v Ljubljani, FE. Melita Hajdinjak 2013/14. Pregled elementarnih funkcij. Potenčna funkcija. Korenska funkcija.

Osnove linearne algebre

Numerično reševanje. diferencialnih enačb II

MATEMATIČNI IZRAZI V MAFIRA WIKIJU

Kvadratne forme. Poglavje XI. 1 Definicija in osnovne lastnosti

Oznake in osnovne definicije

Kombinatorika. rekurzivnih enačb in rodovne funkcije. FMF Matematika Finančna matematika. Vladimir Batagelj. Ljubljana, april

Enočlenske metode veljajo trenutno za najprimernejše metode v numeričnem reševanju začetnih problemov. Skoraj vse sodijo v

Matematika 2. Diferencialne enačbe drugega reda

Reševanje sistemov linearnih enačb

D f, Z f. Lastnosti. Linearna funkcija. Definicija Linearna funkcija f : je definirana s predpisom f(x) = kx+n; k,

Osnove matematične analize 2016/17

Funkcije več spremenljivk

Poglavje 2. Sistemi linearnih enačb

Inverzni problem lastnih vrednosti evklidsko razdaljnih matrik

Problem lastnih vrednosti 1 / 20

5.1 Predpogojevanje. K 1 Ax = K 1 b,

11.5 Metoda karakteristik za hiperbolične PDE

Kotni funkciji sinus in kosinus

UNIVERZA V MARIBORU FAKULTETA ZA KEMIJO IN KEMIJSKO TEHNOLOGIJO MATEMATIKA II

11. Posplošeni problemi lastnih vrednosti

Dodatna poglavja iz linearne algebre za 1. letnik finančne matematike na FMF. Primož Moravec

Uporabna matematika za naravoslovce

vezani ekstremi funkcij

Definicija. definiramo skalarni produkt. x i y i. in razdaljo. d(x, y) = x y = < x y, x y > = n (x i y i ) 2. i=1. i=1

Tema 1 Osnove navadnih diferencialnih enačb (NDE)

MATEMATIKA II TEORIJA

Matematika vaja. Matematika FE, Ljubljana, Slovenija Fakulteta za Elektrotehniko 1000 Ljubljana, Tržaška 25, Slovenija

NEPARAMETRIČNI TESTI. pregledovanje tabel hi-kvadrat test. as. dr. Nino RODE

Vaje iz MATEMATIKE 8. Odvod funkcije., pravimo, da je funkcija f odvedljiva v točki x 0 z odvodom. f (x f(x 0 + h) f(x 0 ) 0 ) := lim

Delovna točka in napajalna vezja bipolarnih tranzistorjev

Linearna algebra. Bojan Orel Fakulteta za računalništvo in informatiko

PONOVITEV SNOVI ZA 4. TEST

Spoznajmo sedaj definicijo in nekaj osnovnih primerov zaporedij števil.

Vektorski prostori s skalarnim produktom

Transformator. Delovanje transformatorja I. Delovanje transformatorja II

Matematika. BF Lesarstvo. Zapiski ob predavanjih v šolskem letu 2009/2010

Frekvenčna analiza neperiodičnih signalov. Analiza signalov prof. France Mihelič

Odvode odvisnih spremenljivk po neodvisni spremenljivki bomo označevali s piko: Sistem navadnih diferencialnih enačb prvega reda ima obliko:

REˇSITVE. Naloga a. b. c. d Skupaj. FAKULTETA ZA MATEMATIKO IN FIZIKO Oddelek za matematiko Verjetnost 2. kolokvij 23.

Osnove elektrotehnike uvod

Na pregledni skici napišite/označite ustrezne točke in paraboli. A) 12 B) 8 C) 4 D) 4 E) 8 F) 12

INTEGRALI RACIONALNIH FUNKCIJ

VEKTORJI. Operacije z vektorji

1. izpit iz Diskretnih struktur UNI Ljubljana, 17. januar 2006

Navadne diferencialne enačbe

Uvod v numerične metode

1. Trikotniki hitrosti

Matematika. BF Lesarstvo. Zapiski ob predavanjih v šolskem letu 2010/2011

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA SANDRA BOLTA LASTNE VREDNOSTI GRAFA DIPLOMSKO DELO

8. Diskretni LTI sistemi

3.1 Reševanje nelinearnih sistemov

1 Seštevanje vektorjev in množenje s skalarjem

INŽENIRSKA MATEMATIKA I

Interpolacija in aproksimacija funkcij

Univerza v Ljubljani Fakulteta za računalništvo in informatiko MATEMATIKA. Polona Oblak

Kunci, jabolka in zlatnina

II. LIMITA IN ZVEZNOST FUNKCIJ

Transcript:

Deli in vladaj J.Kozak: PSA II, 2010-2011 1 / 75 Metoda deli in vladaj je ena od pomembnih splošnih metod načrtovanja algoritmov. Če je problem, ki ga rešujemo, preveč zapleten, si lahko pomagamo tako, da ga razcepimo na podprobleme, jih rešimo in rešitve združimo v rešitev prvotnega problema. Če so tudi podproblemi prezahtevni, jih delimo naprej toliko časa, da znamo njihovo rešitev preprosto poiskati. Pri tej metodi je ključno to, da so tudi podproblemi enake narave kot prvotni. Metoda pogosto pripelje do rekurzivnih rešitev, s čimer si poenostavimo sestavljanje algoritmov.

J.Kozak: PSA II, 2010-2011 2 / 75 Opišimo metodo v splošnem. Poenostavimo si zapis s tem, da privzamemo delitev prvotnega problema v dva manjša. V splošnem je podproblemov seveda lahko več. Predpostavimo, da nam vektor a kaže na podatke, za katere želimo rešiti dani problem. Deliti problem na manjša tako pomeni deliti vektor kazalcev na dva dela. Ključni deli strategije kdaj je problem dovolj preprost, da ga rešimo kako rešimo preprost problem kako delimo problem kako združujemo rešitvi

Strategija Metoda deli in vladaj procedure deliinvladaj(a, dno, vrh, rešitev); { Procedura poišče rešitev problema po metodi vladaj in vladaj. Podatke določajo kazalci a[dno], a[dno + 1],..., a[vrh]. } begin if problemmajhen(dno, vrh) then reši(a, dno, vrh, rešitev) else begin { Problem ni majhen: dno vrh! } s := deli(dno, vrh); { Reši prvi podproblem. } deliinvladaj(a, dno, s, rešitev) { Reši drugi podproblem. } deliinvladaj(a, s + 1, vrh, rešitev) { Združi obe dobljeni rešitvi. } združi(a, dno, s, vrh, rešitev) end J.Kozak: PSA end. II, 2010-2011 3 / 75

Deli in vladaj brez združevanja rešitev procedure deliinvladaj(a, dno, vrh, rešitev); { Deli in vladaj poišče rešitev problema za podatke a[dno], a[dno + 1],..., a[vrh]. Rešitev podproblema je hkrati tudi rešitev osnovnega problema.} begin if problemmajhen(dno, vrh) then reši(a, dno, vrh, rešitev) else begin { Problem ni majhen: dno vrh! } s := deli(dno, vrh); { Na tem mestu moramo vedeti, rešitev katerega od obeh podproblemov je tudi rešitev prvotnega problema. } if rešitevvlevemsinu then deliinvladaj(a, dno, s, rešitev) else deliinvladaj(a, s + 1, vrh, rešitev) end J.Kozak: PSA end. II, 2010-2011 4 / 75

Časovna zahtevnost deli in vladaj J.Kozak: PSA II, 2010-2011 5 / 75 Elementi časovne zahtevnosti n... velikost problema, b... časovna zahtevnost reševanja majhnega problema, n = 1, a... na koliko enako velikih podproblemov delimo problem, c... razmerje med velikostjo problema in podproblema b... vodilna konstanta zahtevnosti operacij deli in združi r... eksponent vodilnega člena časovne zahtevnosti operacij deli in združi

J.Kozak: PSA II, 2010-2011 6 / 75 Izrek Naj bodo a IN, b IR +, c IN in r IN dane konstante. Rešitev rekurzije { b, n = 1, T (n) = a T ( ) n c + bn r, n > 1, je dana z O (n r ), a < c r, T (n) = O (n ( r log n), a = c r, O n log a) c, a > c r.

Dokaz osnovnega izreka o časovni zahtevnosti J.Kozak: PSA II, 2010-2011 7 / 75 Dokaz. Naj bo n potenca števila c, n = c k, k IN. Z večkratno uporabo rekurzivne formule dobimo ( ) n T (n) = at + bn r c ( ( ) ( ) n n r ) = a at c 2 + b + bn r c ( ) n = a k T c k + bn (1 r + a ( ) ) a k 1 c r + + c r = a k T (1) + bn r qk 1 q 1, q := a c r 1, = a k b + bn r qk 1 q 1 ( ) = bn r q k + qk 1 = bn r qk+1 1 q 1 q 1

J.Kozak: PSA II, 2010-2011 8 / 75 Torej za q = a c r dobimo ocene q < 1 : q k+1 1, T (n) = O (n r ) q = 1 : q > 1 : q k+1 1 q 1 k + 1, T (n) = O (n r log n) ( a k = a log c n ln a ln n = e ln c = n log c a T (n) = O a k) = O (n log a) c Pogosti primeri a = 1, c = 2, r = 0, q = 1, T (n) = O (log n) a = 2, c = 2, r = 1, q = 1, T (n) = O (n log n) a = 3, c = 2, r = 1, q = 3 2, T (n) = O ( n log 2 3) a = 7, c = 2, r = 2, q = 7 4, T (n) = O ( n log 2 7)

Bisekcija J.Kozak: PSA II, 2010-2011 9 / 75 Bisekcija je prvi od algoritmov, ki ga bomo razvili po metodi deli in vladaj. V računalniku jo pogosto srečamo v tej ali oni obliki. Njena posebna odlika je zanesljivost, saj nas tako v celih kot tudi realnih številih zanesljivo privede do cilja. Naštejmo nekaj zgledov. Iskanje elementa v urejenem zaporedju Naj bo zaporedje a = (a i ) n i=1 urejeno z a 1 a 2 a n, n IN, in e dana vrednost. Ali obstaja i, da je a i = e?

J.Kozak: PSA II, 2010-2011 10 / 75 Ničla zvezne funkcije V numerični matematiki se pogosto srečamo z uporabo bisekcije pri iskanju ničel funkcije. Naj bo f C (a) b dana zvezna funkcija, ki je v krajiščih intervala nasprotno predznačena, f (a)f (b) < 0. Poišči ničlo te funkcije na [a, b] (vsekakor je vsaj ena!). Minimum konveksne funkcije Naj bo f C (a) b dana konveksna zvezna funkcija, f (x) > 0, x [a, b]. Poišči njen minimum. Metoda deli in vladaj pravi: Razcepi problem na podproblema. V prvem primeru to razumemo kot iskanje odgovora na vprašanje, ali je element v prvem ali drugem delu podzaporedja, v drugem in tretjem primeru pa kot iskanje ničle ali ekstrema v levem ali desnem podintervalu.

Iskanje elementa v urejenem zaporedju z bisekcijo J.Kozak: PSA II, 2010-2011 11 / 75 procedure bisekcija(n, a, e, i); { Bisekcija poišče v nepadajoče urejenem zaporedju a, a 1 a 2 a n indeks i, za katerega je e = a i. Če takšnega elementa v zaporedju ni, vrne vrednost i = 0. } begin dno := 1; vrh := n; while dno vrh do begin { Deli na dva čimbolj enaka dela. } vrh + dno s := ; 2

J.Kozak: PSA II, 2010-2011 12 / 75 if e = a s then begin i := s; exit(bisekcija) end else if e < a s then vrh := s 1 else dno := s + 1 end ; i := 0 end.

Izrek Bisekcija vrne pravilni odgovor. Dokaz. Trdimo: Element e je v celotnem zaporedju natanko tedaj, ko je v podzaporedju a dno, a dno+1,..., a vrh. Res, na začetku je dno = 1 in vrh = n ter trditev drži. Naj velja na tekočem koraku. V stavku if dobi vrh novo vrednost natanko tedaj, ko je e < a s. Toda zaporedje je nepadajoče urejeno in v tem primeru velja e < a j, j = s, s + 1,..., vrh. Trditev torej ohranimo, če vstavimo vrh := s. Podobno velja tudi za novo vrednost dno in induktivni sklep je potrjen. Zanka while se očitno konča, torej se konča bodisi s stavkom exit in imamo pozitivni odgovor, bodisi z dno > vrh. V tem primeru preostalega zaporedja, kjer bi element še lahko bil, ni več. Torej je v tem primeru pravilen zaključek i := 0. J.Kozak: PSA II, 2010-2011 13 / 75

Časovna zahtevnost bisekcije Iskanje z bisekcijo je iskanje v dvojiškem drevesu, uravnoteženem po globini. Primer, ko elementa e ni v zaporedju: T B (n) = T W (n) = T (n) = O (log n). Primer, ko element e je v zaporedju T B (n) = O (1), T W (n) = O (log n), T E (n): predpostavimo, da je e enako verjetno katerikoli element v zaporedju, torej je verjetnost P(I = i) = 1 n za vse i. V dvojiškem drevesu to pomeni, da iskanje zaključimo enako verjetno v katerem koli vozlišču, a povprečje vseh možnih zaključkov je kar povprečni nivo vozlišča v drevesu. Za polno drevo n = 2 k 1 globine k je to T E (n) = 1 k i2 i 1 = k + O (1) = O (log n). n i=1 J.Kozak: PSA II, 2010-2011 14 / 75

Iskanje mejnih elementov zaporedja procedure mejipreprosto(n, a, amax, amin); { Procedura poišče največji element amax in najmanjši element amin v zaporedju a i, i = 1, 2,..., n. } begin amax := a 1 ; amin := a 1 ; for i := 2 to n do if a i > amax then amax := a i else if a i < amin then amin := a i end. J.Kozak: PSA II, 2010-2011 15 / 75 Vzemimo n podatkov a i, i = 1, 2,..., n, med seboj primerljivih z relacijo. Poiščimo mejna elementa Preprosta rešitev: amax := max 1 i n a i, amin := min 1 i n a i.

Časovna zahtevnost preproste rešitve J.Kozak: PSA II, 2010-2011 16 / 75 Dogovorimo se, da upoštejemo le primerjave med elementi zaporedja in predpostavimo, da je amax enako verjetno katerikoli element v zaporedju. To da T B (n) = n 1, T W (n) = 2(n 1), T E (n) = n 1 + 1 2 (n 1) = 3 (n 1). 2 Poiščimo rešitev še z deli in vladaj.

Določi največji in najmanjši element z deli in vladaj procedure meji(a, dno, vrh, amax, amin); { Procedura poišče največji element amax in najmanjši element amin v podzaporedju a k, k = dno, dno + 1,..., vrh.} begin if (vrh dno) {0, 1} then begin {Problem je majhen } if dno = vrh then begin amax := amin := a dno end else if a dno < a vrh then begin amax := a vrh ; amin := a dno end else begin amax := a dno ; amin := a vrh end end J.Kozak: PSA II, 2010-2011 17 / 75

else begin { Problem ni majhen. } dno + vrh s := ; { Deli. } 2 { Reši podproblema. } meji(a, dno, s, amaxl, aminl); meji(a, s + 1, vrh, amaxd, amind); { Združi rešitvi podproblemov. } if amaxl < amaxd then amax := amaxd else amax := amaxl; if aminl < amimd then amin := aminl else amin := amind; end end. J.Kozak: PSA II, 2010-2011 18 / 75

Časovna zahtevnost rešitve z deli in vladaj J.Kozak: PSA II, 2010-2011 19 / 75 Izračunajmo še časovno zahtevnost algoritma. Ker štejemo le primerjave med elementi zaporedja, zanjo ugotovimo 0, n = 1, T (n) = 1, n = 2, T ( n 2 ) + T ( n 2 ), n > 2. Odtod, za n = 2 k, ( ) n T (n) = 2T + 2 2 ( ( ) ) n = 2 2T 2 2 + 2 + 2 k 1 = 2 k 1 T (2) + 2 i = 2 k 1 + 2 k 2 = 3 2 (n 1) 1 2 i=1

Urejanje (z deli in vladaj) J.Kozak: PSA II, 2010-2011 20 / 75 Urejanje je eden od praktično pomembnih praktičnih problemov, zato poznamo vrsto različnih rešitev. A vse lahko razumemo uporabo metode deli in vladaj pri reševanju tega problema. Praktične programske rešitve pogosto uporabljajo to metodo v več korakih, odvisno od velikosti problema. Osnovna delitev algoritmov Urejanje s primerjavami. Algoritmi te vrste urejajo podatke A U z uporabo primerjav a b, a, b A. Urejanje po distribuciji. Algoritmi te vrste urejajo podatke A U s pomočjo preslikav f : U IN, ki jih uporabimo za določanje vrstnega reda v A. Pri izbiri konkretnih algoritmov kot običajno tehtamo velikost in naravo množice A zahtevnost ključnih korakov v urejanju in v dostopu do podatkov v A

Splošno o časovni zahtevnosti urejanja Naj bo A, n := A, množica podatkov, ki jo urejamo. O časovni zahtevnosti urejanja A povejmo: T B (n) = Θ (n) neodvisno od metode urejanja, T W (n) = Ω (n log n) za urejanje s primerjavami, kar določa spodnjo mejo tega razreda postopkov, nekateri algoritmi urejanja s primerjavami so optimalnega reda, T (n) = Θ (n log n) (urejanje z zlivanjem, urejanje s kopico), nekateri algoritmi urejanja s primerjavami so kvadratično zahtevni, T (n) = Θ ( n 2) (urejanje z izbiranjem), nekateri algoritmi urejanja s primerjavami so v najslabšem primeru kvadratično zahtevni, T W (n) = Θ ( n 2) (hitro urejanje), a v povprečju T E (n) = Θ (n log n), za urejanja po distribuciji je velja T E (n) = Θ (n) ali celo T (n) = Θ (n). Seveda pri tem ta urejanja postavijo določen zahteve podatkom, ki jih urejajo. Dokažimo drugo alineo. J.Kozak: PSA II, 2010-2011 21 / 75

J.Kozak: PSA II, 2010-2011 22 / 75 Izrek Vsak algoritem, ki uredi podatke A U, A = n s primerjavami, zahteva vsaj T W (n) = Ω (n log n) primerjav. Dokaz. Predpostavimo lahko, da so podatki v A različni. Primerjava a b, a, b A ima dva izzida, resnično in neresnično. Odločanja katerega koli algoritma lahko interpretiramo kot pot v dvojiškem odločitvenem drevesu. Notranje vozlišče v tem drevesu vsebuje primerjavo a b, levi in desni sin, če nista lista, pripadata obema izzidoma. V listih mora biti vrstni red podatkov kot rezultat primerjav na poti od korena natanko določen. Listov je n! e (n+ 1 2) ln n n+ln 2π = Ω (n log n) po Stirlingovem obrazcu. Izrek je dokazan.

Urejanje s primerjavami J.Kozak: PSA II, 2010-2011 23 / 75 Urejamo zaporedje a 1, a 2,..., a n. Poenostavimo razlago z zahtevo, da deli deli na dva dela. Pomembni koraki: kdaj je problem tako majhen, da ga rešimo in kako ga rešimo, kako delimo, kako zapleten je deli, kako združujemo, kako zapleten je združi. Preprosta algoritma urejanje z izbiranjem: delimo v urejeni in neurejeni del zaporedja, združi ni potreben, T (n) = Θ ( n 2). urejanje z vrivanjem: delimo v urejeni in neurejeni del zaporedja, T B (n) = Θ (n), T W (n) = Θ ( n 2). Zelo primeren algoritem za urejanje majhnih zaporedij (npr. n {0, 1,..., 12}) in zaporedij, ki so v glavnem že urejena, a imajo majhna podzaporedja velikosti n 12 še lokalno neurejena.

Urejanje z izbiranjem procedure urejanjezizbiranjem(a, n); { Uredi zaporedje a i, i = 1, 2,..., n na mestu z izbiranjem v nepadajočem vrstnem redu. } begin for i := 1 to n 1 do begin { V zaporedju a j, j = 1, 2,..., i 1 je že urejenih i 1 najmanjših elementov zaporedja. Na i-to mesto pride i-ti najmanjši. } element := a i ; ind := i; for j := i + 1 to n do if a j < a ind then ind := j; a i := a ind ; a ind := element; end end. J.Kozak: PSA II, 2010-2011 24 / 75

Urejanje z vrivanjem procedure urejanjezvrivanjem(a, n); { Procedura uredi zaporedje a i, i = 1, 2,..., n na mestu z vstavljanjem. } begin a 0 := ; { Stražar.} for i := 2 to n do begin { Del zaporedja a k, k = 1, 2,..., i 1 je že urejen. } j := i 1; element := a j+1 ; { Izpraznimo (j + 1)-vo mesto. } while element < a j do begin { Element sodi levo od j-tega mesta } a j+1 := a j ; j := j 1; end ; a j+1 := element end end. J.Kozak: PSA II, 2010-2011 25 / 75

J.Kozak: PSA II, 2010-2011 26 / 75 Najpomembnejši algoritmi urejanje s kopico: delimo v neurejeni del, organiziran v kopico in urejeni del zaporedja. Združi ni potreben. Algoritem je optimalnega reda, T W (n) = Θ (n log n). urejanje z zlivanjem: delimo preprosto, glavni del je operacija združi. Je optimalni algoritem urejanja, T (n) = Θ (n log n). hitro urejanje: delimo tako, da operacija združi ni potrebna. Ni optimalni algoritem urejanja, T W (n) = Θ ( n 2), T E (n) = Θ (n log n), a se smatra za najučinkovitejši postopek urejanja zmerno velikih zaporedij.

Urejanje z zlivanjem procedure uredizzlivanjem(a, dno, vrh); { Procedura uredi z zlivanjem elemente a i, i = dno, dno + 1,..., vrh v nepadajočem vrstnem redu. Rezultat prekrije podatke a na mestu. } begin if dno < vrh then begin { Predpostavimo, da problem ni majhen, če je urejati potrebno. } ; { Deli. } s := dno+vrh 2 uredizzlivanjem(a, dno, s); uredizzlivanjem(a, s + 1, vrh); zlij(a, dno, s, vrh); { Združi rešitvi podproblemov. } end end. J.Kozak: PSA II, 2010-2011 27 / 75

procedure zlij(a, dno, s, vrh); { Združi urejeni podzaporedji a i, i = dno, dno + 1,..., s in a i, i = s + 1, s + 2,..., vrh v urejeno zaporedje a i, i = dno, dno + 1,..., vrh. } begin { Preložimo urejeni podzaporedji iz a v b in c. } n 1 := s dno + 1; n 2 := vrh s; for i := 1 to n 1 do b i := a dno+i 1 ; for i := 1 to n 2 do c i := a s+i ; b n1 +1 := ; c n2 +1 := ; { Stražarja. } { Zlijemo urejeni četi v skupno zaporedje na mestu. } i := 1; j := 1; for k := dno to vrh do if b i c j then begin a k := b i ; i := i + 1 end else begin a k := c j ; j := j + 1 end; end. J.Kozak: PSA II, 2010-2011 28 / 75

Nekaj ugotovitev o urejanju z zlivanjem J.Kozak: PSA II, 2010-2011 29 / 75 Časovno zahtevnost urejanja z zlivanjem, kot smo ga predstavili, da osnovni izrek: rešiti je potrebno a = 2 podproblema polovične velikosti (c = 2), deli je konstantne in združi linearne časovne zahtevnosti (b 0, r = 1). Torej T (n) = Θ (n log n). Algoritem zlij zahteva dodatni prostor. V splošnem torej potrebujemo Θ (n) dodatnega delovnega prostora. Pri zlivanju podatke potrebujemo po vrsti, ne pa naključno v odvisnosti od danega indeksa. Pri nekaterih vrstah zunanjega pomnilnika je to pomembna lastnost in hkrati prednost urejanja z zlivanjem. Preprosto razširimo delitev iz dveh na več delov, pet, sedem, devet. Takšne delitve so bile običajne npr. pri urejanjih, ki so kot zunanji pomnilnik uporabljala magnetni trak.

Hitro urejanje procedure hitrouredi(a, dno, vrh); { Procedura uredi zaporedje a i, i = dno, dno + 1,..., vrh, v nepadajočem vrstnem redu s hitrim urejanjem. Razmeščanje opravi procedura deli. Za vrednost (ali stražarja) a vrh+1 mora ob klicu veljati a vrh+1 a i, i = dno, dno + 1,..., vrh. } begin if dno < vrh then begin { Problem ni majhen, če je treba urejati. } deli(a, dno, vrh, s); { Reši podproblema, združi ni potreben. } hitrouredi(a, dno, s 1); hitrouredi(a, s + 1, vrh) end end. J.Kozak: PSA II, 2010-2011 30 / 75

J.Kozak: PSA II, 2010-2011 31 / 75 procedure deli(a, dno, vrh, s); { Procedura na mestu preuredi zaporedje a i, i = dno, dno + 1,..., vrh, dno < vrh, v odvisnosti od delilnega elementa ω := a dno v a i ω, i = dno, dno + 1,..., s 1, a i ω, i = s, s + 1,..., vrh. Za stražarja a vrh+1 mora ob klicu veljati a vrh+1 ω. } begin { Element, okoli katerega razmeščamo zaporedje a. } ω := a dno ; { Z indeksoma i in s pregledujemo zaporedje z leve in desne. } i := dno; s := vrh + 1;

repeat { Pregledujemo zaporedje z leve v desno, dokler ne najdemo elementa, ki sodi desno od ω. } repeat i := i + 1 until a i ω; { Pregledujemo zaporedje z desne v levo, dokler ne najdemo elementa, ki sodi levo od ω. } repeat s := s 1 until a s ω; if i < s then begin { Elementa zamenjamo, ker se i in s še nista prekrižala. } b := a i ; a i := a s ; a s := b; end; until i s; { Indeksa sta prekrižana. Vstavimo delilni element. } a dno := a s ; a s := ω; end. J.Kozak: PSA II, 2010-2011 32 / 75

Nekaj ugotovitev o hitrem urejanju Časovno zahtevnost hitrega urejanja v najboljšem primeru, da osnovni izrek. V najboljšem primeru deli deli vseskozi na pol. Torej je potrebno rešiti a = 2 podproblema polovične velikosti (c = 2), deli je linearne časovne zahtevnosti (b 0, r = 1) in zato T B (n) = Θ (n log n). Časovna zahtevnost v najslabšem primeru je T W (n) = Θ ( n 2). Ne glede na to, kako izbiramo delilni podatek, obstaja primer podatkov, ki zahteva kvadratično število primerjav. Časovna zahtevnost v pričakovanem primeru je T E (n) = Θ (n log n), če so vsi vrstni redi enako verjetni. Algoritem potrebuje le O (log n) dodatnega prostora za sklad rekurzije, a se ga da sprogramirati tudi brez tega. Urejanje majhnih podzaporedij, npr. velikosti n {1,..., 12} pri hitrem urejanju preskočimo in kasneje uredimo s preprostejšim postopkom, npr. z urejanjem z vrivanjem. Delilni podatek izbiramo tudi na druge načine, npr. kot srednjega med prvim, drugim in zadnjim podatkom ipd. J.Kozak: PSA II, 2010-2011 33 / 75

Časovna zahtevnost hitrega urejanja Naj bo zaporedje, ki ga urejamo, veliko n in v časovno zahtevnost štejmo le primerjave med podatki, ki jih urejamo. Ključni deli urejanja opravi procedura deli, ki vrne s kot indeks elementa, ki deli zaporedji. Klic deli zahteva n + 1 primerjav. Indeks delilnega elementa je odvisen od podatkov, torej slučajna spremenljivka S, z možnimi izzidi (S = s), s = 1, 2,..., n. V najslabšem primeru se zgodi dogodek (S = s) pri tistem s, ki časovno zahtevnost maksimizira. Torej velja T W (n) = n + 1 + max 1 s n (T W (s 1) + T W (n s)). Uganemo, da velja T W (n) konst n 2, konst > 0, za neko konstanto. Za n = 2 to velja, če izberemo konst = T W (2). J.Kozak: PSA II, 2010-2011 34 / 75

J.Kozak: PSA II, 2010-2011 35 / 75 Naj velja za zaporedja, velika r < n. Pokažimo, da velja tudi za zaporedja dolžine n: T W (n) = n + 1 + max (T W (s 1) + T W (n s)) 1 s n ( n + 1 + konst max (s 1) 2 + (n s) 2) = 1 s n = n + 1 + konst(n 1) 2 = n + 1 + konst n 2 2konstn + konst. ( ) Torej, če izberemo na začetku konst max T W (2), 1 2, trditev velja: T W (n) = O ( n 2). Da velja v resnici T W (n) = Θ ( n 2), sledi, če vodimo izbiro z dogodki (S = 1). Za pričakovan primer predpostavimo, da so vsi izzidi enako verjetni, torej P(S = s) = 1, s = 1, 2,..., n. n

Torej je n T E (n) = P(S = s)e (T (n)/s = s)) = s=1 = 1 n E (T (n)/s = s). n s=1 Da uredimo zaporedje n podatkov pri pogoju (S = s) v pričakovanem času, potrebujemo E (T (n)/s = s) = n + 1 + T E (s 1) + T E (n s) primerjav. To skupno da T E (n) = n + 1 + 1 n (T E (s 1) + T E (n s)) n s=1 = n + 1 + 2 n T E (s 1), n s=1 kjer velja na začetku T E (0) = T E (1) = 0. J.Kozak: PSA II, 2010-2011 36 / 75

Enačbo n 2 T n(n + 1) n E (n) = + T E (s 1) 2 s=1 zapišimo še za n := n 1 in ju odštejmo. Dobimo in Iz ocene n 2 T n(n + 1) (n 1)n E (n) = + n + 1 2 2 2 T E (n 1) 1 n + 1 T E (n) = 2 n + 1 + 1 n T E (n 1) = n+1 s=3 = 2 n + 1 + 2 n + + 2 3 + T E (1) 2 1 j n+1 2 1 dx = ln(n + 1) ln 2 x končno dobimo ( ) n + 1 T E (n) 2(n + 1) ln = Θ (n log n). 2 n+1 1 = 2 s. s=3 J.Kozak: PSA II, 2010-2011 37 / 75

urejanje po distribuciji J.Kozak: PSA II, 2010-2011 38 / 75 Urejanje po distribuciji uporabi vrednost podatka, ki ga razvrščamo, za določanje vrstnega reda. Nekaj primerov Urejanje celih števil iz danega intervala s preštevanjem Urejanje realnih števil, za katera poznamo porazdelitev Urejanje po osnovi Urejanje s košarami

J.Kozak: PSA II, 2010-2011 39 / 75 procedure Urejanjespreštevanjem(a, n, k, b); { Procedura uredi zaporedje celih števil a[i] [0, k], i = 1, 2,..., n, s preštevanjem. Rezultat vrne v tabeli b[i] [0, k], i = 1, 2,..., n. } begin { Pripravimo pomožno tabelo c[0 : k] za preštevanje. } for i := 0 to k do c[i] := 0; { Preštejemo, kolikokrat 0 j k nastopa v a. } for i := 1 to n do c[a[i]] := c[a[i]] + 1;

J.Kozak: PSA II, 2010-2011 40 / 75 { Določimo c[i] = {j; 0 j i}. } for i := 1 to k do c[i] := c[i] + c[i 1]; { Prepišemo a v b v pravem vrstnem redu. } for i := n downto 1 do begin b[c[a[i]]] := a[i]; c[a[i]] := c[a[i]] 1; end end.

procedure Urejanjepoosnovi(a, n, d); { Procedura uredi zaporedje d-mestnih celih števil a[i], i = 1, 2,..., n. } begin for i := d downto 1 do Stabilnouredi(a, n, i); end. J.Kozak: PSA II, 2010-2011 41 / 75 Lastnosti urejanja s preštevanjem T (n) = Θ (k + n), torej za k = O (n) je T (n) = Θ (n) je stabilno, podatke z enako vrednostjo ohrani v prvotnem vrstnem redu Urejanje po osnovi. Urejanje po osnovi so uporabljale sortirke za razvrščanje papirnatih kartic. Stolpce (80-kolonskih) kartic lahko interpretiramo kot zaporedje števk v b-tiškem zapisu števil. Urejamo (z obvezno stabilnim algoritmom) najprej po najmanj pomembni števki, nato po naslednji najmanj pomembni ipd.

Urejanje s košarami procedure Urejanjeskošarami(a, n); { Procedura uredi zaporedje pozitivnih realnih števil 0 a i < 1, i = 1, 2,..., n, s košarami. } begin for j := 0 to n 1 do q[j] := Pripravi; { Razmečemo podatke po košarah. } for i := 1 to n do vstavi(q[ n a i ], a i ); { Zberemo košare. } i := 1; for j := 0 to n 1 do while not prazna(q[j]) do begin briši(q[j], a i ); i := i + 1; end; Uredizvrivanjem(a, n); end. J.Kozak: PSA II, 2010-2011 42 / 75

Časovna zahtevnost urejanja s košarami J.Kozak: PSA II, 2010-2011 43 / 75 Izrek Če so števila a i, i = 1, 2,..., n, enakomerno porazdeljena na [0, 1), je pričakovana časovna zahtevnost urejanja s košarami linearna.

Iskanje k-tega najmanjšega elementa procedure izberi(n, a, k); { Procedura poišče po velikosti k-ti element v zaporedju a i, i = 1, 2,..., n tako, da na mestu preuredi a v novo zaporedje a, a i a k, i = 1, 2,..., k 1, a k a i, i = k + 1, k + 2,... n. } begin dno := 1; vrh := n; r := k; a n+1 := ; { Stražar! } loop deli(a, dno, vrh, s); case s = r : exit(loop); s > r : vrh := s 1; s < r : begin dno := s + 1; r := r s end; end; forever end. J.Kozak: PSA II, 2010-2011 44 / 75

Časovna zahtevnost iskanja k-tega najmanjšega elementa J.Kozak: PSA II, 2010-2011 45 / 75 Izrek Za časovno zahtevnost izberi velja T W (k; n) = Θ ( n 2) Pri predpostavki, da deli enako verjetno vrne katerikoli delilni indeks s, je max 1 k n T E (k; n) = Θ (n). Dokaz. Dokažimo le drugo alineo. Podobno kot v analizi hitrega urejanja predpostavimo P(S = s) = 1, s = 1, 2,..., n. n Torej je T E (k; n) = Θ (n) + 1 k 1 T E (k s; n s) + n s=1 n s=k+1 T E (k; s 1).

J.Kozak: PSA II, 2010-2011 46 / 75 Vpeljimo T E (n) := max 1 k n T E (k; n), c : Θ (n) cn, in dobimo T E (k; n) cn + 1 n max torej cn + 1 n max T E (n) cn + 1 n max k 1 1 k n s=1 k 1 1 k n s=1 k 1 1 k n s=1 T E (k s; n s) + T E (n s) + T E (n s) + n s=k+1 s=k+1 n T E (k; s 1) s=k+1 T E (s 1), n T E (s 1). Trdimo T E (n) dn, d := max{t E (1), 4c}.

J.Kozak: PSA II, 2010-2011 47 / 75 Za n = 1 to drži. Naj velja za vse r < n. Pokažimo, da velja tudi za r = n, T E (n) cn + d k 1 n max n (n s) + (s 1) 1 k n s=1 s=k+1 cn + d ( 1 n max 1 k n 2 (k 1)(2n k) + 1 ) 2 (n k)(n + k 1) = cn + d ((k n max 1)(n k) + 1 ) 1 k n 2 (n 1)n cn + d 1 (n 1)(3n 1) ( n 4 n d 4 + 1 ) 4n (n 1)(3n 1) dn.

Strassenovo množenje matrik J.Kozak: PSA II, 2010-2011 48 / 75 Zmnoži 2617 in 5476! Običajna metoda je izpeljana po strategiji deli in vladaj, a je očitno T (n) = Θ ( n 2), 2617 * 5476 13085 10468 18319 15702 14330692 Deli deli na preveč različno velike probleme: enomestno števko in preostali del števila. Poizkusimo z metodo deli in vladaj, a to pot z deljenjem na pol, Ker ne gre z velikimi števili, jih razpolovimo: 2617 5476 = (2600 5400) + (2600 76 + 17 5400) + (17 56) = (26 54) 10 4 + (26 76 + 17 54) 10 2 + (17 56).

J.Kozak: PSA II, 2010-2011 49 / 75 Če vsakega od produktov računamo zase, ne bomo ničesar pridobili. Toda (a + b) (c + d) = a c + (a d + b c) + b d in dovolj nam je izračunati le tri produkte in od tod 26 54, 17 76, 43 130, (26 76 + 17 54) = 43 130 26 54 17 76. Razen zadnjega produkta, kjer lahko seštevanje dveh dvomestnih števil da tromestno, imajo faktorji v novih iskanih produktih polovično število decimalk. Pravzaprav velja tako razumeti tudi zadnji produkt. Ker je vodilna, presežna decimalka, kvečjemu 1, množenje z njo opravimo posebej. V gornjem primeru bo to takole 43 130 = 4300 + 43 30.

J.Kozak: PSA II, 2010-2011 50 / 75 Za časovno zahtevnost ugotovimo deli je preprost, rešiti je treba tri podprobleme polovične velikosti, združi zahteva konstatno mnogo seštevanj n 2 velikih podproblemov, { b, n = 1, T (n) = 3T ( ) n 2 + bn, n > 1. Torej Karatsuba algoritem (po avtorju) zahteva ( T (n) = Θ n log 3) ( 2 Θ n 1.59) operacij.

Množenje celih števil po metodi deli in vladaj J.Kozak: PSA II, 2010-2011 51 / 75 procedure zmnoži(x, y, n, b, p); { Zmnoži dve n mestni števili x in y v bazi b v 2n mestno število p v isti bazi. Po privzetku je število števk potenca števila 2, torej n = 2 k, k IN } begin if n = 1 then p := x y { Tu množimo enomestna števila. } else begin { Deli : vodilnih pol števk posebej, drugih pol posebej. } pol := b n 2 ; xv := x div pol; xp := x mod pol; yv := y div pol; yp := y mod pol; vv := (xv + yv) div pol; vp := (xv + yv) mod pol; pv := (xp + yp) div pol; pp := (xp + yp) mod pol;

{ Reši podprobleme. } zmnoži(xv, yv, n 2, b, xyv); zmnoži(xp, yp, n 2, b, xyp); zmnoži(vp, pp, n 2, b, vpp); { Dodaj produktu v p sumande, ki jih prinese množenje s premikom. } if (vv 0) and (pv 0) then vpp := vpp + b; if vv 0 then vpp := vpp + pp pol; if pv 0 then vpp := vpp + vp pol; { Določi pravo vrednost mešanega člena. } vpp := vpp xyv xyp; { Združi. } p := xyv pol 2 + vpp pol + xyp end end. J.Kozak: PSA II, 2010-2011 52 / 75

Strassenovo množenje matrik Vzemimo matriki B := (b ij ) n i,j=1, C := (c ij) n i,j=1 IRn,n. Običajno množenje ( n A = BC = k=1 b ik c kj)n i,j=1 zahteva Θ ( n 3) operacij. Poizkusimo bločno. ( ) ( ) ( ) A11 A A = 12 B11 B, B = 12 C11 C, C = 12. A 21 A 22 B 21 B 22 C 21 C 22 Zapišimo enačbe za bloke produkta A 11 = B 11 C 11 + B 12 C 21 A 12 = B 11 C 12 + B 12 C 22 A 21 = B 21 C 11 + B 22 C 21 A 22 = B 21 C 12 + B 22 C 22 Pri združevanju rešitev podproblemov potrebujemo matrična seštevanja, za A = B + C zahtevnosti Θ ( n 2). J.Kozak: PSA II, 2010-2011 53 / 75

J.Kozak: PSA II, 2010-2011 54 / 75 Če bloke množimo, kot je zapisano, izračun A zahteva osem množenj matrik reda n 2 n 2 in Θ ( n 2) operacij za seštevanje matrik v zduževanju rešitev podproblemov. Torej v konstantah splošnega izreka o zahtevnosti a = 8, c = 2, b > 0, r = 2, q = a c r, ( T (n) = O n log a) ( c = O n log 8) ( 2 = O n 3). Z deli in vladaj nismo uspeli ničesar pridobiti. Očitno moramo prihraniti vsaj eno matrično množenje. Zmnožimo (Strassen) P = (B 11 + B 22 )(C 11 + C 22 ), Q = (B 21 + B 22 )C 11, R = B 11 (C 12 C 22 ), S = B 22 (C 21 C 11 ), T = (B 11 + B 12 )C 22, U = (B 21 B 11 )(C 11 + C 12 ), V = (B 12 B 22 )(C 21 + C 22 ).

J.Kozak: PSA II, 2010-2011 55 / 75 Od tod A 11 = P + S T + V A 12 = R + T A 21 = Q + S A 22 = P + R Q + U. Izračun sedaj zahteva sedem matričnih množenj polovičnega reda, zato pa osemnajst seštevanj. O časovni zahtevnosti odločajo konstante a = 7, c = 2, b > 0, r = 2. To da ( T (n) = Θ n log 7) ( 2 Θ n 2.81).

Nekaj dopolnil Strassenovo matrično ni asimptotično najhitrejše. Poznamo algoritme, ki z zapletenejšim deljenjem še znižajo red zahtevnosti, a so praktično prezapleteni. Pri Strassenovem množenju lahko zaokrožitvene napake odigrajo večjo vlogo kot pri običajnem. Ključna pri praktični izvedbi algoritma je odločitev, pri kateri velikosti matrik preidemo na običajno množenje. Skrbna praktična izvedba tudi ne zahteva toliko dodatnega prostora kot v formalnem opisu algoritma. Algoritem lahko uporabimo tudi v drugih problemih numerične linearne algebre, npr. v iskanju razcepa A = LUP, kjer je P permutacijska matrika (transponirana k matriki zamenjav stolpcev), L spodnja trikotna in U zgornja trikotna. Red časovne zahtevnosti je enak kot pri množenju dveh matrik. Algoritem, ki danes velja za najučikovitejšega pri računanju lastnih vrednosti tridiagonalnih simetričnih matrik, prav tako temelji na deli in vladaj in bločni delitvi. J.Kozak: PSA II, 2010-2011 56 / 75

Hitra diskretna Fourierova transformacija (HFT) Prva motivacija: množenje celih števil. Celo n-mestno število v bazi x ni nič drugega, kot v tej bazi predstavljena vrednost n 1 j=0 a j x j, vrednost polinoma stopnje < n. Produkt dveh števil torej zahteva določitev koeficientov produktnega polinoma, če le zanemarimo prenos, n 1 j=0 n 1 a j x j b k x k = a 0 b 0 + (a 0 b 1 + a 1 b 0 ) x +... k=0 2n 2 l = x l a j b l j. l=0 j=0 kjer smo zaporedji a in b dopolnili z ničlami, ( ) ( a = a 0, a 1,..., a n 1, 0, 0,..., 0, b = }{{} n 1 b 0, b 1,..., b n 1, 0, 0,..., 0 }{{} n 1 J.Kozak: PSA II, 2010-2011 57 / 75 ).

J.Kozak: PSA II, 2010-2011 58 / 75 Zaporedje koeficientov produkta polinomov c := (c l ) 2n 2 l=0, c l := l a j b l j, l = 0, 1,..., 2n 2, j=0 imenujemo konvolucijo zaporedij a in b, v znakih c = a b. Direktni pristop izračuna c zahteva očitno Θ ( n 2) operacij. Se da konvolucijo zaporedij izračunati hitreje?

J.Kozak: PSA II, 2010-2011 59 / 75 Druga motivacija: računanje s krožnimi matrikami. Krožna matrika je matrika, katere elementi se krožno zamikajo v desno, vrstico po vrstico, na primer α 0 α 1 α 2 α 2 α 0 α 1. α 1 α 2 α 0 V splošnem jo določa le n elementov α 0, α 1,..., α n 1. Dogovorimo se, da elemente takšnih matrik štejemo po modulu števila elementov v prvi vrstici. Tako jo lahko zapišemo kot C = C(α) = (α j l ) n 1 l,j=0. Ali lahko matrične operacije s takšnimi posebne vrste matrike opravimo hitreje kot v splošnem primeru?

Primitivni koren enote J.Kozak: PSA II, 2010-2011 60 / 75 Privzemimo, da koeficienti, ki v obeh zgledih nastopajo, pripadajo komutativnem kolobarju K z enoto 1. Elementu ω := ω n K, za katerega velja ω r 1, r = 1, 2,..., n 1, ω n = 1, n IN, pravimo primitivni n-ti koren enote. Najbolj znan nam je seveda primer, ko je Koreni enote n 1 j=0 ω jk n = K = C, ω = ω n = e 2π i n, i := 1. 1, ω, ω 2,..., ω n 1 tvorijo ciklično grupo reda n za množenje, z generatorjem ω. Naj n ne deli k Z. Tedaj je ( ) n ωn k 1 ω k n 1 = (ωn n) k 1 ω k n 1 = 0, ker je ω k n 1.

J.Kozak: PSA II, 2010-2011 61 / 75 Če je k večkratnik n, je n 1 j=0 ω jk n = n 1 j=0 ( ω k n ) n 1 j = 1 = n. j=0 Naj bo n sod, n = 2r, r IN. Tedaj je ω 2 r r-ti primitivni koren enote. Naj bo n = 2r. Izpeljimo ključno lastnost, ki jo pri HFT uporabimo. Iz ( ) 2 ( ωn j = ω 2j n = ωn 2j+n = ωn 2j+2r = ω j+r n ) 2 sledi ( 0 = ω j+r n ) 2 ( ) 2 ( ) ( ) ωn j = ωn j+r ωn j ωn j+r + ωn j. Prvi faktor ne more biti enak 0, saj ω r n 1. Torej mora biti drugi, ker v K ni deliteljev niča. To pomeni ω j+r 2r = ω j 2r.

Diskretna Fourierova transformacija J.Kozak: PSA II, 2010-2011 62 / 75 Naj bo K komutativni kolobar z enoto 1, n IN in ω n K primitivni n-ti koren enote. Vpeljimo diskretno Fourierovo transformacijo F n z F n : K n K n : a = (a k ) n 1 k=0 F n(a) := ( n 1 k=0 a k ω jk n DFT očitno generira množenje vektorja a K n z matriko hkrati pa je tudi ( A n := ω jk n ) n 1 j,k=0, F n(a) = A n a, ) n 1 ( ( )) n 1 n 1 F n (a) = A n a = p ωn j, p(x) := a k x k. j=0 k=0 j=0.

J.Kozak: PSA II, 2010-2011 63 / 75 Matrika A n je Vandermondova matrika, generirana s točkami 1, ω n,..., ω n 1 n, zato lahko najdemo njen inverz v zaključeni obliki, Res, 1 ( n ω kl n ) n 1 A 1 n k,l=0 A n = 1 n = 1 n = 1 n ( n 1 k=0 ( n 1 k=0 ( ω kl n ωn jk ωn kl ω k(j l) n ) n 1. k,l=0 ) n 1 j,l=0 ) n 1 j,l=0 = 1 n (nδ j,l) n 1 j,l=0 = I n.

Uporaba DFT v izračunu konvolucije zaporedij J.Kozak: PSA II, 2010-2011 64 / 75 Pokažimo, da vprašanje učinkovitega računanja konvolucije zaporedij prenesemo na učinkovitost izračuna DFT. Izrek Naj bosta dana vektorja a = (a 0, a 1,..., a n 1 ) K n in b = (b 0, b 1,..., b n 1 ) K n. Tedaj je a b = F 1 m (F m (a) F m (b)), kjer je m 2n 1 in sta vektorja a in b dopolnjena s potrebnim številom ničel. Operator označuje Hadamardovo množenje po istoležnih komponentah. Dokaz. Najprej ugotovimo n 1 n 1 (F m (a) F m (b)) l = j=0 k=0 a j b k ω (j+k)l m, l = 0, 1,..., m 1.

Podobno je (F m (a b) l ) = = m 1 r=0 m 1 j=0 n 1 = j=0 ω rl m m 1 a j r=j m 1 j a j k=0 r a j b r j = j=0 n 1 b r j ωm rl = b k ω (j+k)l m, j=0 m 1 a j r=j b r j ω rl m kjer smo v zadnji vrstici vpeljali sumacijski indeks k := r j. Toda m 1 j 2n 2 j 2n 2 (n 1) = n 1. Ker je b k = 0, k n, lahko zadnjo vsoto zapišemo tudi kot kar smo hoteli pokazati. n 1 n 1 j=0 k=0 a j b k ω (j+k)l m J.Kozak: PSA II, 2010-2011 65 / 75

Uporaba DFT v delu s krožnimi matrikami J.Kozak: PSA II, 2010-2011 66 / 75 Pokažimo, da vprašanje učinkovitega računanja s krožnimi matrikami prenesemo na učinkovitost izračuna DFT. Izrek Naj bo C(α) krožna matrika, določena s prvo vrstico α = (α 0, α 1,..., α n 1 ), α i K. Matriko C(α) se da diagonalizirati in velja C(α) = A n Λ(α)A 1 n, kjer je ( A n = ω jk n ) n 1 j,k=0, Λ(α) = diag n 1 j=0 α j ω jk n n 1 k=0.

J.Kozak: PSA II, 2010-2011 67 / 75 Dokaz. Produkt l-te vrstice C(α) s k-tim stolpcem A n da n 1 n 1 (C(α)) l (A n ) k = α j l ω jk = ω lk α j l ω (j l)k = j=0 l 1 = ω lk = ω lk = ω lk = ω lk torej C(α)A n = A n Λ(α). j=0 l 1 j=0 n 1 j=n l n 1 j=0 j=0 n 1 α j l ω (j l)k + j=l n 1 l α n+j l ω (n+j l)k + n 1 l α j ω jk + α j ω jk, j=0 α j l ω (j l)k = j=0 α j ω jk = α j ω jk =

J.Kozak: PSA II, 2010-2011 68 / 75 S cirkularnimi matrikami znamo učinkovito računati, če vemo, kako učinkovito množiti z matriko A n, ali drugače povedano, če znamo učinkovito izračunati vrednost polinoma p(x) = a 0 + a 1 x + + a n 1 x n 1 pri n argumentih, korenih enote ωn, j j = 0, 1,..., n 1. Naj bo n = 2r sod. Izkoristimo ω j+r 2r = ω j 2r in delimo polinom na sode in lihe potence, p 1 (x) = a 1 + a 3 x + + a n 1 x r 1, p 2 (x) = a 0 + a 2 x + + a n 2 x r 1, kar da p(x) = xp 1 ( x 2) + p 2 (x 2).

J.Kozak: PSA II, 2010-2011 69 / 75 Odtod ( p ( p ωn k ) ω k+r n ) = ω k np 1 ( ω 2k n = ω k+r n p 1 ( = ω k np 1 ( ) ( ) + p 2 ωn 2k, k = 0, 1,..., r 1, ) ( ) n + p 2 ωn 2k+2r = ) ( ) + p 2, k = 0, 1,..., r 1. ω 2k+2r ωn 2k ω 2k n

Rekurzivna verzija HFT J.Kozak: PSA II, 2010-2011 70 / 75 procedure hft(n, a, ω n, v); { Procedura izračuna vrednosti v := (v j ) n 1 j=0 polinoma p(x) = a 0 + a 1 x +... + a n 1 x n 1 s koeficienti a = (a i ) n 1 ( ) i=0 v točkah ωj n, v j := p ωn j, j = 0, 1,..., n 1, kjer je ω n = e 2π i n n-ti primitivni koren enote in n potenca števila 2, n = 2 k, k IN 0. } begin if n = 1 then v 0 := a 0 { Problem je majhen. } else begin { Deli na podproblema. } n r := ; 2

for i := n 2 downto 0 step 2 do begin b i 2 := a i; c i 2 := a i+1; end ; { Reši podproblema. } hft(r, b, ωn, 2 vb); hft(r, c, ωn, 2 vc); { Združi rešitvi. } w := 1; for j := 0 to r 1 do begin wvcj := w vc j ; v j := vb j + wvcj; v j+r := vb j wvcj; w := w ω n ; end end end. J.Kozak: PSA II, 2010-2011 71 / 75

Iterativna verzija HFT procedure hftiterativno(n, a, v); { Procedura izračuna vrednosti v := (v j ) n 1 j=0 polinoma p(x) = a 0 + a 1 x +... + a n 1 x n 1 s koeficienti a = (a i ) n 1 ( ) i=0 v točkah ωj n, v j := p ωn j, j = 0, 1,..., n 1, kjer je ω n = e 2π i n n-ti primitivni koren enote in n potenca števila 2, n = 2 k, k IN 0. } begin PrepišiVSodoLihiRedPoBitih(a, v); h := n + 1; m := 1; for nivo := h 1 downto 1 do begin m := 2m; ω m := e 2π i m ; J.Kozak: PSA II, 2010-2011 72 / 75

J.Kozak: PSA II, 2010-2011 73 / 75 for k := 0 to n 1 step m do begin w := 1; for j := 0 to m 2 1 do begin wb := v k+j ; wc := w v k+j+ m 2 ; v k+j := wb + wc; v k+j+ m 2 w := w ω m ; end end end end. := wb wc;

J.Kozak: PSA II, 2010-2011 74 / 75 procedure PrepišiVSodoLihiRedPoBitih(n, a, v); { Procedura prepiše zaporedje a := (a j ) n 1 j=0 v v zaporedje v := (v j ) n 1 j=0, ki je permutacija prvotnega, razvrščena po sodo-lihem vrstnem redu po bitih v izražavi indeksa, štetih od najmanj pomembnega k najpomembnejšemu (bit-reversal permutation). } begin for k := 0 to n 1 do begin j := ObrniBite(k); v j := a k end end.

Časovna zahtevnost HFT J.Kozak: PSA II, 2010-2011 75 / 75 Izrek Časovna zahtevnost algoritmov hft in hftiterativno je T (n) = Θ (n log n). Dokaz. Za hft so konstante v osnovnem izreku a = 2, c = 2, b > 0, r = 1 in trditev je za hft potrjena. Za iterativno verzijo je zahtevnost klica PrepišiVSodoLihiRedPoBitih očitno O (n log n). Jedro najglobje zanke hftiterativno se opravi 1 nivo=h 1 ( n2 nivo h) 2 (h nivo) 1 = n (h 1) = Θ (n log n). 2