246
OSNOVNI ALGORITMI Boˇ stjan Vilfan 23. januar 2011

OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Embed Size (px)

Citation preview

Page 1: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

OSNOVNI ALGORITMI

Bostjan Vilfan

23. januar 2011

Page 2: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

CIP - Katalozni zapis o publikacijahNarodna in univerzitetna knjiznica, Ljubljana

510.5:5:004.42(075.8)

VILFAN, BostjanOsnovni algoritmi / Bostjan Vilfan- 2. izdaja. - Ljubljana : Fakulteta za racunalnistvo in informatiko, 2002

ISBN 961-6209-13-2

116054784

Copyright c©2002 Zalozba FE in FRI. All rights reserved.Razmnozevanje (tudi fotokopiranje) dela v celoti ali po delihbrez predhodnega dovoljenja Zalozbe FE in FRI prepovedano.

Recenzenta: strokovni – dr. Borut Robic, izr. prof.jezikovni – Alma Korenini, prof.

Zalozila: Fakulteta za racunalnistvo in informatiko, 2002Urednik: mag. Peter Sega

Natisnil: FORMATISK, LjubljanaNaklada: 200 izvodov2. izdaja

Page 3: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Kazalo

PREDGOVOR vii

1 ALGORITMI 11.1 Pojem algoritma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Preverjanje pravilnosti . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.1 Preverjanje pravilnosti s poskusi . . . . . . . . . . . . . . . . . 41.2.2 Logicno dokazovanje pravilnosti . . . . . . . . . . . . . . . . . . 51.2.3 Dokazovanje pravilnosti programov, ki so predstavljeni z dia-

grami poteka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2.4 Dokazovanje pravilnosti programov, ki so zapisani v program-

skem jeziku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.3 Preverjanje ustavljanja . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.4 Poraba casa in prostora . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.4.1 Zapis za asimptoticno rast funkcij . . . . . . . . . . . . . . . . 181.4.2 Cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.4.3 Prostor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

1.5 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 221.6 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2 UREJANJE 252.1 Naloga urejanja in klasifikacija metod urejanja . . . . . . . . . . . . . 252.2 Notranje urejanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.2.1 Navadno vstavljanje . . . . . . . . . . . . . . . . . . . . . . . . 302.2.2 Navadno izbiranje . . . . . . . . . . . . . . . . . . . . . . . . . 342.2.3 Navadne zamenjave . . . . . . . . . . . . . . . . . . . . . . . . 342.2.4 Spodnja meja za cas urejanja tabel . . . . . . . . . . . . . . . . 352.2.5 Shellovo urejanje (izboljsano vstavljanje) . . . . . . . . . . . . 392.2.6 Urejanje s kopico (izboljsano izbiranje) . . . . . . . . . . . . . . 412.2.7 Urejanje s porazdelitvami (izboljsane zamenjave) . . . . . . . . 442.2.8 Primerjava razlicnih metod urejanja . . . . . . . . . . . . . . . 512.2.9 Iskanje k-tega elementa v tabeli . . . . . . . . . . . . . . . . . . 51

2.3 Zunanje urejanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

iii

Page 4: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

iv KAZALO

2.3.1 Navadno zlivanje . . . . . . . . . . . . . . . . . . . . . . . . . . 532.3.2 Naravno, uravnotezeno, dvosmerno zlivanje . . . . . . . . . . . 572.3.3 Naravno, uravnotezeno, vecsmerno zlivanje . . . . . . . . . . . 592.3.4 Polifazno urejanje . . . . . . . . . . . . . . . . . . . . . . . . . 622.3.5 Polifazno urejanje s predurejanjem . . . . . . . . . . . . . . . . 69

2.4 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 752.5 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

3 ALGORITMI Z REKURZIVNIM RAZCEPOM 793.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793.2 Mnozenje matrik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

3.2.1 Metoda S. Winograda . . . . . . . . . . . . . . . . . . . . . . . 803.2.2 Metoda V. Strassena . . . . . . . . . . . . . . . . . . . . . . . . 81

3.3 Diskretna Fourierjeva transformacija in algoritmi zanjo . . . . . . . . . 823.3.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823.3.2 Diskretna Fourierjeva transformacija . . . . . . . . . . . . . . . 823.3.3 Interpretacija DFT s polinomi . . . . . . . . . . . . . . . . . . 843.3.4 Konvolucija polinomov . . . . . . . . . . . . . . . . . . . . . . . 853.3.5 Rekurzivni algoritem za DFT . . . . . . . . . . . . . . . . . . . 893.3.6 Iterativni algoritem za DFT . . . . . . . . . . . . . . . . . . . . 91

3.4 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 983.5 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

4 POZRESNI ALGORITMI 1014.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014.2 Osnovna zgradba pozresnega algoritma . . . . . . . . . . . . . . . . . . 1034.3 Razvrscanje zapisov na magnetnem traku . . . . . . . . . . . . . . . . 1034.4 Razvrscanje poslov v delavnici z enim strojem . . . . . . . . . . . . . . 1054.5 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 1074.6 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

5 PRETOKI IN LINEARNO PROGRAMIRANJE 1115.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115.2 Problem maksimalnega pretoka skozi omrezje . . . . . . . . . . . . . . 111

5.2.1 Definicija problema . . . . . . . . . . . . . . . . . . . . . . . . . 1115.2.2 Algoritem za maksimalni pretok . . . . . . . . . . . . . . . . . 115

5.3 Linearno programiranje . . . . . . . . . . . . . . . . . . . . . . . . . . 1175.3.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175.3.2 Konveksne poliedrske mnozice . . . . . . . . . . . . . . . . . . . 1195.3.3 Maksimum linearne funkcije na konveksni poliedrski

mnozici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215.3.4 Lokalni pogoj za globalni maksimum linearne funkcije na kon-

veksni poliedrski mnozici . . . . . . . . . . . . . . . . . . . . . 1235.3.5 Simpleksni algoritem . . . . . . . . . . . . . . . . . . . . . . . . 125

Page 5: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

KAZALO v

5.4 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 1275.5 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

6 DINAMICNO PROGRAMIRANJE IN NAJCENEJSE POTI 1316.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1316.2 Problem 0-1 nahrbtnika . . . . . . . . . . . . . . . . . . . . . . . . . . 1326.3 Problem najcenejsih poti . . . . . . . . . . . . . . . . . . . . . . . . . . 140

6.3.1 Najcenejse poti med zacetnim vozliscem in vsemi ostalimi . . . 1416.3.2 Najcenejse poti med vsemi pari vozlisc . . . . . . . . . . . . . . 149

6.4 Prevedba 0-1 nahrbtnika na najcenejse poti . . . . . . . . . . . . . . . 1516.5 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 1536.6 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

7 SESTOPANJE 1577.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1577.2 Problem skakacevega obhoda . . . . . . . . . . . . . . . . . . . . . . . 1587.3 Problem osmih dam . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1617.4 Problem trdnih zakonov . . . . . . . . . . . . . . . . . . . . . . . . . . 1647.5 Nacini za omejevanje pretiranega razrascanja iskalnega drevesa . . . . 1667.6 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 1737.7 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

8 ISKANJE PO ZNAKOVNIH ZAPOREDJIH 1778.1 Navadni algoritem za iskanje po znakovnih zaporedjih . . . . . . . . . 1778.2 Knuth-Morris-Prattov algoritem . . . . . . . . . . . . . . . . . . . . . 1788.3 Boyer in Mooreov algoritem . . . . . . . . . . . . . . . . . . . . . . . . 1818.4 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 1858.5 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

9 VZPOREDNI ALGORITMI 1879.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1879.2 Metoda prestavljanja kazalcev . . . . . . . . . . . . . . . . . . . . . . . 1899.3 Asociativni produkt zacetnih elementov seznama . . . . . . . . . . . . 1919.4 Izracun globine vozlisc dvojiskega drevesa . . . . . . . . . . . . . . . . 1939.5 Povzetek osnovnih pojmov . . . . . . . . . . . . . . . . . . . . . . . . . 1959.6 Naloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

A KRATEK PRIROCNIK JEZIKA OBERON-2 197A.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197A.2 Sintaksa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197A.3 Osnovni elementi jezika ter njihova predstavitev . . . . . . . . . . . . . 198A.4 Deklaracije ter pravila o veljavnosti objektov . . . . . . . . . . . . . . 199A.5 Deklaracije konstant . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200A.6 Deklaracije tipov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

Page 6: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

vi KAZALO

A.6.1 Osnovni tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201A.6.2 Tabelaricni tipi . . . . . . . . . . . . . . . . . . . . . . . . . . . 201A.6.3 Tipi zapisov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202A.6.4 Tipi kazalcev . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203A.6.5 Tipi procedur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

A.7 Deklaracije spremenljivk . . . . . . . . . . . . . . . . . . . . . . . . . . 203A.8 Izrazi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

A.8.1 Operandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204A.8.2 Operatorji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

A.9 Stavki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207A.9.1 Prirejanje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207A.9.2 Klici procedur . . . . . . . . . . . . . . . . . . . . . . . . . . . 208A.9.3 Stavcna zaporedja . . . . . . . . . . . . . . . . . . . . . . . . . 208A.9.4 Pogojni stavki . . . . . . . . . . . . . . . . . . . . . . . . . . . 208A.9.5 Izbirni stavek . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209A.9.6 Stavek While . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209A.9.7 Stavek Repeat . . . . . . . . . . . . . . . . . . . . . . . . . . . 209A.9.8 Stavek For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210A.9.9 Stavek Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210A.9.10 Stavka Return ter Exit . . . . . . . . . . . . . . . . . . . . . . . 211A.9.11 Stavek With . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

A.10 Deklaracije procedur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211A.10.1 Formalni paramteri . . . . . . . . . . . . . . . . . . . . . . . . . 212A.10.2 Procedure, ki so pridruzene tipom . . . . . . . . . . . . . . . . 214A.10.3 Vnaprej deklarirane procedure . . . . . . . . . . . . . . . . . . 215

A.11 Moduli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216A.12 Definicije pojmov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

A.12.1 Skladnost seznamov formalnih parametrov . . . . . . . . . . . . 220A.13 Sintaksa jezika Oberon-2 . . . . . . . . . . . . . . . . . . . . . . . . . . 220A.14 Modul SYSTEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

B PREDIKATNI RACUN PRVEGA REDA 225B.1 Dodatni primeri uporabe predikatnega racuna . . . . . . . . . . . . . . 229

Literatura 231

Stvarno kazalo 233

Page 7: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

PREDGOVORPredgovor k prvi izdaji

Pricujoca knjiga vsebuje snov, ki je na dodiplomskem studiju racunalnistva in in-formatike na Fakulteti za racunalnistvo in informatiko Univerze v Ljubljani zajetav predmetu Algoritmi in podatkovne strukture II. Snov obsega nekatere standardnealgoritme, ki jih mora poznati vsak strokovnjak s podrocja racunalnistva, kakor tudinekatere obicajne metode in nacela zasnove algoritmov.

Knjiga se zacne s poglavjem “Algoritmi”, ki je namenjeno osnovnim pojmom terkratkemu pregledu podrocij preverjanja pravilnosti in ustavljanja, kakor tudi oce-njevanja porabe casa in prostora. Sledi poglavje o urejanju, ki obravnava osnovnemetode urejanja tabel in datotek, od ostalih poglavij pa se razlikuje po tem, daje prisoten nekoliko vecji poudarek na tehniki programiranja kot v drugih poglav-jih. Naslednje poglavje je namenjeno metodi rekurzivnega razcepa, obravnava pa dvatipicna problema, ki ju resujemo na ta nacin, in sicer mnozenje matrik po Strassenu inizracun diskretne Fourierjeve transformacije. Posebnost tega poglavja je, da zahtevadoloceno matematicno predizobrazbo (nekaj linearne algebre in nekaj elementarnihdejstev o obicajnih matematicnih strukturah). 4. poglavje obravnava tim. “pozresnometodo” zasnove algoritmov za optimizacijske probleme na primeru dveh enostavnihproblemov. 5. poglavje je namenjeno problemu maksimalnega pretoka skozi omrezjein linearnemu programiranju. Linearno programiranje obravnavamo na poenosta-vljen nacin z namenom, da prikazemo osnovno idejo simpleksnega algoritma in brezobravnave dolocenih zapletov, do katerih lahko pride v prakticnih primerih (npr. de-generiranost matrike problema). Kljub temu pa se tudi v tem poglavju seveda nismomogli izogniti dolocenemu matematicnemu predznanju iz linearne algebre. 6. poglavjeobravnava metodo dinamicnega programiranja na primeru problema 0-1 nahrbtnikain najcenejsih poti v grafu. 7. poglavje je namenjeno sestopanju in tehnikam ome-jevanja velikosti iskalnega drevesa. 8. poglavje obravnava dva ucinkovita algoritmaza iskanje po znakovnih zaporedjih, zadnje, 9. poglavje pa predstavlja kratek uvodv vzporedno racunanje na primeru nekaj tipicnih problemov, ki jih je mozno na tanacin ucinkovito resevati.

Pricujoca knjiga seveda ni nastala iz nic in se naslanja na izredno obsezno inraznoliko literaturo, ki danes pokriva podrocje algoritmov in podatkovnih struktur.Seveda sem nekatera dela veckrat uporabljal in med njimi bi na prvem mestu omenildelo Cormen in dr. [5], ki je zelo izcrpno in pokriva tako rekoc vsa podrocja algo-ritmov in podatkovnih struktur. Ceprav je kot celota nekoliko prezahtevno za nase

vii

Page 8: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

viii PREDGOVOR

potrebe, sem se pri mnogih vprasanjih zgledoval prav po njem. Nadalje bi omenildanes ze klasicno delo Aho in dr. [1], ki je prav tako zelo izcrpno, vendar podobno kotpredhodno delo nekoliko prezahtevno. V poglavju o urejanju kakor tudi pri obrav-navi preverjanja pravilnosti sem se v mnogocem zgledoval po delih Niklausa Wirtha[16, 20], ki so pred casom izsla tudi v domacem prevodu [17, 19]. Seveda se je dodanes nabralo tudi nekaj domace literature in bi lahko omenil poleg ze omenjenihprevodov Wirthovih del se deli Kozak [10] in Kononenko [9].

Na koncu seveda gre zahvala vsem, ki so kakorkoli pripomogli temu, da je delonastalo. Najprej bi omenil vse sodelavce in kolege, ki so s pripombami in nasvetiizboljsali izbiro ali podajanje snovi. Po abecednem redu so to Tomaz Dobravec, ViljanMahnic, Igor Rozanc in Bostjan Slivnik. Nato bi omenil strokovnega in jezikovnegarecenzenta, ki sta s pozornim branjem odkrila marsikateri spodrsljaj in mi z nasvetipomagala, da sem besedilo izboljsal. In koncno (vendar ne nazadnje) gre zahvala zeniMarjetki in najinim otrokom, ki so me podpirali in ustvarili vzdusje, v katerem je delonastajalo.

Ljubljana, januarja 1998 Bostjan Vilfan

Predgovor k drugi izdaji

V drugi izdaji so nastale naslednje spremembe in dopolnitve:

1. Odpravljene so bile tipkarske in druge manjse napake.

2. Odpravljene so bile vse odkrite napake v programih, ki se uporabljajo kot pri-meri.

3. Vec krajsih drugih dopolnitev in izboljsav.

4. V razdelku 2.2.7 je popravljen del, ki se nanasa na spodnjo mejo za cas urejanja.

5. Spremenjen je bil razdelek 3.3.6 o iterativnem algoritmu za diskretno Fourierjevotransformacijo.

6. Pojavil se je nov Dodatek A, ki podaja kratko informacijo o jeziku Oberon-2.

Upam, da bodo nastete dopolnitve ali popravki prispevali k boljsi razumljivostibesedila.

Ljubljana, januarja 2002 Bostjan Vilfan

Predgovor k spletni izdaji

Ucbenik ni vec v uporabi, objavljam pa ga za primer, da bi koga zanimal. Medpripravo za objavo na spletu sem odpravil neke dodatne napake.

Ljubljana, januar 2011 Bostjan Vilfan

Page 9: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 1

ALGORITMI

1.1 Pojem algoritma

Od bralca pricakujemo, da je seznanjen s pojmoma racunalnik in racunalniski programter da je morebiti ze napisal in preizkusil kaksen program.

Ne da bi se spuscali v pretirane formalnosti, definiramo algoritem kot program,ki tece na nekem racunalniku (ki je bodisi resnicen ali namisljen) in na zacetku dobidolocene podatke, na koncu svojega delovanja pa sporoci rezultat . Podatkom algoritmapravimo tudi vhod , rezultatu pa izhod . Pomembno je, da je rezultat pri vseh podatkihnatancno dolocen. Po tem se algoritem razlikuje od splosnejse definicije programa, ozi-roma recepta za izracun, ki ima pri dolocenih vhodih lahko tudi nedefiniran rezultat.

Pomnilnik

Procesor

n− 1

n− 2

...

2

1

0

Slika 1.1: Racunalnik vrsteRAM

Glede na to, da je racunalniskih modelov izredno ve-liko (npr. Turingovi stroji, koncni avtomati, programiv vseh mogocih programskih jezikih . . . ) imamo tudinajrazlicnejse predstavitve algoritmov.

Ker imamo za koncni cilj neka spoznanja o algo-ritmih, ki naj bi bila uporabna v prakticnih primerih,je primerno, da kot osnovo za predstavitev algorit-mov vzamemo stroj, ki je sicer namisljen (abstrak-ten) v pomenu, da predstavlja neko poenostavitev re-snicnih strojev, vendar kljub temu dovolj soroden re-snicnim strojem, da omogoca stvarno razmisljanje. Vteoreticnih raziskavah se je kot taksen stroj uvelja-vil stroj z enakopravnim dosegom do pomnilnika, zakaterega uporabljamo anglesko kratico RAM1. Strojje prikazan na sliki 1.1 in je sestavljen iz procesorja,ki je zmozen izvajanja obicajnih operacij (aritmeticne

1 Kratica za angleski izraz Random Access Machine, ki se vecinoma dobesedno prevaja kot strojz nakljucnim dosegom do pomnilnika, vendar sem na podlagi opisa stroja raje izbral drug izraz.

1

Page 10: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2 POGLAVJE 1. ALGORITMI

operacije, operacije nad biti, operacije, ki preusmerjajo izracun), in pomnilnika, cigarcelice so vse enako dosegljive in lahko vsebujejo podatke poljubne velikosti. Proce-sor izvaja operacije eno za drugo (zaporedno), vsaka operacija pa traja eno casovnoenoto. Poenostavitev stvarnih strojev, ki je prisotna pri stroju RAM, je, da ne vsebujemnogih komponent stvarnih racunalnikov (npr. vhodnih in izhodnih enot) in da neuposteva omejene dolzine njihove pomnilniske besede. Na ta nacin se izogibamo po-drobnostim programiranja vhodnih in izhodnih enot in zanemarjamo probleme, ki sepojavljajo v zvezi z zaokrozitvami stevilcnih kolicin. Ker pa ta vprasanja niso predmetnasega zanimanja, s tem le pridobimo na preglednosti. Ce pri opisovanju algoritmovuporabljamo stroj RAM, lahko precej natancno in stvarno ocenjujemo porabo casa(tako, da stejemo izvrsene ukaze) in prostora za podatke (tako, da ocenjujemo stevilouporabljenih celic pomnilnika), vendar postanejo za nase potrebe opisi algoritmovrazmeroma nepregledni. Zato ponavadi algoritme opisujemo v nekem visjem jeziku insi predstavljamo RAM le kot “ciljni stroj”, v katerega prevajamo opise, ki so zapisaniv visjem jeziku. Torej je vloga stroja RAM le, da nam priklice v spomin osnovnelastnosti algoritmov, ki jih privzemamo pri nasih razmisljanjih: zaporedno izvajanjeukazov in enaka dosegljivost pomnilniskih celic.

V podobnih knjigah, kot je pricujoca, se zelo pogosto uporablja zapis za algoritme,ki je nekoliko prirejen jezik algolskega tipa (npr. Algol, Pascal, Modula-2 ipd.) vsmislu, da se ne drzi strogo jezikovne sintakse, kajti namenjen je cloveskemu bralcu inne izvajanju na racunalniku. V tej knjigi pa bomo glede zapisa algoritmov nekolikoneenotni: v poglavjih, ki so zanimiva s stalisca tehnike programiranja, bomo algoritmepredstavljali kot podrobno zapisane programe v jeziku Oberon-2 (gl. npr. Reiser inWirth [14] ali Mahnic [4]), v drugih pa bomo marsikatero podrobnost programiranjazanemarili. Na sliki 1.2 je do zadnje podrobnosti zapisan algoritem dvojiskega iskanja,ki ga bomo uporabili za prikazovanje nekaterih lastnosti algoritmov in ki vsebuje nekoposebnost glede na obicajno obliko. Zanimiv je zato, ker uporablja pogojni stavek zdvema izidoma primerjanja, ≤, >, namesto obicajnih treh, <,=, >, (gl. tudi Wirth[18, 1. del, 9, str. 38]). Res je, da pri taki obliki lahko pride do odvecnega racunanjav primeru, ko je a[mid] = x v vrstici 12 resnicno (ker se izvajanje zanke nadaljuje dotrenutka, ko vrednost l postane vecja od r, oziroma, ko se vrednost r spusti pod l).Vendar je v povprecju prikazana oblika le hitrejsa, ker vecinoma velja a[mid] 6= x inprihranimo eno primerjanje.

Glede izbire jezika Oberon za predstavitev programov je potrebno priznati, daje bila s stalisca kasnejsega razvoja morda manj utemeljena, kajti jezik se v praksini sirse uveljavil. Vendar, ker ima izredno preprosto zgradbo, menim, da bralcune bo tezko razumeti programov, ki so zapisani z njim, v pomoc pa mu je tudikratek dodatek z opisom jezika (Dodatek A). Vsi programi so preizkuseni s pre-vajalnikom Native XDS-X86[6], na voljo pa so tudi v elektronski obliki na streznikuzaphod.fri.uni-lj.si/~vilfan.

Pricujoca knjiga ima vec ciljev. Prvi je zbrati nekaj koristnih algoritmov, ki jihvsak strokovnjak za racunalnistvo mora poznati. Drugi je opisati najpogostejse pri-jeme, ki jih uporabljamo pri sestavljanju algoritmov. Tretji je seznaniti bralca zosnovnimi pojmi o preverjanju pravilnosti algoritmov in cetrti, ne najmanj pomem-

Page 11: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.1. POJEM ALGORITMA 3

1 PROCEDURE BinSearch(VAR a:ARRAY OF INTEGER;2 x ,n:INTEGER):INTEGER;3 (∗ a je urejena tabela, kjer ima prvi element indeks 1 (element4 a[0] ima nedefinirano vrednost), x je iskani element, n ≥ 0 pa5 stevilo elementov v tabeli; rezultat je indeks iskanega elementa,6 ce je x prisoten v tabeli ali pa negativna vrednost indeksa v7 tabeli, kamor bi x sodil, ce elementa v tabeli ni ∗)8 VAR l ,mid ,r :INTEGER;9 BEGIN l :=1; r :=n;

10 WHILE l<=r DO11 mid :=(l+r)DIV 2;12 IF a[mid ]>x THEN r :=mid−113 ELSE l :=mid+115 END15 END ;16 IF (r>0) & (a[r ]=x ) THEN RETURN r17 ELSE RETURN −l19 END19 END BinSearch;

Slika 1.2: Algoritem dvojiskega iskanja

ben, je prikazati razlicne nacine za ocenjevanje porabe racunskih virov, med katerimista najvaznejsa cas (ki ga nek algoritem porabi) in prostor (spomin, ki ga algoritemskupaj s svojimi podatki zaseda medtem, ko se izvaja).

Preden pa se lotimo vprasanj, ki smo jih pravkar nasteli, moramo opisati pojem,ki nam bo omogocil, da delovanje algoritma analiziramo. Rekli mu bomo sled pro-grama. Le-ta je prirejena nekemu programu in konkretnim vhodnim podatkom, je papreprosto tabela z vrsticami, ki ustrezajo izbranim mestom v programu v casovnihtrenutkih, ki si sledijo, in stolpci, ki vsebujejo vrednosti izbranih spremenljivk. Naprimer sled algoritma s slike 1.2 pri vhodnih podatkih a = (9, 13, 27, 32, 41, 48) inx = 18 je prikazana na sl. 1.3a. V vrsticah so prikazane vrednosti spremenljivk nakoncu vrstic 9, 12, 13 in 16 oziroma 17. Vcasih nas zanima le zaporedje stavkov, kise izvajajo (na primer zato, da prestejemo stevilo stavkov med izracunom). V takemprimeru ima sled eno samo vrednost v vrstici — stevilko vrstice stavka. Vcasih je smi-selno opazovati obnasanje programa pri vec vhodih in namesto zaporedja vrednostiv zaporednih casovnih trenutkih imamo opravka z drevesom sledi. Na primer drevosledi algoritma s slike 1.2 pri vhodnih podatkih a = (9, 13, 27, 32, 41, 48) in x = 18 tera = (9, 13, 27, 32, 41, 48) in x = 41, ko nas zanima le zaporedje stavkov, ki se izvaja,je prikazano na sliki 1.3b. Ce sestavljamo drevo sledi in nas zanima vec podatkov(vrednost vec spremenljivk), vsebuje vsako vozlisce drevesa vse potrebne podatke.

Page 12: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

4 POGLAVJE 1. ALGORITMI

vrstica l mid r9 1 ? 6

12 1 3 213 2 1 213 3 2 217 3 2 2

(a) Sled algoritma dvojiskega iskanja (konecvrstic 9, 12, 13, 16 in 17) pri podatkih a =(9, 13, 27, 32, 41, 48) in x = 18

9

1312

13

13

13

17

12

16

(b) Drevo sledi algoritma dvojiskega iskanja pripodatkih a = (9, 13, 27, 32, 41, 48) in x = 18(leva veja) ter a = (9, 13, 27, 32, 41, 48) in x = 41(desna veja)

Slika 1.3: Sled in drevo sledi.

1 PROCEDURE Multiply(x ,y :INTEGER):INTEGER;2 (∗ x > 0; vrednost je produkt x in y ∗)3 VAR u,z :INTEGER;4 BEGIN z :=0; u:=x ;5 REPEAT z :=z+y ; u:=u−1;6 UNTIL u=0;7 RETURN z8 END Multiply ;

Slika 1.4: Mnozenje dveh stevil

1.2 Preverjanje pravilnosti

Ko smo sestavili algoritem, je naprej potrebno preveriti, ali ima vse zelene lastnosti,med katerimi je osnovna, da algoritem resnicno dela tisto, kar smo si zamislili, ozi-roma, da je pravilen. Za ugotavljanje tega sta se izoblikovala dva splosna pristopa:preverjanje pravilnosti s poskusi na konkretnih podatkih in preverjanje pravilnosti zlogicno analizo.

1.2.1 Preverjanje pravilnosti s poskusi

Ponavadi opravljamo poskuse s programom tako, da sestavljamo sledi delovanja pro-grama pri dolocenih vhodnih podatkih. V tem primeru privzemamo, da “vemo”,kaj mora program poceti in lahko z analizo sledi pri posameznih vhodnih podatkihugotovimo, ali deluje pravilno. Ce sestavimo drevo sledi, lahko naenkrat preverimoalgoritem pri vec vhodnih podatkih. Kot primer lahko rabi sl. 1.3b, kjer smo preverilipravilno delovanje programa pri vhodnih podatkih a = (9, 13, 27, 32, 41, 48) in x = 18

Page 13: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.2. PREVERJANJE PRAVILNOSTI 5

vrstica u z4 4 05 3 75 2 145 1 215 0 287 0 28

Slika 1.5: Sled algoritma za mnozenje pri podatkih x = 4, y = 7

(leva veja) ter x = 41 (desna veja). Zal pa ta metoda kot metoda preverjanja pravil-nosti programa pri vseh vhodih odpove, kadar je moznih izidov pri algoritmu toliko,da njihovo sledenje presega prakticne moznosti. Verjetno je algoritem na sl. 1.2 edenod redkih, ki ga je se mozno popolnoma preveriti (z nekoliko logicnega sklepanja) priprakticnih velikostih problema (gl. nalogo 1). Povsem drugacen problem pa predsta-vlja preverjanje pravilnosti programa za mnozenje dveh stevil, ki je prikazan na sl.1.4. Prikazani program bi bil koristen v primeru, ko imamo racunalnik, ki pozna kotelementarni operaciji samo sestevanje in odstevanje, ne pa mnozenja. Sled algoritma,na podlagi katere sklepamo o njegovi pravilnosti pri podatkih x = 4 in y = 7, je pri-kazana na sl. 1.5. Ce pa bi se hoteli prepricati o njegovi pravilnosti pri vseh moznihparih 16-bitnih stevil x in y, bi morali sestaviti 232 sledi, kar je prakticno nemogoce.Zato je potrebno uporabiti popolnoma drugacen pristop.

1.2.2 Logicno dokazovanje pravilnosti

Ce privzamemo, da ima vsak algoritem nek rezultat, lahko istovetimo nalogo al-goritma z neko zeleno lastnostjo rezultata. Le-to pa lahko opisemo z neko logicnotrditvijo. Ker pa ima tudi sam algoritem (oziroma njegov opis) dolocene lastnosti,lahko poskusamo z logicnim sklepanjem ugotoviti, ali iz lastnosti algoritma nujnosledi zelena lastnost rezultata. Vendar je to misel laze izreci, kot jo uresniciti! Idejalogicnega dokazovanja pravilnosti je, da lastnost rezultata in prav tako lastnosti sa-mega algoritma izrazimo s trditvami (stavki) v nekem jeziku formalne logike in natodokazemo, da iz lastnosti algoritma ter kot posledica ustavitve algoritma nujno sledilastnost rezultata. Ko se strogo drzimo opisane metodologije ali ko za njeno reali-zacijo uporabljamo nek programski pripomocek, uporabljamo za zapisovanje trditev,ki se nanasajo na lastnosti algoritma, dobro znani predikatni racun prvega reda alikaksen drug logicni formalizem. V dodatku B je zbranih nekaj osnovnih dejstev vzvezi s predikatnim racunom prvega reda, ceprav v nadaljevanju uporabljamo le ne-kaj najelementarnejsih. Ce pa tehniko dokazovanja pravilnosti uporabljamo “rocno”,ponavadi uporabljamo obicajno neformalno sklepanje, ki ima prednost, da je pregle-dnejse in bolj jedrnato, vendar je seveda podvrzeno napakam.

Page 14: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6 POGLAVJE 1. ALGORITMI

z := 0u := x

z := z + yu := u− 1

+

u = 0

Vhod

vhodna

podatka:

x, y

rezultat: z

Izhod

(a) Mnozenje dveh stevil

q := 0r := x

q := q + 1r := r − y

+

r ≥ y

Vhod

vhodna

podatka:

x, y

Izhod

rezultat: q, r

(b) Celostevilcno deljenje

Slika 1.6: Dva diagrama poteka

1.2.3 Dokazovanje pravilnosti programov, ki so predstavljeniz diagrami poteka

Prvi primer programskega zapisa, za katerega bomo opisali postopek preverjanja pra-vilnosti, so diagrami poteka. Diagram poteka je usmerjen graf z enim vhodom inmorebiti vec izhodi, ki ima tri vrste vozlisc: ena so pravokotne skatle, ki vsebujejoprirejanja (x := f(. . .)), druga romboidne skatle, ki vsebujejo preizkuse oz. predi-kate (P (x1, x2, . . .)), tretja pa so preprosto stekalisca poti. Vhod v diagram potekanakazemo s puscico, ki nima izvora, izhod pa s puscico, ki nima ponora. Na sliki 1.6vidimo dva primera, ki vsebujeta vse tri vrste vozlisc. Vhodni podatki so vrednostispremenljivk, ki se ne pojavljajo na levih straneh prirejanj, izhodni podatki pa sovrednosti nekaterih izbranih spremenljivk. Za vse spremenljivke privzemamo, da socelostevilcne.

Pri logicnem dokazovanju pravilnosti programov izhajamo iz pogojev, ki jih morajoizpolnjevati vhodni podatki, in lastnosti, ki doloca rezultat izracuna. Na primerprogram na sliki 1.6a je dolocen z vhodnim pogojem, x > 0 ter izhodno lastnostjo,z = x ∗ y, ki sta pripisana tockama “Vhod” in “Izhod”, po vrsti. Podobno je vhodnipogoj programa 1.6b x ≥ 0, y > 0, izhodna lastnost pa x = y · q + r ∧ 0 ≤ r < y.

Pri zapisovanju logicnih trditev, ki ustrezajo tem in podobnim pogojem, se nebomo popolnoma drzali pravil o zapisu predikatnega racuna ali drugih virih, ki soopisana v dodatku B, saj si bralec vedno lahko predstavlja prevod iz nekoliko ohla-pnejsega zapisa v povsem strogi zapis. Predvsem se ne bomo omejevali na logicna

Page 15: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.2. PREVERJANJE PRAVILNOSTI 7

S1 S2 Sn

T

Q1

Q1 ⊃ P∧

Q2

Q2 ⊃ P∧

. . . Qn

...Qn ⊃ P

P

(a) Pravilo

S1 S2

T−10 < x < 0

0 ≤ x < 10

−10 < x < 10

(b) Primer

Slika 1.8: Pravilo za stekalisce poti in primer uporabe

operatorja ⊃ in ¬, temvec bomo uporabljali tiste logicne operatorje, ki so najpri-mernejsi za zapis trditve, ki nas zanima (na primer konjunkcija ∧ in disjunkcija, ∨).Nadalje bomo pogosto nadomestili kaksen simbol z bolj primernim (in morda manjvsiljivim). Na primer znak za konjunkcijo bomo pogosto nadomestili z vejico. Primer:namesto x > 0 ∧ y > 0 bomo pisali x > 0, y > 0. In koncno lahko omenimo, da bomopogosto za logicno implikacijo namesto znaka ⊃ uporabili znak ⇒.

S

P (antecedens)

Q (konsekvens)

Slika 1.7: Logicne trditve pri-rejene nekemu stavku

Postopek dokazovanja pravilnosti pricnemo tako,da vsakemu vozliscu pripisemo nabor trditev, in sicerpo eno vsaki vhodni povezavi in eno izhodni pove-zavi. Trditvam, ki so pripisane vhodnim povezavam,pravimo antecedensi stavka (oziroma skatle), tistim,ki so pripisane izhodnim povezavam, pa pravimo kon-sekvensi stavkov (gl. sliko 1.7). Antecedensi in kon-sekvens morajo biti v povsem doloceni medsebojnizvezi, ki je predpisana z aksiomom, ki pripada vrstivozlisca. Aksiomi za vse nastete vrste vozlisc, kakortudi primeri njihove uporabe, so prikazani na slikah1.8, 1.9 in 1.10.

Aksiom za stekalisce poti [slika 1.8a] zatrjuje, da mora v stekaliscu poti vsakantecedens imeti za posledico konsekvens, kar je tudi razumljivo. Namrec, ce predstekaliscem velja neka trditev, mora veljati tudi po stekaliscu.

Aksiom za pogojni stavek [slika 1.9a] pravi, ce je antecedens pogojnega stavkatrditev P , je konsekvens, ki je pripisan izpolnjenemu pogoju B, P ∧ B (razumljivo,saj v primeru, ko B ne bi bilo resnicno, program ne bi prisel do te tocke), konsekvens,ki je pripisan neizpolnjenemu pogoju B, pa je P ∧ ¬B.

Aksiom za prirejanje [slika 1.10a] predpisuje, da v primeru, ko je konsekvens pri-rejanja trditev P in ko le-ta vsebuje prosto spremenljivko2 x, prirejanje pa ima oblikox := f(. . .), je antecedens prirejanja pridobljen iz konsekvensa tako, da zamenjamo

2Spremenljivka x je prosta v primeru, ko ni v obmocju veljavnosti nekega kvantifikatorja, ∃ ali ∀.

Page 16: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

8 POGLAVJE 1. ALGORITMI

P

B+ −

P ∧BP ∧ ¬B

(a) Pravilo

−10 < x < 10

x < 0+ −

−10 < x < 0 0 ≤ x < 10

(b) Primer

Slika 1.9: Pravilo za pogojni stavek in primer uporabe

v := w

P vw

P

(a) Pravilo

z := x+ y

x+ y = 10

z = 10

(b) Primer

Slika 1.10: Pravilo za prirejanje s primerom

vse proste primerke spremenljivke x z desno stranjo prirejanja. Na ta nacin pri-dobljeni antecedens oznacujemo z P xf(...). Ce nekoliko pomislimo, izraza to pravilonatanko ucinek prirejanja, kajti po prirejanju je povsod mozno desno stran prirejanjanadomestiti z levo stranjo.

Celotni postopek je prikazan na primeru programa za mnozenje dveh stevil (slika1.11). Na tem mestu si bomo omenjeni program nekoliko bolj podrobno ogledaliter izpostavili nekatere znacilnosti. Vhodni pogoj x > 0 nastopa implicitno v vsehtrditvah, ne zapisujemo pa ga zato, ker se spremenljivki x in y med izracunom nespreminjata. Prav tako ne zapisujemo dolocenih ocitnih tavtologij, ki predstavljajoantecedense nekaterih prirejanj (gl. nalogo 2). V edinem stekaliscu poti je eden odantecedensov z = 0, u = x, medtem ko je konsekvens z + u ∗ y = x ∗ y, u > 0. Ocitnoje, da ima resnicnost prve trditve, v povezavi z implicitnim pogojem x > 0, posledicoresnicnost trditve z+u∗y = x∗y, u > 0, kar pa je v skladu z aksiomom za stekalisca.Nadalje, ce antecedens druge skatle s prirejanji, z + u ∗ y = x ∗ y, u > 0, prepisemov obliko z + y + (u − 1) ∗ y = x ∗ y, u − 1 ≥ 0, preverjanje aksioma za prirejanjene predstavlja posebnih tezav. In koncno je negativni izhod iz pogojnega stavka, napodlagi aksioma za pogojni stavek opremljen s trditvijo z+u∗y = x∗y, u ≥ 0, u 6= 0,kar ima zaradi u ≥ 0 na vhodu v pogojno skatlo za posledico z + u ∗ y = x ∗ y, u > 0,kar pa je enako konsekvensu stekalisca. Ker pa vemo, da vedno velja P ⊃ P , smotako preverili, da so aksiomi za posamezne vrste vozlisc povsod veljavni in lahko

Page 17: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.2. PREVERJANJE PRAVILNOSTI 9

z := 0u := x

z := z + yu := u− 1

−u = 0

x > 0

z = 0, u = xz + u ∗ y = x ∗ y, u > 0

z + u ∗ y = x ∗ y, u ≥ 0

z = x ∗ y, u = 0+

Slika 1.11: Program za mnozenje, opremljen s trditvami

zatrjujemo, da je pravilnost programa na sliki 1.11 dokazana.

Na podoben nacin je mozno analizirati program na sliki 1.12 za izracun kvocientain ostanka po deljenju dveh pozitivnih celih stevil.

Osnovni element, ki otezuje dolocanje trditev prirejenih programu, so zanke. Koimamo opravka z linearnim zaporedjem vozlisc (skatel), je obicajno mozno na enosta-ven nacin uporabiti aksiome in dolociti manjkajoce trditve na podlagi bodisi zacetne(vhodne) trditve ali pa koncne (izhodne) trditve. V primeru pa, ko imamo opravkaz zanko, smo pri izbiri trditev omejeni s pogojem, da mora zadnja trditev imeti zalogicno posledico prvo trditev (gl. sliko 1.13). V takem primeru postopamo tako, kotda bi bila pred prvim vozliscem zanka prerezana, in imamo nato opravka z linearnimzaporedjem vozlisc. Ko izberemo trditve za vhode in izhode vseh vozlisc, preverimo,ali velja Cn ⊃ A1. Ce to ne velja, postopek ponovimo. Pri zanki ni mozno dati prepro-stega recepta za izbiro prve trditve, od katere je bistveno odvisna uspesnost postopkageneriranja ostalih trditev v skladu z aksiomi. Prav zaradi potrebe po iznajdljivosti,ki je tu prisotna, je zacetna trditev pri zanki nujni del programove dokumentacije inponavadi bistveno pripomore k njegovi razumljivosti. Tej trditvi, ki je postavljena nazacetek zanke in ki je veljavna ne glede na to, kolikokrat ponovimo izvajanje zankinegajedra, pravimo zancna invarianta.

Na podoben nacin, kot lahko v predikatnem racunu zdruzujemo vec aksiomov vnove trditve s pravili sklepanja, lahko tudi pri preverjanju programov kombiniramoskatle s trditvami v vecje sklope. Primeren zgled so prav zanke. Prikazali bomo dvepravili sklepanja, ki nam omogocata, da pridobimo antecedensa in konsekvensa dvehvrst zank. Prvo se nanasa na zanko vrste WHILE in pravi, da ko je izpolnjen pogojna sliki 1.14a (torej, ko je podan S z antecedensom P ∧ B in konsekvensom P ), je

Page 18: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

10 POGLAVJE 1. ALGORITMI

q := 0r := x

q := q + 1r := r − y

r ≥ y

+

x ≥ 0, y > 0

q = 0, r = x

x = y · q + r,r ≥ 0

x = y · q + r,0 ≤ r < y

x = y · (q + 1) + r − y,r − y ≥ 0

Slika 1.12: Program za deljenje, opremljen s trditvami

S1

Si

Sj

Sn

C1

Ai

CiAjCj

An

Cn

A1

Slika 1.13: Logicne trditve v zanki

mozno sestaviti zanko na sliki 1.14b z zapisanima antecedensom in konsekvensom.

Znacilno za zanko vrste REPEAT (slika 1.15) je, da zahteva dva predpogoja.Namrec zanko REPEAT na sliki 1.15c si lahko predstavljamo, kot da je sestavljena izstavka S, ki mu sledi zanka WHILE (gl. sliko 1.15d). Prav zaradi dveh predpogojev,ki morata biti izpolnjena za pravilno uporabo zanke, je ta zanka tezja za uporabo inbolj podvrzena zlorabam kot zanka vrste WHILE. To trditev potrjujejo tudi empiricneizkusnje.

Page 19: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.2. PREVERJANJE PRAVILNOSTI 11

S

P ∧B

P

(a) Predpogoj

S

B

+

P ∧ ¬B

P

P ∧B

(b) Zanka

Slika 1.14: Zanka vrste WHILE

S

P

Q

(a) Predpogoj 1

S

Q ∧ ¬B

Q

(b) Predpogoj 2

S

B

P

+

Q ∧B

(c) Zanka REPEAT

S

S

¬B

P

Q

+

Q ∧ ¬B Q ∧B

(d) Diagram poteka, ki je ekvivalenten di-agramu na sliki (c)

Slika 1.15: Zanka vrste REPEAT

Page 20: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

12 POGLAVJE 1. ALGORITMI

1.2.4 Dokazovanje pravilnosti programov, ki so zapisani v pro-gramskem jeziku

Tehniko iz prejsnjega odstavka je mozno brez tezav prirediti tudi za programe, kiso napisani v linearnem zapisu, npr. v nekem algolskem jeziku. V tem primeru staantecedens in konsekvens zapisana pred in za vsakim stavkom. Najprimerneje je, dalogicne trditve zapisujemo kot programske komentarje. Pravila, po katerih se mo-rajo ravnati antecedensi in konsekvensi posameznih stavkov, so prikazana v naslednjitabeli:

PRAVILA PREVERJANJA ZA PROGRAME, KI SO ZAPISANI VPROGRAMSKEM JEZIKU

1. Prirejanje

(∗ P vw ∗)v := w(∗ P ∗)

2. Sestavljeni stavekPredpogoja:

(∗ P ∗)S1(∗Q ∗)(∗Q ∗)S2(∗R ∗)

Posledica:

(∗ P ∗)S1;S2(∗R ∗)

3. Pogojna stavkaPredpogoja:

(∗ P ∧B ∗)S1(∗Q ∗)(∗ P ∧ ¬B ∗)S2(∗Q ∗)

Posledica:

(∗ P ∗)IFB THEN S1 ELSE S2 END(∗Q ∗)

Predpogoja:(∗ P ∧B ∗)S(∗Q ∗)(P ∧ ¬B) ⊃ Q

Posledica:

(∗ P ∗)IFB THEN S END(∗Q ∗)

4. ZankePredpogoj:

(∗ P ∧B ∗)S(∗ P ∗)

Posledica:

(∗ P ∗)WHILEB DO S END(∗ P ∧ ¬B ∗)

Page 21: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.2. PREVERJANJE PRAVILNOSTI 13

1 PROCEDURE Multiply(x ,y :INTEGER):INTEGER;2 VAR u,z :INTEGER;3 BEGIN4 (∗ x > 0 ∗)5 z :=0; u:=x ;6 (∗ z=0; u=x ∗)7 (∗ z+u∗y=x∗y , u>0 ∗)8 REPEAT9 z :=z+y ;

10 u:=u−1;11 UNTIL u=0;12 (∗ z=x∗y , u=0 ∗)13 RETURN z14 END Multiply ;

Slika 1.16: Program za mnozenje opremljen s trditvami

Predpogoj:(∗ P ∗)S(∗Q ∗)(∗Q ∧ ¬B ∗)S(∗Q ∗)

Posledica:(∗ P ∗)REPEAT S UNTILB(∗Q ∧B ∗)

5. Izbirni stavekPredpogoj:

(∗ P ∧ (i = Lk) ∗)Sk(∗Q ∗) pri vseh k

Posledica:(∗ P ∗) CASE iOF

L1 : S1 |L2 : S2 |...Ln : Sn

END (∗Q ∗)

Kot primer je na sliki 1.16 prikazan program s slike 1.4, ki je popolnoma opremljen zlogicnimi trditvami za preverjanje. Pri zanki vrste REPEAT sta v vlogi trditev P inQ iz tabele na zacetku tega odstavka trditvi

z + u ∗ y = x ∗ y, u > 0

terz + u ∗ y = x ∗ y, u ≥ 0

Page 22: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

14 POGLAVJE 1. ALGORITMI

(po vrsti).Za prakticne potrebe so mnoge trditve, ki opisujejo lastnosti nekega programa,

odvecne, oziroma samoumevne. Najvaznejse trditve, brez katerih program pogostopostane nerazumljiv, pa so pogoji, ki jih morajo izpolnjevati vhodne kolicine, izhodnatrditev, ki opisuje rezultat, ter zancne invariante. Te trditve naj bi tudi predstavljaleminimalno dokumentacijo, ki jo vsak algoritem ali program potrebuje. Ce se zate-kamo k dokazovanju, pa vecinoma uporabljamo neformalno sklepanje. Kot primerdokazovanja pravilnosti navajamo dokazovanje pravilnosti algoritma dvojiskega iska-nja na sliki 1.2. Vhodne spremenljivke in rezultat so opisani v uvodnem komentarjuin se bomo na tem mestu predvsem ukvarjali z invarianto, ki pripada zanki v vrsticah10–15.

Preden zancno invarianto (ki je postavljena pred vrstico 10) zapisemo, ugotovimo,da za aritmeticno srednjo vrednost mid velja l ≤ mid ≤ r. Zancno invarianto razsta-vimo na 2 disjunktivna clena, n = 0 in n > 0, od katerih slednji razpade na nadaljnjih5 disjunktivnih clenov:

(n = 0) ∧ (l = 1) ∧ (r = 0)∨(n > 0) ∧ [ (l = 1) ∧ (x < a[l]) ∧ (0 ≤ r ≤ n) ∨

(r = n) ∧ (a[r] ≤ x) ∧ (1 ≤ l ≤ n+ 1) ∨(a[l] ≤ x < a[r]) ∨(0 < r < n) ∧ (a[r] ≤ x < a[r + 1]) ∨(1 < l < n+ 1) ∧ (a[l − 1] ≤ x < a[l]) ]

(1.1)

Pred izvajanjem zanke je gotovo resnicen eden izmed 6 pogojev v vrsticah 1–6 v(1.1)3 . Sedaj bomo loceno obravnavali vsakega izmed njih.

1. (n = 0) ∧ (l = 1) ∧ (r = 0). V tem primeru je izstopni pogoj iz zanke ¬l ≤ rtakoj resnicen in se jedro zanke ne izvaja, do izhoda iz procedure pa pride vvrstici 17 z rezultatom −1, kar je pravilno.

2. (l = 1)∧ (x < a[l])∧ (0 ≤ r ≤ n). V tem primeru je pogoj v 12. vrstici resnicenin se vrednost r zmanjsa. Glede na to, da do izvajanja jedra zanke pride lev primeru r ≥ l, l pa ima vrednost 1, je r vedno v mejah 0 ≤ r ≤ n. Pogoj(n > 0) ∧ (l = 1) ∧ (x < a[l]) ∧ (0 ≤ r ≤ n) ostane v veljavi in s tem invarianta.Zato tudi pri nadaljnjih izvajanjih jedra zanke ostane pogoj 2 resnicen in se rzmanjsuje dokler ne doseze vrednosti 0. Takrat pride do izhoda iz zanke. Kerje zato pogoj v vrstici 16 neresnicen, postane v vrstici 17 rezultat −1, kar jepravilno.

3. (r = n) ∧ (a[r] ≤ x) ∧ (1 ≤ l ≤ n + 1). V tem primeru je pogoj v 12. vrsticineresnicen in se vrednost l poveca. Ker do izvajanja jedra zanke pride le vprimeru l ≤ n, ostane l v mejah med 1 in n + 1. Torej ostane pogoj, ki dolocata primer, v veljavi in s tem tudi celotna invarianta. Do izhoda iz zanke pridetakrat, ko postane l = n + 1. Vrednost rezultata postane n (v vrstici 16) vprimeru a[n] = x, sicer pa −n−1 (v vrstici 17), kar je v obeh primerih pravilno.

3Pred prvim izvajanjem celo samo eden od pogojev 1–4.

Page 23: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.3. PREVERJANJE USTAVLJANJA 15

4. (n > 0) ∧ (a[l] ≤ x < a[r]). Primer razpade na nekaj podprimerov:

(a) pogoj iz 12. vrstice je resnicen. Tedaj se zmanjsa r in po tem velja bodisi

i. x < a[r] in imamo zopet opravka s 4. primerom, kar pomeni, da inva-rianta ostane v veljavi ali

ii. 0 < r < n∧a[r] ≤ x < a[r+1], ko nastopi primer 5 (in tudi tedaj inva-rianta ostane v veljavi). Doloceno podrobnost v zvezi s tem primeromobravnava tudi naloga 4a;

(b) pogoj iz vrstice 12 je neresnicen, tedaj se poveca l in velja bodisi

i. a[l] ≤ x ter zopet nastopi primer 4 in s tem invarianta ostane v veljaviali pa

ii. 1 < l < n + 1 ∧ a[l − 1] ≤ x < a[l]. V slednjem primeru nastopi 6.primer in invarianta zopet ostane v veljavi (gl. tudi nalogo 4b).

5. 0 < r < n ∧ a[r] ≤ x < a[r + 1]. V tem primeru se vrednost l poveca in pogojostane v veljavi do trenutka, ko postane l = r+1. Po izhodu iz zanke je rezultatr v primeru a[r] = x, sicer pa −r − 1, kar je pravilno.

6. 1 < l < n + 1 ∧ a[l − 1] ≤ x < a[l]. V tem primeru se r zmanjsa in imamoopravka z istim primerom do trenutka, ko postane r = l−1. Po izhodu iz zankeje rezultat bodisi r ali −r − 1, podobno kot v predhodnem primeru.

Osnovni namen podane obravnave primera s slike 1.2 je prikazati, kako je analizapravilnosti tudi navidez zelo preprostega programa lahko razmeroma zapletena. Kljubtemu jo je v osnovnih potezah koristno izpeljati, kar se kasneje obrestuje z manjsimstevilom napak.

1.3 Preverjanje ustavljanja

Prva in pomembna ugotovitev je, da sta pravilnost in ustavljivost programa dva locenaproblema. Trditev o pravilnosti ima vedno obliko “ce program pride do izstopne tocke,velja trditev P”. Torej se lahko zgodi, da pravilnost dokazemo, vendar programnikdar ne pride do izstopne tocke. Preverjanje ustavljanja je potemtakem dokaz, daprogram po koncnem stevilu korakov dejansko pride do izstopne tocke. Glede razlikemed definicijo programa in algoritma na strani 1 naj poudarimo, da pri algoritmu zeprivzemamo, da pri vseh vhodih obstaja dokaz o ustavljanju ustreznega programa.Za preverjanje ustavljanja nekega programa bomo opisali neko tehniko, ki nacelomadeluje vedno, ko se program dejansko ustavi.

Uporabljali bomo predstavitev v obliki diagrama poteka. V prvem koraku izbe-remo neko funkcijo f(. . .), ki je odvisna od spremenljivk programa in ki ima lastnostf(. . .) ≥ lim v vsaki tocki programa, pri cemer je lim neka spodnja meja. Nato vdrugem koraku razdelimo diagram na odseke, ki ne vsebujejo zank in imajo lastnosti,1. da je vsaka pot skozi diagram sestavljena iz nekaterih izbranih odsekov (ki se na

Page 24: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

16 POGLAVJE 1. ALGORITMI

poti lahko tudi ponavljajo) in 2. na vsakem odseku, ki se ne konca pri izhodu pro-grama, se vrednost f(. . .) strogo zmanjsa. V primeru, ko smo opravili oba koraka,sledi iz lastnosti f(. . .) ≥ lim in 2., da nobena pot po diagramu ne more vsebovati ne-omejenega stevila odsekov (ki se ne koncajo pri izhodu programa) in se torej programustavi.

1.1 Primer Kot prvi primer obravnavamo diagram poteka na sliki 1.11. Kot funkcijof izberemo f(u) = u, za katero ugotovimo, da velja f(u) ≥ 0 v vseh tockah programa,v katerih je funkcija definirana (in definirana postane po izvajanju drugega stavka).Odseki, na katere razdelimo diagram, pa so

1. Od vhoda v program do vstopa v odlocitveno skatlo;

2. od odlocitvene skatle preko njenega negativnega izhoda nazaj do vstopa v odlocitvenoskatlo;

3. od odlocitvene skatle preko njenega pozitivnega izhoda do izhoda programa

Ni se tezko prepricati, da funkcija f in razdelitev diagrama na odseke izpolnjujeta vsezahtevane pogoje in zato sklepamo, da se program ustavi.

1.2 Primer Drugi primer je bolj zapleten in se nanasa na diagram poteka na sliki1.17 (gl. tudi Manna [11, str. 187]). Program racuna najvecjo skupno mero stevil x1in x2, ki sta obe vecji od nic. V diagramu predstavlja simbol / celostevilcno deljenje(div). Glede njegove pravilnosti naj si bralec ogleda nalogo 5, na tem mestu pa nasbo zanimalo le dokazovanje ustavljanja. Za funkcijo f izberemo f = y1 · y2, lim pa jeenako 1. Odseki, na katere razdelimo diagram, pa so:

1-2-4 1-3-4 1-5-7-5 1-5-6-7-5 1-5-6-84-2-4 4-3-4 4-5-7-5 4-5-6-7-5 4-5-6-85-7-5 5-6-7-5 5-6-8

Ni se tezko prepricati, da so pri tako izbranih elementih izpolnjene vse zahteve, kismo jih postavili (gl. nalogo 2).

1.4 Poraba casa in prostora

Pri ocenah porabe omenjenih virov izhajamo iz dolocenih osnovnih lastnosti racunalnika,na katerem se algoritem izvaja. Ce sta S1 in S2 dve zaporedji stavkov v programu ince T (Si) pri 1 ≤ i ≤ 2 oznacuje cas, ki ga program porabi na zaporedju Si, je osnovnalastnost, iz katere izhajamo

T (S1;S2) = T (S1) + T (S2). (1.2)

Pri tem se moramo zavedati, da je to s stalisca danasnje tehnologije dolocena poe-nostavitev. V bistvu je to omejitev na racunalniski model preprostega zaporednega

Page 25: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.4. PORABA CASA IN PROSTORA 17

y1 := x1y2 := x2y3 := 1

y2 := y2/2y3 := 2y3

y1 := y1/2 z := y2y3

y1 := y2y2 := |y1 − y2|

y2 := y2/2

sodo(y1)

sodo(y2)

y1 = y2

sodo(y2)

VHOD

IZHOD

DA NE

DA NE NE DA

DA NE

1

2 3

4

5

67

8

Slika 1.17: Algoritem za najvecjo skupno mero.

procesorja, ki ukaze svojega programa izvaja enega za drugim in vsak program izvajado konca, preden se loti naslednjega. Za stroj RAM, za katerega smo se domenili,da predstavlja tisti model, na katerem se izvajajo nasi algoritmi, je ta omejitev ve-ljavna. Danes pa seveda obstajajo racunalniki, ki vsebujejo vec procesorjev, tako dalahko izvajajo istocasno vec ukazov nekega programa. Za tak racunalnik relacija (1.2)seveda ne velja. Prav tako obstajajo racunalniki, ki delo na nekem programu predkoncem prekinejo in zacnejo, oziroma nadaljujejo z delom na drugem programu, ki jedo tedaj miroval. Pri takem racunalniku prav tako ne moremo napovedati casa delo-vanja programa na podlagi (1.2). Vendar kljub temu, da lastnost (1.2) na danasnjihracunalnikih ni vedno prisotna, se vedno predstavlja osnovo za vsako analizo porabecasa.

Tudi pri analizi porabe pomnilnega prostora izhajamo iz dolocene poenostavitve.

Page 26: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

18 POGLAVJE 1. ALGORITMI

Pri porabi prostora se moramo najprej zavedati, da je pomnilni prostor razdeljen navec podrocij, na primer: prostor za program, prostor za spremenljivke, prostor zasklad ter prostor, ki ga program dinamicno zasega in sprosca. Ce se na tem mestuomejimo na prostor za spremenljivke in ce prostor za spremenljivko x oznacujemo zM(x), je najenostavnejse izhodisce, da je velikost prostora za spremenljivki x1 in x2enaka

M(x1 ∪ x2) = M(x1) +M(x2). (1.3)

Tudi v tem primeru je na danasnjih racunalnikih to poenostavitev, kajti obstajajoracunalniki in ustrezna programska oprema, ki omogocata prirejanje istega prostorarazlicnim spremenljivkam4. Namrec, ce izracun, ki ga program uresnicuje, ne potre-buje kolicin x1 in x2 istocasno, je mozno za x1 in x2 uporabiti isti prostor. Vendartudi v primeru prostora velja, da omenjena poenostavitev predstavlja osnovo za oceneporabe tega vira.

1.4.1 Zapis za asimptoticno rast funkcij

n0 n

g(n)

f(n)cg(n)

Slika 1.18: Asimptoticna zgornjameja z natancnostjo do multiplika-tivnega faktorja

Preden predstavimo nacine ocenjevanja porabecasa in prostora, bomo opisali nek zapis zaasimptoticno rast funkcij. Pogosto zelimo izrazitimisel, da je funkcija f(n), ko je n celostevilcni ar-gument, po velikostnem redu asimptoticno ome-jena navzgor z g(n). Mozno je tudi zamenjatibesede “omejena navzgor z” z “omejena navzdolz” ali “enaka”. Natancna oblika (prve) trditveje, da

∃c, n0 > 0 ∀n ≥ n0 [f(n) ≤ cg(n)] (1.4)

(gl. sliko 1.18). Za ta pojem obstajauveljavljen zapis. Mnozico funkcij f(n),ki zadoscajo pogoju (1.4), oznacujemo zO(g(n)):

O(g(n)) = f(n) | ∃c, n0 > 0 ∀n ≥ n0 [f(n) ≤ cg(n)] (1.5)

Torej je (1.4) enakovredno trditvi

f(n) ∈ O(g(n)).

Vendar se je pri tem zapisu uveljavila dolocena nedoslednost in namesto f(n) ∈O(g(n)) dejansko pisemo f(n) = O(g(n)). Na to je potrebno biti pozoren.

Podobno, kot smo definirali asimptoticno zgornjo mejo, lahko definiramo asimp-toticno spodnjo mejo:

∃c, n0 > 0 ∀n ≥ n0 [f(n) ≥ cg(n)] (1.6)

4Pravzaprav taki racunalniki danes v prakticni uporabi prevladujejo.

Page 27: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.4. PORABA CASA IN PROSTORA 19

Ustrezno mnozico sedaj oznacujemo z

Ω(g(n)) = f(n) | ∃c, n0 > 0∀n ≥ n0 [f(n) ≥ cg(n)] (1.7)

in podobno kot prej imamo nekoliko zavajajoc zapis f(n) = Ω(g(n)).V primeru, ko velja f(n) = O(g(n)) kakor tudi f(n) = Ω(g(n)), pisemo f(n) =

Θ(g(n)) (torej Θ(g(n)) = O(g(n)) ∩ Ω(g(n))) in pravimo, da je f(n) po velikostnemredu enaka g(n).

1.4.2 Cas

Kot smo nakazali z lastnostjo (1.2), je najpomembnejsa tehnika pri ocenjevanju casa,ki ga porabijo programi, sestevanje casov za posamezne dele programa. Osnovnideli programa so posamezni stavki. Za porabo casa posameznih stavkov ponavadivpeljemo dolocene poenostavitve: tipicni sta privzetek, da vsi stavki porabijo enakcas, ali pa, da nekateri porabijo cas 1, drugi pa 0, kar pomeni, da stejemo le nekaterestavke. Na primer v algoritmu na sliki 1.2 bi lahko kot merilo za porabo casa vzelistevilo izvajanj pogojnega stavka v vrstici 12. Za ta stavek ugotovimo, da se izvaja,dokler ni izpolnjen izstopni pogoj iz zanke. Ker se kolicina r− l pri vsakem izvajanjujedra zanke priblizno prepolovi, se bo ta stavek izvajal priblizno log2 n krat. Ceoznacujemo s T (n) cas, ki ga porabi algoritem na sliki 1.2 pri vhodnem parametru n,vsekakor velja T (n) = Θ(log2 n) (gl. nalogo 8).

Ker so zanke vrste FOR,

FOR i = 1 TO nDO Si,

in drugacne zanke med najpomembnejsimi elementi programov, ima pri ocenjevanjucasa pomembno vlogo izracun vrednosti vrst:

n∑i=1

Ti (1.8)

Za ocenjevanje vrednosti vrst obstaja obsezna literatura (gl. npr. Bronstein in dr. [3,poglavje 7]), vendar je nekaj vrst tako znacilnih, da jih bomo na tem mestu omenili.

Aritmeticna vrsta

n∑i=1

i = 1 + 2 + . . .+ n.

Za taksno vrsto ugotovimo, da velja

n∑i=1

i =1

2n(n+ 1) = Θ(n2), (1.9)

kar je mozno na primer dokazati z indukcijo po n.

Page 28: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

20 POGLAVJE 1. ALGORITMI

Geometricna vrsta

n∑i=0

xi = 1 + x+ x2 + . . .+ xn.

Vrednost te vrste dobimo kot

n∑i=0

xi =

n+ 1, pri x = 1xn+1−1x−1

, sicer.(1.10)

V primeru, ko je x < 0, prvi clen stevca gre proti 0 in dobimo pri velikih vrednostihn:

n∑i=0

xi ≈ 1

1− x.

(1.10) lahko dokazemo bodisi ponovno z indukcijo po n ali pa na podlagi neposrednegarazcepa polinoma xn+1 − 1 na

∑ni=0 x

i in x− 1.

Ocenjevanje vrst z dolocnimi integrali. Od splosnih orodij za ocenjevanjevrednosti (vsote) vrst bomo navedli le ocenjevanje z dolocnimi integrali. V primeru,ko zelimo izracunati

n2∑i=n1

f(i), (1.11)

in ko je f(x) nepadajoca funkcija v intervalu

[n1 − 1, n2 + 1],∫ n2+1

n1f(x)dx ter

∫ n2+1

n1f(x− 1)dx pa sta definirana, velja

∫ n2+1

n1

f(x− 1)dx ≤n2∑i=n1

f(i) ≤∫ n2+1

n1

f(x)dx (1.12)

(gl. sliko 1.19). V primeru nenarascajoce funkcije f(x) sta pa neenakosti v (1.12)obrnjeni.

Primer. Zelimo izracunati∑ni=2

1i ; iz (1.12) in pripombe sledi,∫ n+1

2

1

x− 1dx ≥

n∑i=2

1

i≥∫ n+1

2

1

xdx,

oziroma ∫ n

1

1

xdx = lnn ≥

n∑i=2

1

i≥∫ n+1

2

1

xdx = ln(n+ 1)− ln 2,

Page 29: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.4. PORABA CASA IN PROSTORA 21

n1 n2n

f(x)

f(x− 1)

∑n2

n1f(x)

Slika 1.19: Ocenjevanje vre-dnosti vrst z integrali

Rekurencne relacije. Drugo pomembno orodje zaocenjevanje casa algoritmov so rekurencne relacije, kise pojavljajo zlasti pri algoritmih, ki imajo rekurzivnodefinicijo.

V tipicnem primeru imamo problem, katerega vho-dne podatke je mozno opisati s parametrom n, kioznacuje velikost problema. Algoritem zanj pa de-luje tako, da vhodne podatke najprej transformira v cmanjsih naborov in pridobi c sorodnih podproblemovvelikosti nc . Nato resuje a izmed teh podproblemov in

resitev kombinira v resitev prvotnega problema. Ceje za postopek razcepa prvotnih podatkov na podprobleme in kasneje za zdruzevanjedelnih resitev v resitev prvotnega problema potreben cas velikostnega reda nr, kjerje r neka konstanta, dobimo za cas, ki ga porabi algoritem, relacijo

T (n) =

b, n = 1aT (nc ) + bnr, n > 1,

(1.13)

pri cemer je b vecji izmed casov, ki jih algoritem porabi za primer n = 1 ali za razcepproblem velikosti n > 1 na podprobleme in za kasnejso zdruzitev delnih rezultatov vrezultat prvotnega problema. Oceno za T (n) podaja naslednji izrek:

1.3 Izrek Naj bodo a, b, c in r nenegativne konstante. Pri c > 0 in a ≤ c je resitevrekurzivne enacbe (1.13) podana s

T (n) =

Θ(nr), a < cr,Θ(nr log(n)), a = cr,Θ(nlogc a), a > cr.

Dokaz. Natancno izpeljavo bomo podali za primer n = ck. Z indukcijo po k lahkopokazemo, da velja

T (n) = bckrk∑i=0

qi (1.14)

pri q = acr , nato pa trditev izreka sledi iz (1.10). 2

Primer. Kot primer vzemimo rekurzivno obliko dvojiskega iskanja na sliki 1.20. Cezapisemo n = r−l+2, lahko uporabimo relacijo (1.13). Potrebno je le izbrati primernevrednosti a, c in r. V tem primeru je c = 2, ker podatke razbijemo na spodnji in

Page 30: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

22 POGLAVJE 1. ALGORITMI

1 PROCEDURE BinSearch(VAR a:ARRAY OF LONGINT ;2 l ,r ,x :LONGINT );3 (∗ Ko je a prazno, imata l in r vrednosti 1 in 0;4 a[0] je vedno nedefinirano; rezultat je k,5 ko velja a[k]=x in −k, ko velja a[l−1] < x < a[l ]6 oziroma l = 1 in x < a[l ] oziroma l = n+1 in7 a[n] < x pri n = LEN(a)− 1∗)8 VAR mid :LONGINT ;

10 BEGIN10 IF l<=r THEN11 mid :=(l+r)DIV 2;12 IF a[mid ] > x THEN RETURN BinSearch(a,l ,mid−1,x )13 ELSE RETURN BinSearch(a,l ,mid+1,r ,x )15 END15 ELSIF (r > 0) & (a[r ]=x ) THEN RETURN r16 ELSE RETURN −l18 END18 END BinSearch;

Slika 1.20: Rekurzivni algoritem dvojiskega iskanja

zgornji del tabele (pod indeksom mid in nad njim)5 , a = 1, ker v vsakem primerusprozimo le en nadaljnji rekurzivni klic in r = 0, kajti poraba casa do rekurzivnegaklica (in po vrnitvi iz njega) je neodvisna od n. Na podlagi izreka 1.3 sledi, da je vtem primeru

T (n) = Θ(nr log(n)) = Θ(log(n)),

kar je v skladu z rezultatom, ki smo ga zapisali na zacetku tega razdelka.

1.4.3 Prostor

V tem delu se bomo z ocenami porabe prostora srecali le nekajkrat in ne bomo navajaliposebnih metod za take ocene.

1.5 Povzetek osnovnih pojmov

1. Osnovni pojmi. Razlika med algoritmom in programom

2. Pojem stroja RAM

3. Sled algoritma. Drevo sledi

4. Dvojisko iskanje z dvema izidoma primerjave

5Pravzaprav je c malenkostno manjsi, kar pomeni, da pri privzetku, da T (n) narasca z n, dobimonekoliko precenjeno vrednost T (n).

Page 31: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

1.6. NALOGE 23

5. Osnovne metode za preverjanje pravilnosti algoritmov

6. Preverjanje pravilnosti s poskusi

7. Preverjanje pravilnosti z logicno analizo

8. Diagrami poteka

9. Antecedens, konsekvens ter aksiomi preverjanja pravilnosti

10. Preverjanje pravilnosti zank. Zancna invarianta

11. Programa za mnozenje in deljenje dveh stevil

12. Preverjanje pravilnosti programov, ki so zapisani v programskem jeziku

13. Preverjanje ustavljanja

14. Izhodisci za ocenjevanje porabe casa in prostora

15. Zapis O,Ω,Θ16. Osnovne vrste in njihovo ocenjevanje

17. Ocenjevanje porabe casa rekurzivnih programov.

1.6 Naloge

1. Na sliki 1.3b sta prikazani dve sledi algoritma s slike 1.2, kjer nas zanima le zaporedjedolocenih “kontrolnih tock” pri izvajanju algoritma. Koliko je moznih takih sledialgoritma pri vseh moznih vhodih, ko ima vhodna tabela a dolzino n (in nas, denimo,zanimajo iste kontrolne tocke)?

2. Naj ima prirejanje x := 0 konsekvens x = 0. Zapisite njegov antecedens.

3. Zakaj je v programu na sliki 1.11 potreben pogoj x > 0?

4. (a) Natancno analizirajte, zakaj v primeru 4(a)ii na strani 15 ne more veljati r = 0ali r = n;

(b) podobno v 4(b)ii, zakaj ne more veljati l = 1 ali l = n+ 1.

5. Prepricajte se o pravilnosti programa za najvecjo skupno mero na sliki 1.17. Programje izboljsava klasicnega algoritma

WHILE x1 # x2 DOIF x1 > x2 THEN

x1 := x1 − x2ELSE x2 := x2 − x1END

END ;RETURN x1

Prikazani algoritem vsebuje nekaj predikatov “x je sodo”, katerih vlogo je potrebnorazumeti in dokazati, da program deluje pravilno.

6. Za primer 1.2 sestavite podroben dokaz, da sta izpolnjena pogoja 1. in 2. iz zacetkarazdelka 1.3 za razdelitev diagrama na odseke ter, da velja f(. . .) ≥ 1. Napotek:za pogoj 1. (vsako pot je mozno sestaviti iz izbranih odsekov) sestavite podrobnorazclenitev na posamezne primere. Na primer, vse mozne primere lahko razdelimo

Page 32: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

24 POGLAVJE 1. ALGORITMI

na tiste, kjer je y1 sodo in druge, kjer je liho. Slednjo skupino delimo naprej napodlagi lihosti y2 itn. Pogoj f(. . .) ≥ 1 preverimo tako, da pokazemo, da je argumentvsakega celostevilcnega razpolavljanja sod. Pogoj 2. dokazemo tako, da preverimo,da vsak odsek, ki se ne konca pri izhodu programa, vsebuje vsaj eno celostevilcnorazpolavljanje.

7. Pri naslednjih parih funkcij

〈2n2, n2〉 〈5n, n2〉 〈3n, 1〉 〈n3, n3〉

velja x = y(z), kjer sta x in z levi in desni element para, y pa je O ali Ω ali Θ. Za vseprimere ugotovite, kaj je najprimernejsa vrednost za y.

8. Ce primerjamo algoritem na sliki 1.2, ki uporablja primerjanje z dvema izidoma, zalgoritmom dvojiskega iskanja, ki uporablja tri izide primerjanja (<,=, >), kaj jeosnovna razlika med njima glede asimptoticnega obnasanja porabe casa?

9. Poiscite resitev rekurzivne enacbe,

T (n) =

b, n = 1aT (n

c) + bn logn, n > 1.

(1.15)

Napotek: izpeljite relacijo, podobno (1.14), ki smo jo uporabili za dokaz izreka 1.3.

Page 33: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 2

UREJANJE

2.1 Naloga urejanja in klasifikacija metodurejanja

Urejanje podatkov se nanasa na prestavljanje podatkov v zaporedju,

a1, a2, . . . , an, (2.1)

na podlagi neke relacije popolne urejenosti ≺, tako da na koncu dobimo,

ai1 , ai2 , . . . , ain ,

in velja,

ai1 ai2 . . . ain . (2.2)

Potrebno je poudariti, da znak ≺ ne predstavlja nujno obicajne urejenosti stevil.Urejanje vecinoma uporabljamo zato, da podatke spravimo v nekaksen red, ki namkasneje olajsuje njihovo iskanje. Spomnimo se pri igrah s kartami, kaj storimo takoj,ko karte dobimo v roke: uredimo jih po barvah in vrednosti, tako da lahko kasnejez enim samim pogledom ugotovimo, ali imamo karto dolocene vrste. Zaradi tega jeurejanje tudi ena izmed najpogostejsih operacij, ki se izvajajo na racunalnikih. Kottako jo mora racunalniski strokovnjak obvladati in biti dobro seznanjem z razlicniminacini in pogoji za njeno izvajanje. Poleg tega je mozno na primeru urejanja prikazativrsto idej in osnovnih tehnik programiranja in nacrtovanja algoritmov.

Osnovni pogoj za to, da je naloga urejanja smiselna, je popolna urejenost mnoziceelementov zaporedja (2.1), kar pomeni, da za razlicna elementa x in y velja bodisix ≺ y ali y ≺ x. S to pripombo zacnemo kratek miselni pregled razlicnih nalogurejanja in za vsako nalogo razlicnih algoritmov zanjo.

V tem poglavju bomo algoritme predstavljali z razmeroma podrobnimi programiv jeziku Oberon-2 (gl. npr. Reiser in Wirth [14] ali Mahnic [4]), zgradba programov

25

Page 34: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

26 POGLAVJE 2. UREJANJE

MODULE Sort ;CONST

eq∗=0; less∗=1; grt∗=2;TYPE

PItem∗=POINTER TO Item;Item∗=RECORD (∗ podatkovni elementi ∗) END;(∗ tip procedure za primerjanje podatkovnih elementov ∗)FCmpType∗=PROCEDURE(p,q :PItem;r :INTEGER):BOOLEAN ;

END Sort .

Slika 2.1: Osnovne deklaracije pri nalogi urejanja

Urejanje

nizov, ki so sestavljeni

iz posameznih crk

in so razlicno dolgi

Slika 2.2: Podatki razlicne velikosti

pa bo tudi ustrezala razclembi splosnega problema urejanja, kot bo opisana v nada-ljevanju. Najsplosnejsi nalogi urejanja priredimo nek izhodiscni programski modul,ki vsebuje osnovne elemente, ki so skupni vsem razlicicam problema urejanja, natopa s specializacijo in dedovanjem pridemo do posameznih konkretnih primerov. Nekomozno obliko takega izhodiscnega modula prikazuje slika 2.1: podan je osnovni tipzaporedja ter kazalec nanj, tip procedure za primerjanje, kakor tudi tri konstante, kidolocajo za kaksno primerjanje gre. Naj opozorimo na to, da modul Sort ne vsebujenobenih operacij temvec le deklaracije.

Na tem mestu je primerno opozoriti se na neko posebnost zapisa, ki smo ga upora-bili na sliki 2.1: gre za dogovor, ki vnasa doloceno pravilnost v poimenovanje razlicnihobjektov in s tem olajsuje njihovo pomnenje. Ce imamo tip, ki nosi ime Nm, bomokazalec nanj poimenovali s PNm (“POINTER TO”), tabelo z osnovnim tipom Nmpa z ANm (“ARRAY OF”). Na primer na sliki 2.1 pomeni ime PItem, “POINTERTO Item”. Prav tako bomo vse tipe, ki opisujejo procedure, oziroma funkcije, zacelis crko F (npr. “FCmpType”).

Naloge urejanja se predvsem razlikujejo po vrsti podatkov, definiciji relacije ure-

Page 35: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.1. NALOGA UREJANJA IN KLASIFIKACIJA METOD UREJANJA 27

MODULE IntSort ;IMPORT S :=Sort ;TYPE

PItem∗= POINTER TO Item;Item∗ = RECORD(S .Item) k∗:LONGINTEND;

END IntSort .

Slika 2.3: Dodatne deklaracije za primer celostevilcnih kljucev

jenosti ter po velikosti zbirke podatkov, posamezni algoritmi pa se po pristopu, ki gauporabljajo in po svoji zapletenosti. Razlikovali bomo dve osnovni vrsti podatkov,in sicer podatke iste dolzine ter razlicnih dolzin. Vendar to ni posebno pomembnaznacilnost, kajti urejanje podatkov razlicnih dolzin je mozno prevesti na urejanje po-datkov iste dolzine z uporabo kazalcev in dinamicnega dodeljevanja pomnilnika (glejsliko 2.2). Na ta nacin je osnovna predstavitev vseh podatkov (kazalec) enako dolgain se razlicne dolzine dejanskih podatkov kazejo edino v neenakem trajanju operacijeprimerjanja podatkov. Dejansko ima dostop do podatkov s kazalci doloceno prednostpred neposrednim dostopom, zaradi cesar ga bomo v tem poglavju vseskozi uporabljaliin se pravzaprav z urejanjem podatkov razlicnih dolzin ne bomo ukvarjali. Sevedapa ima uporaba kazalcev tudi nekatere pomanjkljivosti. Na kratko so prednosti inpomanjkljivosti uporabe kazalcev naslednje:

Dobre strani

1. Neodvisnost vecine programa od oblike podatkov ter s tem povezana moznostuporabe programskih sestavin v razlicnih aplikacijah.

2. Enostavnejsa oblika programa.

Slabe strani

1. Vecja poraba pomnilnega prostora (dodaten prostor za kazalce).

2. Nekoliko manjsa hitrost.

Relacijo urejenosti lahko definiramo na razlicne nacine in zato smo v osnovnemmodulu Sort deklarirali le tip procedure FCmpType, ki mu pripadajo procedure, kipreverjajo relacijo ≺. Pravzaprav pa procedur omenjenega tipa niti ne bomo upo-rabljali, ker za nase potrebe zadostujejo obicajne relacije, <,= in >, ki so (v jezikuOberon-2) definirane tako za stevilske tipe kot za znakovna zaporedja. To pa sta tudinajpogostejsa prakticna primera pri urejanju. Torej v prvem primeru imamo primer-janje na podlagi neke stevilcne komponente podatka, v drugem pa na podlagi nekega

Page 36: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

28 POGLAVJE 2. UREJANJE

PROCEDURE CompareStr(VAR a,b: ARRAY OF CHAR):INTEGER;(∗ Znakovni zaporedji a in b sta zakljuceni z nicelnim znakom ∗)VAR i :INTEGER;BEGIN

i :=0;WHILE (a[i ]=b[i ])&(a[i ]#0X)DO INC (i) END;RETURN ORD(a[i ])−ORD(b[i ])

END CompareStr ;

Slika 2.4: Leksikografsko urejanje

znakovnega zaporedja. Delu podatka, na podlagi katerega izvajamo primerjanje, po-navadi pravimo kljuc in v prvem primeru se deklaracija tipa Item razsiri tako, kot jeprikazano na sliki 2.3, v drugem primeru pa takole:

RECORD(Sort .Item) k :ARRAY OF CHAR END. (2.3)

Mimogrede, relacija ≺, =, ali na znakovnih zaporedjih se racuna po algoritmu, ki jeprikazan na sliki 2.4. (Ceprav smo ugotovili, da so te relacije pri Oberonu-2 vgrajenev sam jezik, program navajamo zaradi dodatne razjasnitve pojma.) Tako definiranirelaciji urejenosti pravimo leksikografska urejenost. Pomembna razlika med urejanjemna podlagi celostevilcnega kljuca in leksikografskim urejanjem je, da sama operacijaprimerjanja v prvem primeru porabi konstanten cas, v drugem pa spremenljiv cas(tudi ce imamo opravka z znakovnimi zaporedji iste dolzine).

Znacilnost problema urejanja, ki nas bo v tem poglavju najbolj zanimala indolocala nacin resevanja problema, pa je stevilo podatkov. Razlikovali bomo primer,ko je mozno hraniti vse podatke v notranjem pomnilniku racunalnika, od primera,ko moramo uporabljati zunanje pomnilnike. Zaradi tega prvemu postopku pravimonotranje urejanje, drugemu pa zunanje urejanje. V prvem primeru za shranjevanjepodatkov uporabljamo tabelaricno podatkovno strukturo (angl. array), v drugem pauporabljamo datoteke (angl. file).

Ko uporabljamo datoteke, ponavadi privzamemo, da so to zaporedne datoteke,katerih osnovna znacilnost je, da elemente beremo enega za drugim od zacetka protikoncu. V tem primeru velja, da imamo med branjem datoteke v vsakem trenutkudostop samo do omejenega stevila sosednih elementov, ki so “vidni” skozi nekaksnookno na datoteko. Podatki iz okna so shranjeni v notranjem pomnilniku racunalnika.Zaporednim datotekam bomo vcasih rekli kar trak , ker se dejansko obnasajo kotklasicni magnetni trakovi, kjer je tudi dejansko dosegljiv le majhen del podatkovrazmescen blizu bralne glave tracnega mehanizma.

Ponavadi algoritme za posamezne naloge urejanja lahko razvrstimo v dve skupini.Eni pripadajo algoritmi, ki so po svoji zasnovi preprosti, porabijo pa razmeroma velikocasa, drugi skupini pa pripadajo algoritmi, ki so po svoji zgradbi bolj zapleteni, vendarhitrejsi. Algoritmom prve vrste pravimo navadni algoritmi (za urejanje), algoritmomdruge vrste pa izboljsani algoritmi . Vsi opisani kriteriji za razvrscanje metod za

Page 37: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 29

PODATKI STALNE DOLZINE

PODATKI SPREMENLJIVE DOLZINE

PRIMERJANJE PORABI KONSTANTEN CAS

PRIMERJANJE PORABI SPREMENLJIV CAS

KRATKA ZAPOREDJA = UREJANJE TABEL

DOLGA ZAPOREDJA = UREJANJE DATOTEK

ENOSTAVNI, A CASOVNO POTRATNI ALGORITMI

ZAPLETENI, A CASOVNO UCINKOVITI ALGORITMI

Slika 2.5: Kriteriji za razvrscanje metod za urejanje

urejanje so povzeti na sliki 2.5.

Na koncu tega kratkega uvoda v urejanje naj na sliki 2.6 predstavimo shemo dedo-vanja med programskimi moduli, ki uresnicujejo metode, o katerih bomo razpravljali.Programska modula Sort in IntSort pravzaprav pri realizaciji urejanja niti ne bi bilapotrebna, saj bi njuno vsebino zlahka vkljucili v druge module. Izpostavili pa smo jukot locena modula prav zato, da nakazemo miselno razclenitev problemov urejanja.

2.2 Notranje urejanje

V tem razdelku si bomo najprej ogledali razlicne navadne algoritme za urejanje tabelin nato njihove izboljsave. Navadni algoritmi za notranje urejanje imajo znacilnost,da porabijo O(n2) operacij za urejanje tabele velikosti n, izboljsani algoritmi pa zaisto nalogo v vecini primerov O(n log n) operacij. Omejili se bomo na algoritme, kiizpolnjujejo tudi nek dodaten pogoj, in sicer, da ne zahtevajo bistveno vec prostoraza podatke, kot jih zaseda vhodna tabela dolzine n. Algoritme za notranje urejanjenato delimo v tri skupine, na podlagi osnovnega pristopa, ki ga uporabljajo.

Vse procedure za urejanje tabel bomo deklarirali znotraj modula ArrSort z zacetnimadvema vrsticama:

MODULE ArrSort ;IMPORT I :=IntSort ,S :=Sort ;

vsaka od procedur za urejanje, ki jih bomo predstavili, pa uporablja parameter atabelaricnega tipa:

APItem = ARRAY OF I .PItem. (2.4)

Page 38: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

30 POGLAVJE 2. UREJANJE

Sort IntSort ArrSort

FileSortDefinicija osnovnegapodatka. Tip proce-dure za primerjanjepodatkov

Osnovni podatek sstevilskim kljucem

Metode urejanja tabel

Metode urejanja dato-tek

Ostale metode urejanja

Slika 2.6: Shema dedovanja med programskimi moduli za urejanje

Kasneje bomo potrebovali tudi kazalec na ta tip:

PAPItem = POINTER TO APItem. (2.5)

Preden predstavimo tri navadne metode urejanja tabel, naj omenimo neko skupnolastnost, ki nam olajsuje njihovo razumevanje:

v vsakem trenutku delovanja procedure je tabela a razdeljena nadva dela, levega, ki ima dolzino i in je ze urejen, ter desnega, ki imadolzino LEN (a)− i in je se neurejen.

(2.6)

Skupno vsem navadnim algoritmom notranjega urejanja je, da imajo zgradbo prepro-ste zanke z invarianto, ki jo predstavlja trditev (2.6) in jedrom, ki ima pri vsakemizvajanju ucinek, da poveca dolzino ze urejenega dela za 1.

2.2.1 Navadno vstavljanje

Algoritem ima naslednjo zgradbo:

FOR i :=1 TO n−1 DOBEGIN(∗ a[i] vstavimo na pravilno mesto v urejeni del tabele,a0, . . . , ai−1 ∗)

END

Podrobno je algoritem prikazan na sliki 2.7. Na sliki je tudi nakazano mesto, kjervelja trditev (2.6) o delitvi tabele na zacetni, urejeni del in neurejeni del.

Na tem mestu lahko prikazemo neko podrobnost, ki spada med drobne zvijaceprogramiranja, je pa koristna v vseh primerih, ko moramo neko tabelo preiskati odzacetka do konca, tako kot na sliki 2.7 tabelo a[0], . . . , a[i − 1] (vrstice 8 do 10).

Page 39: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 31

1 PROCEDURE InsertionSort∗(VAR a:APItem);2 VAR i ,j ,n:LONGINT ;x :I .PItem;3 BEGIN n:=LEN (a);4 FOR i :=1 TO n−1 DO5 (∗ zaporedje, a[0], a[1], ..., a[i− 1], je urejeno;6 zaporedje, a[i ], a[i+1], ... , a[n−1], neurejeno ∗)7 j :=i ; x :=a[j ];8 WHILE (j>=1) & (x .k<a[j−1].k) DO9 a[j ]:=a[j−1]; DEC (j )

10 END;11 a[j ]:=x13 END13 END InsertionSort ;

Slika 2.7: Navadno vstavljanje

1 PROCEDURE SentinelSort∗(VAR a:APItem);2 (∗ Urejanje s cuvajem; tabela a ima dodaten element na3 svojem zacetku ∗)4 VAR i ,j ,n:LONGINT ;5 BEGIN n:=LEN (a)−1; (∗ stevilo elementov v tabeli ∗)6 FOR i :=2 TO n DO7 (∗ zaporedje, a[1], a[2], ..., a[i− 1], je urejeno;8 zaporedje, a[i], a[i+ 1], ..., a[n], neurejeno ∗)9 j :=i ; a[0]:=a[i ];

10 WHILE a[0].k<a[j−1].k DO11 a[j ]:=a[j−1]; DEC (j )12 END;13 a[j ]:=a[0]15 END15 END SentinelSort ;

Slika 2.8: Vstavljanje s cuvajem

Page 40: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

32 POGLAVJE 2. UREJANJE

V spremenjenem algoritmu navadnega vstavljanja na sliki 2.8 povecamo tabelo, zaen element, tako da komponente a[1], . . . , a[n] vsebujejo zaporedje, ki ga urejamo,a[0] pa je dodaten element, ki mu v vrstici 9 priredimo vrednost a[i]. Na ta nacinsmo odpravili potrebo po preverjanju pogoja za izstop iz notranje zanke, j ≥ 1, valgoritmu na sliki 2.7 in prisli do oblike, ki je prikazana na sliki 2.8. Seveda pa krajsizapis izstopnega pogoja vecinoma pomeni hitrejse izvajanje. Takemu dodatnemuelementu na zacetku ali koncu tabele, ki ima nalogo, da prepreci nekemu indeksu (vnasem primeru j), da prekoraci mejo tabele, pravimo cuvaj.

Analiza navadnega vstavljanja. Pri algoritmih nas zanima poraba razlicnih racunskihvirov, predvsem pomnilnega prostora in casa. Glede pomnilnega prostora smo se priurejanju tabel ze omejili na algoritme, ki ne zahtevajo dodatnega prostora (polegtistega, ki ga zasedajo podatki), tako da je analiza porabe prostora brezpredmetna.Pri porabi casa pa postopamo tako, da cas ocenjujemo s stevilom dolocenih znacilnihoperacij. Najznacilnejse v algoritmu na sliki 2.8 je primerjanje v izstopnem pogojunotranje zanke. Poleg tega nas ponavadi zanima vec vrst ocen, na primer: najmanjsaporaba na vseh moznih zaporedjih dolzine n, najvecja poraba ter povprecna poraba.Na podlagi zgradbe algoritma na sliki 2.8 lahko za vse vrste porabe zapisemo relacijo,

C =

n∑i=2

Ci, (2.7)

kjer je C stevilo primerjanj, in to bodisi najmanjse, najvecje ali povprecno, Ci pa jeisto stevilo med izvajanjem jedra zanke pri vrednosti i. Na primer, do najmanjsegastevila primerjanj v algoritmu na sliki 2.8 pride, ko je vhodno zaporedje ze urejenoin se jedro notranje zanke nikoli ne izvaja. V takem primeru je Cmin,i = 1 pri vsehvrednostih i in je,

Cmin =

n∑i=2

Cmin,i =

n∑i=2

1 = n− 1.

Do najvecjega stevila primerjanj pa pride, ko je vhodno zaporedje nasprotno urejenoin moramo a[i] vedno postaviti na prvo mesto. V tem primeru je Cmax,i = i − 1 indobimo,

Cmax =

n∑i=2

Cmax,i =

n∑i=2

(i− 1) =1

2(n− 1)n.

Za izracun povprecne vrednosti, Cave, bi bilo potrebno poznati porazdelitev verjetno-sti posameznih vhodnih zaporedij (in na podlagi tega izracunati porazdelitev verje-tnosti Cave,i), ce pa privzamemo, da so vse vrednosti Cave,i v intervalu [Cmin, Cmax]enakoverjetne, dobimo oceno,

Cave =1

2(Cmin + Cmax) =

1

2(n− 1 +

1

2(n2 − n)) =

1

4(n− 1)(n+ 2).

Page 41: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 33

1 PROCEDURE BinaryIns∗(VAR a:APItem);2 VAR i ,j ,l ,r ,m,n:LONGINT ;x :I .PItem;3 BEGIN n:=LEN (a);4 FOR i :=1 TO n−1 DO5 x :=a[i ]; l :=1; r :=i ; (∗ l − 1 in r − 1 predstavljata6 mejne indekse urejenega dela ∗)7 WHILE l <= r DO8 m:=(l+r)DIV 2;9 IF a[m−1].k > x .k THEN r :=m−1

10 ELSE l :=m+112 END12 END ;13 IF (r > 0) & (x .k=a[r−1].k) THEN l :=r END;14 FOR j :=i TO l BY −1 DO15 a[j ]:=a[j−1]16 END;17 a[l−1]:=x19 END19 END BinaryIns;

Slika 2.9: Navadno vstavljanje z dvojiskim iskanjem

Poskus izboljsave navadnega vstavljanja. Ko razmisljamo o moznih izboljsavahmetode navadnega vstavljanja, ugotovimo, da bi to bilo mozno, ce bi osnovne operacijerealizirali ucinkoviteje. Ena izmed operacij, ki se pojavlja v tem algoritmu, je iskanjepravega mesta v zaporedju a[1], . . . , a[i−1] za element a[i]. Glede na to, da je slednjezaporedje ze urejeno, se nam utrne misel, uporabiti za omenjeno operacijo dvojiskoiskanje. Tako spremenjen algoritem navadnega vstavljanja je prikazan na sliki 2.9.Ker dvojisko iskanje v tabeli dolzine n zahteva O(dlog2 ne) operacij, zahteva iskanjepravega mesta za a[i] pri vseh i, 2 ≤ i ≤ n, stevilo operacij

C =

n−1∑i=1

dlog2 ie.

To stevilo pa je mozno oceniti z integralom,∫ n

1

log2 x dx =1

cx(lnx− 1)|n1 =

1

cn(lnn− 1),

kjer je c = 1/ ln 2 [gl. 1.12]. Zal, ko nekoliko premislimo, ugotovimo, da s taksnoizboljsavo nismo veliko dosegli, kajti zanka v vrsticah od 14 do 16 pri vseh vrednostihi se vedno zahteva O(n2) operacij (gl. nalogo 1). V tem primeru bi lahko rekli, danas je zanasanje na oceno casa z stetjem primerjanj zavedlo in pripeljalo do napacnihsklepov, kajti zanemarili smo cas, ki se porabi za prestavljanje elementov zaporedja.Nauk je, da se moramo pri podobnih ocenah prepricati, da smo resnicno upostevalivse pomembne operacije algoritma, ki ga analiziramo.

Page 42: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

34 POGLAVJE 2. UREJANJE

1 PROCEDURE SelectionSort∗(VAR a:APItem);2 VAR i ,j ,n:LONGINT ;3 BEGIN n:=LEN (a);4 FOR i :=0 TO n−2 DO5 FOR j :=i+1 TO n−1 DO6 IF a[i ].k > a[j ].k THEN Exch(a[i ],a[j ]) END8 END9 END9 END SelectionSort ;

Slika 2.10: Navadno izbiranje

2.2.2 Navadno izbiranje

Navadno izbiranje ima naslednjo zgradbo:

FOR i :=0 TO n−2 DO(∗ Najmanjsi element med a[i] . . . a[n− 1] priredimo spremenljivki a[i] ∗)

END ;

popoln algoritem pa je prikazan na sliki 2.10. Pri vsakem izvajanju jedra zunanjezanke se notranja zanka sprehodi po vseh indeksih, ki so vecji od i in vsakic, ko naletina element z manjsim kljucem kot a[i].k, zamenja a[i] in tekoci element a[j]. Prianalizi algoritma uporabljamo zopet relacijo (2.7) z nekoliko spremenjenima mejamasestevanja in dobimo

C =1

2(n2 − n),

pri cemer ugotovimo, da je v tem primeru kolicina C neodvisna od vhodnega zapo-redja.

V tem primeru uporabimo nauk iz razdelka 2.2.1 in se lotimo se ocene stevilazamenjav oziroma premikov, M . Izhajamo iz podobne relacije, kot je (2.7):

M =

n−2∑i=0

Mi. (2.8)

Na podlagi podobnih premislekov kot prej, pridemo do rezultata, da je Mmin = 0(v primeru ze urejene tabele) in Mmax = 1

2n(n − 1) (v primeru nasprotno urejene

tabele). Ceprav bi cas lahko nekoliko izboljsali, ce bi uporabili operacije z indeksi(vaja!), pa to ne bi vplivalo na velikostni red casa.

2.2.3 Navadne zamenjave

Ceprav smo ze pri algoritmu navadnega vstavljanja uporabljali operacijo zamenjavedveh elementov kot bistveno sestavino algoritma, pa pri algoritmu na sliki 2.11 igra

Page 43: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 35

1 PROCEDURE BubbleSort∗(VAR a:APItem);2 VAR i ,j ,n:LONGINT ;3 BEGIN n:=LEN (a);4 FOR i :=1 TO n−1 DO5 FOR j :=n−1 TO i BY −1 DO6 IF a[j−1].k > a[j ].k THEN7 Exch(a[j−1],a[j ])9 END

10 END11 END11 END BubbleSort ;

Slika 2.11: Navadne zamenjave

se pomembnejso vlogo, zaradi cesar algoritmu pravimo urejanje z navadnimi zame-njavami. Pri vsakem izvajanju notranje zanke zacnemo pri koncu tabele in potu-jemo proti zacetku ter primerjamo sosednje elemente. V primeru napacne urejenosti,opravimo zamenjavo. Glede casovne zahtevnosti ugotovimo, podobno kot v primerunavadnega izbiranja, da stevilo primerjanj ni odvisno od vhodnih podatkov in da velja

C =n(n− 1)

2.

Pri navadnih zamenjavah so seveda bistvena sestavina porabe casa operacije prirejanjaelementov tipa PItem (gl. sliko 2.3). Izkaze se, da je tudi to stevilo O(n2) (gl. nalogo2).

Algoritem navadnih zamenjav vsebuje neko zanimivost: medtem ko se najmanjsielement v neurejenem delu tabele spusti na svoje pravo mesto med enim samim izvaja-njem notranje zanke1, porabi najvecji element za to, da se dvigne do svojega pravegamesta, veckratno izvajanje notranje zanke. Na podlagi te ugotovitve pridemo dorazlicice navadnih zamenjav, kjer smer gibanja “mehurckov” po vsakem izvajanju no-tranje zanke zamenjamo. Taki razlicici pravimo “izmenicne zamenjave”. Izmenicnezamenjave vsebujejo se neko izboljsavo povprecnega casa algoritma: ce se je med izva-janjem notranje zanke algoritma na sliki 2.11 zadnja zamenjava opravila pri indeksuk, je ocitno, da je podtabela z indeksi od 1 do k ze urejena in lahko spodnjo mejonotranje zanke, i, takoj povecamo do k. Algoritem s temi izboljsavami je prikazan nasliki 2.12

2.2.4 Spodnja meja za cas urejanja tabel

Pri navadnih metodah urejanja (navadno vstavljanje, izbiranje in zamenjave) smougotovili, da zahtevajo stevilo operacij, ki je O(n2), ce je velikost tabele n. Do te

1Elementi se spuscajo na svoja prava mesta podobno, kot se dvigajo zracni mehurcki v vodi. Odtod anglesko ime bubblesort.

Page 44: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

36 POGLAVJE 2. UREJANJE

1 PROCEDURE ShakerSort∗(VAR a:APItem);2 VAR i ,j ,l ,r ,n:LONGINT ;3 BEGIN n:=LEN (a);4 l :=1;r :=n−1;j :=n−1;5 REPEAT6 FOR i :=r TO l BY −1 DO7 IF a[i−1].k > a[i ].k THEN8 Exch(a[i−1],a[i ]);9 j :=i

11 END11 END;12 l :=j +1;13 FOR i :=l TO r DO14 IF a[i−1].k > a[i ].k THEN15 Exch(a[i−1],a[i ]);16 j :=i18 END18 END;19 r :=j−120 UNTIL l>r21 END ShakerSort ;

Slika 2.12: Izmenicne zamenjave

vrednosti smo prisli tako, da smo steli operacije primerjanja dveh elementov vhodnetabele ter prirejanja elementov podatkovnega tipa PItem. Ce zelimo navadne metodeizboljsati s stalisca porabe casa, je dobro najprej oceniti, do katere meje lahko porabocasa izboljsujemo. Z drugimi besedami, zelimo priti do neke spodnje meje za porabocasa za urejanje tabel dolzine n. Kot merilo za porabo casa ponavadi jemljemo stevilooperacij dolocene vrste (prej smo omenili operaciji primerjanja in prirejanja).

Pri dolocanju spodnje meje postopamo tako, da pri vnaprej dolocenem n obrav-navamo “vse” algoritme urejanja tabel dolzine n in vsakemu algoritmu P pripisemonek cas urejanja T (P, n). Seveda je pojem “vseh algoritmov” nekoliko nenatancen inzato pravzaprav vzamemo neko natancno doloceno mnozico algoritmov P. Torej jespodnja meja za cas urejanja tabele dolzine n,

T (n) = MINP∈PT (P, n). (2.9)

Seveda pa vsak algoritem urejanja deluje na celi mnozici vhodnih tabel dolzine n,ki se med seboj razlikujejo po urejenosti in vrednosti elementov. In zato se moramoodlociti o tem, katero vhodno tabelo naj upostevamo pri racunanju vrednosti T (P, n).Razumno je izbrati vhodno tabelo, ki pri danem algoritmu daje najslabsi (najvecji) castako, da na koncu dobimo casovno vrednost, ki dejansko zagotavlja urejanje poljubnetabele dolzine n. Po tem premisleku dobimo,

T (n) = MINP∈PMAXIn∈InT (P, In), (2.10)

Page 45: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 37

if a[i]Ra[j] then S R predstavlja eno od rela-cij ≤, ≥, < ali >, S paje eden od preostalih trehukazov.

Z(i, j) Zamenjava a[i] in a[j].goto l l je stevilka nekega stavka

pri pogoju, da velja l > k,kjer je k stevilka samegastavka goto.

halt Ustavljanje.

Slika 2.13: Dovoljene operacije pri ocenjevanju spodnje meje za cas urejanja

pri cemer je In mnozica vseh moznih tabel dolzine n, In je poljuben element slednjemnozice in T (P, In) je cas, ki ga porabi algoritem P na vhodnih podatkih In. Bodimopozorni na to, da uporabljamo isti funkcijski simbol T v razlicnih pomenih, odvisnood parametrov funkcije, ki jo simbol predstavlja: T (n) predstavlja spodnjo mejo zaurejanje zaporedij dolzine n, ne glede na algoritem, ki ga uporabljamo; T (P, n) pred-stavlja najvecji cas, ki ga algoritem P porabi na nekem vhodnem zaporedju dolzinen, T (P, In) pa predstavlja cas, ki ga porabi algoritem P na konkretnem zaporedju In.

Sedaj moramo natancneje dolociti mnozici In ter P, kakor tudi kolicino T (P, In)oziroma T (P, n).

Od mnozice algoritmov, ki jo izberemo, je odvisno, ali je resitev, ki jo dobimo,zanimiva, oziroma smiselna. Ce algoritem uporablja neko zelo zapleteno in ucinkovitoosnovno operacijo (“strojni ukaz”), potem je urejanje mozno opraviti zelo hitro. Vskrajnem primeru je lahko ze sama operacija urejanja tabele dolzine n osnovni ukaz.Zato je potrebno algoritme, oziroma dovoljene osnovne operacije tako izbrati, da soprimerljive z operacijami na dejanskih racunalnikih. To predvsem pomeni, da morajov enem koraku predelati omejeno kolicino informacije. Nabor operacij na sliki 2.13gotovo zadosca temu pogoju, ima pa tudi lastnost, da je z njim mozno realiziratiurejanje tabele dolzine n pri poljubnem n (gl. nalogo 3). Dodaten pogoj, ki veljaza stavek goto, je potreben za to, da prepovemo zanke in na ta nacin zagotovimoustavljanje programa. Potrebno pa je poudariti, da je opisana vrsta programov leteoreticni pripomocek pri izpeljavi spodnje meje, saj nima posebne prakticne vredno-sti. Namrec, ne pozna cele vrste operacij, ki so potrebne in zazelene pri prakticnihprogramih, npr. operacije z indeksi in zanke, ki omogocajo, da napisemo program, kizna urejati tabele poljubne dolzine in ne le neke konstantne, vnaprej dolocene dolzine.

Glede vhodnih podatkov izgleda na prvi pogled, da je moznih kombinacij vhodnihpodatkov zelo veliko — celo neskoncno, ce zanemarimo dejstvo, da so stevila, ki jihlahko racunalnik obdeluje, omejena na neko koncno mnozico. Vendar glede na to, dasmo izbrali mnozico programov, ki razpoznavajo le medsebojno razmerje posameznihelementov tabele (≤,≥,<,>), je ocitno, da konkretne vrednosti elementov tabele niso

Page 46: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

38 POGLAVJE 2. UREJANJE

[1 12 23 3

],

[1 13 32 2

],

[2 21 13 3

],

[2 23 31 1

],

[3 31 12 2

],

[3 32 21 1

]

[1 12 23 3

],

[2 21 13 3

],

[3 31 12 2

] [1 13 22 3

],

[2 23 11 3

],

[3 32 11 2

]

[1 12 23 3

] [2 11 23 3

],

[3 11 32 2

] [1 13 22 3

] [2 13 21 3

],

[3 12 31 2

]

[1 12 23 3

] [2 11 23 3

] [1 13 22 3

][

1 13 22 3

][

2 13 21 3

] [3 12 21 3

]

a[2] > a[3]ne da

a[1] > a[2] a[1] > a[2]

a[2] > a[3] a[2] > a[3] a[2] > a[3] a[2] > a[3]

ne da ne da

ne ne da ne ne da

Slika 2.14: Drevo sledi navadnih zamenjav pri n = 3.

pomembne in da lahko vzamemo n konkretnih, razlicnih vrednosti, najenostavnejekar 1, 2, . . . , n. Seveda so mozna tudi vhodna zaporedja z vec enakimi vrednostmi,vendar se nam zdi, da je naloga urejanja zaporedja z vec razlicnimi vrednostmi tezjaod naloge urejanja zaporedja z manj razlicnimi vrednostmi in zato, ce hocemo dobitizaporedje, na katerem se dani algoritem najslabse obnasa, je smiselno vzeti kar nrazlicnih vrednosti. Iz tega pa neposredno sledi, da namesto vseh moznih vhodnihzaporedij lahko obravnavamo le permutacije simbolov 1, 2, . . . , n, ki jih je skupno n!.

Sedaj se bomo poglobili v naravo casovne karakteristike, T (P, n), algoritma P prinalogi urejanja tabele dolzine n. Ce je P algoritem iz opisanega razreda, lahko zanjsestavimo drevo sledi za vhodne podatke dolzine n. To je dvojisko drevo, cigar vsakaveja predstavlja zgodovino izracuna P na neki vhodni permutaciji. Vsako vozliscedrevesa je oznaceno z mnozico permutacij, ki do njega pripelje. Na primer, korendrevesa je zaznamovan z mnozico vseh permutacij (Sn), pri neposrednih nasledni-kih korena odpadejo vse permutacije, ki niso zdruzljive z rezultatom primerjanja, kipripelje do naslednika itn.

2.1 Primer Kot primer vzamemo metodo urejanja z navadnimi zamenjavami (angl.bubblesort) pri n = 3. Metodo realizira naslednji program

Page 47: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 39

1. if a[2] > a[3] then Z(2,3) ;2. if a[1] > a[2] then Z(1,2) ;3. if a[2] > a[3] then Z(2,3) ;4. halt ;

Programu ustreza drevo sledi, ki je prikazano na sl. 2.14. Na sliki smo vsako permu-tacijo predstavili z dvema zaporedjema: na levi strani oklepaja je prvotna urejenostsimbolov, na desni pa trenutna urejenost (pri opazovanem vozliscu). Pri koncnih vo-zliscih vidimo, da so na desnih straneh oklepajev povsod simboli pravilno urejeni, karpomeni, da se je postopek urejanja pravilno koncal.

Cas programa pri neki vhodni permutaciji ocenimo s stevilom primerjanj odzacetka programa do ustavitve. Na drevesu sledi je to enako stevilu vozlisc na nekiveji. Torej: dolzina veje predstavlja kolicino T (P, In), kjer je In vhodna permuta-cija, ki pripelje do koncnega vozlisca veje. Za kolicino T (P, n) nato vzamemo dolzinonajdaljse veje v drevesu sledi programa P .

Spodnjo mejo za cas urejanja tabele dolzine n dobimo iz naslednjih premislekov:

1. Vsakemu koncnemu vozliscu drevesa sledi je prirejena najvec ena vhodna per-mutacija (dve razlicni permutaciji peljeta do razlicnih koncnih vozlisc).

2. Upostevamo le programe, ki pravilno delujejo na vseh vhodnih permutacijah, kijih je skupno n!.

Ce je T (P, n) najvecja dolzina veje drevesa sledi in ce je N stevilo koncnih vozlisc,ocitno velja,

2T (P,n) ≥ N ≥ n!. (2.11)

Prva od zapisanih relacij (2.11) je dobro znano razmerje med visino dvojiskega drevesain stevilom njegovih koncnih vozlisc, druga pa izhaja iz premislekov 1 in 2 zgoraj. Levaod relacij (2.11) se najbolj priblizuje enakosti, ko je drevo uravnotezeno. Kolicino n!predstavimo s priblizkom, ki ga daje Stirlingova formula:

n! ≈ nne−n√

2πn (2.12)

(relativna napaka te formule je manj kot 10% pri n = 1 in se zmanjsuje pri narascajocemn). Iz 2.11 in 2.12 pa dobimo,

T (P, n) ≥ cn log2 n, (2.13)

pri neki konstanti c > 0. Na podlagi (2.9) sledi, da velja tudi

T (n) ≥ cn log2 n. (2.14)

2.2.5 Shellovo urejanje (izboljsano vstavljanje)

Shellov algoritem za urejanje ima danes le zgodovinski pomen, ker predstavlja prvialgoritem za urejanje tabel, ki je porabil manj casa kot Θ(n2), kjer je n dolzina tabele.Zanimiv pa je tudi zaradi nekaterih svojih na videz protislovnih lastnosti.

Page 48: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

40 POGLAVJE 2. UREJANJE

Program 2.1: Shellovo urejanje

1 PROCEDURE Lg∗(n:LONGINT ):LONGINT ;2 VAR res:LONGINT ;4 BEGIN4 res:=0;5 WHILE n#0 DO n:=n DIV 2 ; INC (res) END;6 RETURN res7 END Lg ;99 PROCEDURE ShellParams∗(n:LONGINT ;VAR h,t :LONGINT );

10 (∗ Zacetno stevilo podtabel, t v tabeli z n podatki ter stevilo korakov h ∗)11 VAR i :LONGINT ;1314 BEGIN14 IF n>=4 THEN t :=Lg(n)−2 ELSE t :=1 END;15 h:=1;16 FOR i :=2 TO t DO h:=2∗h+1 END17 END ShellParams;1919 PROCEDURE ShellSort∗(VAR a:APItem;h,t :LONGINT );20 VAR i ,j ,k ,s:LONGINT ; x :I .PItem;21 (∗ Tabela a vsebuje na svojem zacetku h22 dodatnih elementov a[0], a[1], . . . , a[h−1],23 ki imajo vlogo cuvajev med vstavljanjem v24 podtabele; zaporedje, ki ga urejamo, pa predstavljajo25 komponente a[h], a[h+1], . . . , a[LEN(a)−1]∗)27 BEGIN27 k :=h;(∗ zacetni korak ∗)28 WHILE k >= 1 DO29 s:=h−k ; (∗ zacetni cuvaj ∗)30 FOR i :=h+k TO LEN (a)−1 DO31 x :=a[i ];j :=i−k ;32 a[s]:=x ;33 WHILE x .k < a[j ].k DO34 a[j +k ]:=a[j ];j :=j−k35 END;36 a[j +k ]:=x ;37 s:=s+1;38 IF s=h THEN s:=h−k END39 END;40 k :=(k−1) DIV 242 END42 END ShellSort ;

Shellovo urejanje (konec)

Page 49: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 41

1 2 3 1 2 3 1 2 3 1 2 3

0 1 2 3 4 5 6 7 8 9 10 11

Slika 2.15: Zacetna razdelitev tabele na podtabele

Algoritem deluje tako, da tabelo razdeli na vec podtabel (slika 2.15, desno odnavpicne crte), nato na vsaki podtabeli izvaja navadno vstavljanje. Na sliki 2.15so podtabele zaznamovane z 1, 2, 3. Za poenostavitev izstopnega pogoja iz zankeima vsaka podtabela lastnega cuvaja (levo od navpicne crte). Ko opravimo to fazopostopka, ga ponovimo z manjsim stevilom podtabel in tako nadaljujemo do stevilapodtabel, 1. V tem pa je tudi navidezna protislovnost postopka: ce postopek za-kljucimo z navadnim vstavljanjem na celotni vhodni tabeli, zakaj je hitrejsi od enegasamega navadnega vstavljanja? Odgovor je, da, medtem ko ima eno samo navadnovstavljanje znacilnost, da v povprecju pri vstavljanju prestavlja razmeroma dolgapodzaporedja (program 2.1, zanka v vrsticah 33 do 35), se dolzina zaporedij, ki jihprestavljamo pri veckratnem navadnem vstavljanju, zmanjsa.

Stevilo podtabel, na katere razdelimo vhodno tabelo v posamezni fazi, je podanokot zaporedje

h1, h2, . . . , ht,

za katerega pa velja, kot smo ze zapisali,

ht = 1, hi+1 < hi, 1 ≤ i ≤ t− 1

Matematicna analiza postopka je razmeroma zapletena, tako da se zanasamo preteznona empiricne izkusnje. Na primer, znano je, da stevila hi ne smejo imeti skupnihfaktorjev. Knuth [8, razdelek 5.2.1] priporoca zaporedje

1, 4, 13, 40, 121, . . .

(v nasprotnem vrstnem redu), za katerega velja: hk−1 = 3hk + 1, ht = 1 in t =blog3 nc − 1, ali pa

1, 3, 7, 15, 31, . . . ,

s pravilom: hk−1 = 2hk + 1, ht = 1 in t = blog2 nc − 1(2). Za slednje zaporedje lahkoz matematicno analizo izracunamo casovno zahtevnost O(n1.2), kar pa je se vednoprecej slabse od najboljsih danes znanih metod.

2.2.6 Urejanje s kopico (izboljsano izbiranje)

Urejanje s kopico ali drevesno urejanje (slika 2.16) izhaja iz ugotovitve, da se prinavadnem izbiranju ze opravljeno delo ponavlja. Namrec, potem ko med izvajanjem

2Spomnimo se, da je bxc definirano kot najvecje celo stevilo, ki ne presega x. Podobno je dxedefinirano kot najmanjse celo stevilo, ki ni manjse od x.

Page 50: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

42 POGLAVJE 2. UREJANJE

1 PROCEDURE HeapSort∗(VAR a:APItem);2 (∗ Pozor! Indeksi v tabeli so 0, 1, . . . n− 1 ∗)3 VAR l ,r : LONGINT ; x : I .PItem; (∗ 1 ≤ l, r ≤ n4 leva in desna meja podkopice ∗)5 PROCEDURE Sift ;6 VAR i ,j :LONGINT ; x : I .PItem;7 BEGIN i :=l ; j :=2∗i ; x :=a[i−1];8 WHILE j < r DO9 IF a[j−1].k < a[j ].k THEN INC (j ) END;

10 IF x .k >= a[j−1].k THEN j :=r+1 (∗ izhod iz zanke ∗)11 ELSE a[i−1]:=a[j−1]; i :=j ; j :=2∗i13 END13 END;14 IF (j =r) & (x .k < a[j−1].k) THEN15 a[i−1]:=a[j−1]; a[j−1]:=x16 ELSE a[i−1]:=x18 END18 END Sift ;2020 BEGIN l :=LEN (a) DIV 2; r :=LEN (a);21 WHILE l >= 1 DO Sift ; DEC (l) END; INC (l);22 WHILE r > 1 DO23 x :=a[0]; a[0]:=a[r−1]; a[r−1]:=x ;24 DEC (r); Sift26 END26 END HeapSort ;

Slika 2.16: Urejanje s kopico

23

9 13

15 3

17 11

10 5

1

2 3

4 5 6 7

8 9

Slika 2.17: Kopica

Page 51: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 43

9 13

15 3

17 11

10 5

1

2 3

4 5 6 7

8 9

2314

Slika 2.18: Popravljanje pokvarjene kopice

jedra zunanje zanke algoritma na sliki 2.10 poiscemo najmanjsi element, isti posto-pek ponovimo pri naslednjem izvajanju, ne glede na dejstvo, da bi bilo mozno delinformacije, ki smo jo nabrali med predhodnim izvajanjem, izkoristiti tudi kasneje.

Urejanje s kopico ohranja informacijo iz predhodnih iskanj najmanjsega elementav posebni podatkovni strukturi, ki ji pravimo kopica (angl. heap). Kopica je ure-jeno, levo uravnotezeno dvojisko drevo, katerega vozlisca hranijo informacijo o kljucih.Drevo je urejeno, ker velja, da je kljuc nekega vozlisca v ≥ od kljucev vseh vozlisc w,ki pripadajo poddrevesu s korenom v (namesto ≥ vcasih uporabljamo urejenost ≤).Drevo je uravnotezeno, ker se razlicne veje med seboj razlikujejo po dolzini kvecjemuza 1 in je levo uravnotezeno, ker so daljse veje zbrane na levi strani drevesa. Pri-mer kopice je prikazan na sliki 2.17. Bistvenega pomena za ucinkovitost metode jeucinkovita realizacija kopice s tabelaricno strukturo. Na sliki 2.17 so zraven vozlisczapisani njihovi indeksi v tabeli, ki kopico predstavlja. Pravilo za indekse je:

Ce so indeksi tabele 1, 2, . . . , n, je indeks levega naslednika vozlisca z in-deksom i enak 2i, desnega naslednika pa 2i+ 1. (V programski realizacijitabele so indeksi prestavljeni v 0, 1, . . . , n− 1.)

Nadalje je pomembno dejstvo, da je potem, ko v kopici zamenjamo koren (jo “pokva-rimo”), potrebno popraviti le enega izmed dveh poddreves, ki izvirata pri korenu. Naprimer, na sliki 2.18 smo zamenjali vrednost 23 pri korenu z novo vrednostjo, 14. Potem pri korenu ni vec izpolnjen pogoj urejenosti in je zato potrebno element 14 pre-staviti. Nalogo opravimo tako, da izberemo vecjega od dveh naslednikov (17,11), gadvignemo do korena, se spustimo do izpraznjenega vozlisca in operacijo ponavljamodo vozlisca, cigar oba naslednika sta manjsa ali enaka novemu elementu (14). Nasliki je to vozlisce z elementom 15. Novi element postavimo na pravkar izpraznjenomesto. Na sliki 2.18 kazejo prekinjene crte potrebne zamenjave. Algoritem, ki ure-snicuje opisan postopek (“pogrezanja”), je na sliki 2.16 zapisan v vrsticah 5 do 18.Je pa sestavljen tako, da ga lahko sprozimo tudi na poddrevesu (“podkopici”) celotne

Page 52: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

44 POGLAVJE 2. UREJANJE

9

15 13

17 3

23 10

11 5

1

2 3

4 5 6 7

8 9

Slika 2.19: Sestavljanje kopice

kopice, pri cemer je poddrevo doloceno z indeksoma l, ki predstavlja indeks korena,in r, ki predstavlja zadnji element na skrajno desni veji poddrevesa. Zaradi dejstva,da se pogrezanje pomika od korena po neki veji navzdol (v skrajnem primeru do listadrevesa), zahteva cas O(log2 n), kjer je n stevilo elementov v kopici.

Do sedaj nismo obravnavali, kako iz nakljucno urejene tabele pridobimo kopico.Izkaze se, da tudi to nalogo lahko opravimo z operacijo pogrezanja. Primer je prikazanna sliki 2.19: koncna vozlisca drevesa obravnavamo kot poddrevesa velikosti 1, ki so vvsakem primeru ze kopice (oziroma “podkopice”). Zato postopek zacnemo pri prvemvozliscu, ki predstavlja koren nekega poddrevesa, ki ima velikost vecjo kot 1. To je vnasem primeru vozlisce z indeksom 4 (v splosnem pa je to vozlisce z indeksom nDIV2).V nasem konkretnem primeru je pogoj urejenosti izpolnjen, zato nadaljujemo v smeripuscic. Naslednje vozlisce je 10. V tem primeru algoritem za popravljanje kopicezamenja 10 in 11. Pri vozliscu 23 je pogoj urejenosti zopet izpolnjen. Koncno privozliscu 9 algoritem za popravljanje kopice postavi 9 v koncno vozlisce skrajno leveveje, prejsnje vrednosti pa prestavi po veji za eno mesto visje. Na ta nacin dobimokopico, ki je prikazana na sliki 2.17. Celoten postopek pa zaseda v algoritmu na sliki2.16 le eno vrstico, 21.

Analiza casovne zahtevnosti. Na podlagi pravkar podanega opisa in najvecjeporabe casa algoritma pogrezanja (O(log2 n)) ni tezko podati ocene porabe casa al-goritma na sliki 2.16. Postopek sestavljanja kopice zahteva cas ≤ cn2 log2 n (pri nekikonstanti c), medtem ko samo urejanje (vrstice 22 – 25) zahteva ≤ c′n log2 n. Torejje celotna poraba casa O(n log n).

2.2.7 Urejanje s porazdelitvami (izboljsane zamenjave)

Pri metodi navadnih zamenjav (slika 2.11) izvajamo zamenjave na izredno neucinkovitnacin, saj sprehod po vseh elementih tabele po vrsti in zamenjava nepravilno po-stavljenih sosednjih elementov le pocasi pripelje do zelene urejenosti. Mnogo bolj

Page 53: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 45

1 PROCEDURE Partition∗(VAR a:APItem;2 VAR l ,r : LONGINT ;3 m:LONGINT );4 VAR i ,j : LONGINT ;5 BEGIN6 i :=l ; j :=r ;8 REPEAT8 WHILE a[i−1].k < m DO INC (i) END;9 WHILE a[j−1].k > m DO DEC (j ) END;

10 IF i <= j THEN Exch(a[i−1],a[j−1]);11 INC (i);DEC (j )13 END13 UNTIL i > j ;14 l :=i ; r :=j15 END Partition;1717 PROCEDURE QuickSort∗(VAR a:APItem);1919 PROCEDURE Sort(l ,r : LONGINT );20 VAR i ,j :LONGINT ;21 BEGIN i :=l ; j :=r ;22 Partition(a,i ,j ,a[((l+r) DIV 2)−1].k);23 IF l < j THEN Sort(l ,j ) END;24 IF i < r THEN Sort(i ,r) END25 END Sort ;2727 BEGIN Sort(1,LEN (a))28 END QuickSort ;

Slika 2.20: Urejanje z porazdelitvami

ucinkovito je zamenjave izvajati na elementih, ki so na vecjih medsebojnih razdaljah.Opisano idejo realiziramo tako, da na vsakem koraku tabelo porazdelimo tako, da

so vsi elementi s kljuci, ki so enaki neki mejni vrednosti ali manjsi od nje, razmesceniv spodnjem delu tabele, oni, ki pa so enaki ali vecji, pa v zgornjem delu tabele. Nata nacin nalogo lahko resimo z rekurzivnim razcepom. Opisano porazdelitev je moznodoseci tako, da se z indeksom i sprehodimo od zacetka tabele proti koncu, z drugimindeksom, j, pa od konca proti zacetku. Indeks i se ustavi pri prvem elementu, ki je ≥od mejne vrednosti, indeks j pa pri prvem elementu, ki je ≤ od mejne vrednosti. Natose opravi zamenjava, postopek pa se nadaljuje do trenutka, ko se indeksa srecata. Nata nacin dobimo v podtabeli, ki obsega indekse od zacetka do mesta srecanja i in j,vrednosti, ki so enake mejni vrednosti ali manjse od nje, v komplementarni podtabelipa vrednosti, ki so enake mejni vrednosti ali vecje od nje. Posebno vprasanje je, kakoizbrati mejno vrednost. Ocitno bi bilo zazeleno, da postopek porazdelitve prvotnotabelo razdeli na dva enaka dela, vendar, zal, tega ne moremo zagotoviti, ker nimamo

Page 54: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

46 POGLAVJE 2. UREJANJE

3 2 5 7 6 1 8 4i j

3 2 5 4 6 1 8 7j i

3 2 5 4 6 1 8 7i j

3 2 1 4 6 5j i

7 8

3 2 1 4 6 5i j1 2 3 4 5 6

i, j1 3 42

1.

2.

3.

4.

5.

6.

7.

!!

!!

Slika 2.21: Primer urejanja s porazdelitvami

nobene informacije o zacetni urejenosti elementov. Zato so vse izbire mejne vrednostienakovredne. V algoritmu na sliki 2.20 uporabljamo za mejno vrednost kljuc elementaa[(l + r)DIV 2 − 1] (bodimo pozorni, da so i, j, l in r v mejah [1, LEN(a)], medtemko so indeksi tabele v mejah [0, LEN(a)− 1]).

Primer. Na sliki 2.21 je prikazan konkreten primer urejanja s porazdelitvami. Priprvi porazdelitvi je mejna vrednost 7 in zato se indeksa i in j ustavita, kot je toprikazano v prvi vrstici. Po opravljeni zamenjavi indeksa nadaljujeta svojo pot in seustavita, kot je to nakazano v drugi vrstici. Tu ugotovimo, da bi pri urejanju prislo donapake, ce bi uporabili pravilo, da po ustavitvi indeksov obvezno pride do zamenjave,saj bi se 1 in 8, ki sta v drugi vrstici pravilno urejena, postavila nepravilno. Zaraditega je pred zamenjavo potrebno preveriti pogoj i ≤ j (slika 2.20, vrstice 10 – 12)Sedaj je prva porazdelitev opravljena (tretja vrstica) in lahko loceno nadaljujemo zurejanjem podtabel od indeksa 1 to 6 ter od 7 do 8. Pri porazdelitvi prve podtabele jesedaj mejna vrednost 5 in se indeksa ustavita, kot je to prikazano (tretja vrstica). Pozamenjavi indeksa nadaljujeta svoji potovanji, dokler se ne ustavita, kot je to prika-zano v cetrti vrstici. V cetrti vrstici pride do podobnega problema kot v drugi vrstici(in potrebe po preverjanju, ali sta se pred zamenjavo indeksa srecala). V peti vrsticije prikazan rezultat druge porazdelitve, nato pa nadaljujemo s porazdeljevanjem levepodtabele z mejno vrednostjo 2. Po zamenjavi dobimo urejeno zaporedje (vrstica 6),vendar se postopek nadaljuje se za en korak (vrstica 7). V tem primeru algoritemopravi nepotrebno zamenjavo (element 2 zamenja s samim seboj), vendar je tak al-goritem v povprecju hitrejsi, kot ce bi preverjali, ali velja i = j. Ostale podtabelese urejajo na podoben nacin, le da je za to potreben vedno samo en korak, ker sovelikosti 2.

Page 55: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 47

Analiza casovne zahtevnosti. Znacilnost metode je, da je dobra (in to zelo dobra)le v povprecnem primeru, medtem ko je njeno obnasanje v najslabsem primeru (kipa nastopi izredno redko) slabo. Izhodisce za oceno casovne zahtevnosti je cas, ki gaporabi postopek porazdeljevanja. Ni se tezko prepricati, da procedura Partition (slika2.20, vrstice 1–15) za tabelo velikosti n porabi cas Θ(n). Na podlagi tega podatkaze vemo, da je cas, ki bi ga porabilo urejanje s porazdelitvami, ce bi tabelo vednorazdelili na dva enaka dela,

T=(n) = Θ(n log n) (2.15)

(gl. nalogo 4) in glede na dejstvo, da je to po velikostnem redu enako spodnji meji zacas urejanja tabele dolzine n (2.11), domnevamo, da je to najboljsi cas, ki ga metodazmore.

Sedaj bomo ocenili povprecni cas. Povprecje je pricakovana vrednost neke slucajnespremenljivke, kjer vsaki mozni vrednosti pripisemo neko verjetnost. V nasem primeruje slucajna spremenljivka, ki nas zanima, cas, ki ga porabi urejanje s porazdelitvami natabeli dolzine n, razlicni mozni izidi pa ustrezajo razlicnim velikostim k leve podtabele,ki nastane kot rezultat porazdelitve (k = j − l + 1 v vrstici 22 na sliki 2.20).

Najprej razmislimo, koliksen je razpon vrednosti velikosti podtabel, na katererazdelimo prvotno tabelo dolzine n. Ocitno je, da nobena od dveh podtabel ni vecjaod n − 1, kajti vsak od indeksov i in j se premakne vsaj enkrat. Druga skrajnavrednost velikosti podtabele je 0, ki ustreza primeru, ko se na primer vrednost jspusti pod vrednost l (bralec naj poskusa poiskati pogoje, pod katerimi se to zgodi).Po tem razmisleku lahko nasetejemo dva privzetka, na podlagi katerih bomo definiralirekurencno relacijo za izracun casa:

1. pri vsaki porazdelitvi se tabela velikosti n razdeli na dva dela, od katerih imaeden velikost k, drugi pa n− k − 1 pri 0 ≤ k ≤ n− 1;

2. vse vrednosti k so enakoverjetne, torej je verjetnost, da je leva podtabela veli-kosti k enaka 1

n za vse 0 ≤ k ≤ n− 1.

Prvi privzetek pravzaprav ne ustreza resnicnosti, kajti tabela se porazdeli v privzetemsorazmerju le takrat, ko sta indeksa i in j po izhodu iz dveh zank v vrsticah 8 in 9 nasliki 2.20, enaka (iz tega sledi, da je element s tem indeksom enak mejnemu elementu).V primeru, ko je indeks tega elementa k + 1, se opravi fiktivna zamenjava elementaa[k+ 1] s samim seboj in se vrednost j spusti na k, vrednost i pa dvigne na k+ 2. Iztega sledi, da je velikost leve podtabele enaka k, desne pa n−k−1. Bolj pogost pa jeizid porazdeljevanja, ko se tabela porazdeli v razmerju k : n− k. Vendar bomo kljubmalenkostni napaki zapisani privzetek uporabili, ker nam omogoca zapis preprosterekurencne relacije, ki povezuje povprecni cas za urejanje tabele dolzine n, Tave(n), zvrednostmi iste kolicine pri manjsih vrednostih parametra n:

Tave(n) =

0 pri n = 0 ali n = 1

cn+ 1n

∑n−1i=0 [Tave(i) + Tave(n− i− 1)] , pri n ≥ 2,

(2.16)

Page 56: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

48 POGLAVJE 2. UREJANJE

pri cemer je cn cas potreben za porazdelitev na levi in desni del, vsota pa je pricakovanicas za urejanje obeh delov tabele. (gl. tudi nalogo 5.1). Drugo vrstico enacbe (2.16)lahko spremenimo v naslednjo obliko:

Tave(n) = cn+2

n

n−1∑i=0

Tave(i). (2.17)

Sedaj dokazemo z indukcijo po n, da pri n ≥ 2 velja

Tave(n) ≤ 2(c+ δ)n lnn, (2.18)

kjer je δ neka majhna konstanta, ki jo bomo ocenili naknadno. Pri n = 2 sledi(2.18) neposredno iz (2.17) (2 ln 2 ≈ 1.38) za poljubno nenegativno vrednost δ. Vinduktivnem koraku najprej prepisemo (2.17) v obliko

Tave(n) ≤ cn+4(c+ δ)

n

n−1∑i=0

i ln i. (2.19)

Funkcija x lnx ima pozitiven prvi odvod na intervalu [1, n], torej lahko zapisemo napodlagi (1.12),

n−1∑i=1

i ln i≤∫ n

1

x lnxdx=x2

2(lnx− 1

2)n

1

=n2

2(lnn− 1

2) +

1

4,

(2.20)

in ce vstavimo desno stran (2.20) v (2.19), koncno dobimo,

Tave(n) ≤ cn+ 4(c+δ)n

[n2

2 (lnn− 12 ) + 1

4

]= 2(c+ δ)n lnn− δn+ (c+δ)

n .(2.21)

δ dolocimo iz pogoja (c+δ)n − δn ≤ 0 pri n ≥ 3, kar daje δ ≥ c

8 .Sedaj se lotimo ocene za najvecjo porabo casa. V tem primeru izhajamo iz naj-

manjsega casa urejanja s porazdelitvami, T=(n) [gl. (2.15)] in zelimo raziskati od-visnost casa od razlicnih porazdelitev prvotne tabele na dve podtabeli. Vpeljemofunkcijo dveh spremenljivk T2(x, n), 1 ≤ x ≤ n − 1, z vrednostjo, enako porabi casapri urejanju s porazdelitvami, ce prvotno tabelo razdelimo v razmerju [x, n− x], po-drejene tabele pa tako, da je poraba casa najmanjsa. Izracun si bomo poenostavilitako, da bomo obe spremenljivki, x in n obravnavali kot realni spremenljivki. Ker jev tem primeru T=(x) zvezna in ima prvi odvod pri x ≥ 1, lahko zapisemo,

T2(x, n) = cn+ T=(x) + T=(n− x)= cn+ kx lnx+ k(n− x) ln(n− x),

kjer je k neka konstanta indT2(x, n)

dx= ln

x

n− x. (2.22)

Page 57: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 49

Pri x = n/2 ima odvod (2.22) vrednost 0, pri x < n/2 je negativen, pri x > n/2pa pozitiven. Torej T2(x, n) monotono narasca, ko se x priblizuje 1 oziroma n. Ceisti premislek uporabimo na dveh podtabelah, na katere smo razdelili prvotno tabelo,dobimo se bolj strmo narscanje casa, ko se x priblizuje 1 oziroma n. Torej sklepamo,da urejanje s porazdelitvami porabi najvec casa v primeru, ko so vse pod-tabele, ki imajo velikost razlicno od 1, razdeljene v razmerju [1 : m− 1], ceje m velikost vsakokratne podtabele. V tem primeru dobimo vrednost porabecasa tako, da sestejemo vse case, ki so potrebni za porazdeljevanje prvotne tabele inpodrejenih tabel:

Tmax(n) = c

n−1∑i=1

i = Θ(n2).

Poraba pomnilnega prostora. Na zacetku razdelka o urejanju tabel (2.2) smozapisali, da nas zanimajo le algoritmi, ki ne porabijo bistveno vec prostora, kot gazasedajo vhodni podatki. Sedaj bomo preverili, ali urejanje s porazdelitvami ta pogojizpolnjuje.

Najprej si zastavimo vprasanje, kje lahko pride v algoritmu na sliki 2.20 do do-datne porabe prostora, saj na prvi pogled ne zasledimo drugih podatkovnih strukturkot vhodne tabele a. Izkaze se, da je vir dodatne porabe mehanizem rekurzije, kiga uporabljamo za evidenco se neopravljenih porazdelitev. Namrec, ko tabelo raz-delimo na dva dela, lahko neposredno nadaljujemo delo le na enem delu, podatkeo drugem pa moramo shraniti. Za to sta primerna podatkovna struktura sklad inmehanizem rekurzije. Ker je dandanes mehanizem rekurzije vgrajen v prakticno vseprogramske jezike, so njegove podrobnosti pred programerjem skrite. Vendar, kerzelimo analizirati prav lastnosti tega mehanizma, bomo zapisali program za urejanjes porazdelitvami tako, da bo rekurzijo uporabljal izrecno, kar nam bo omogocilo, dapreverimo njene lastnosti.

Program je prikazan na sliki 2.22 z nekoliko vec podrobnosti kot prejsnji programi.V vrsticah 4–12 so najprej zapisani potrebni podatkovni tipi, med katerimi opozar-jamo na osnovni tip sklada StackRec, ki rabi za shranjevanje podatkov o podtabelahprvotne tabele, in sicer v obliki leve in desne meje ter na tip SortStruc, ki zdruzujevse podatke, ki so potrebni pri urejanju. Vse procedure, ki so deklarirane v moduluNRQuickSort na sliki 2.22, so procedurne konstante, ki so prirejene prav tipu Sort-Struc. Primerek tipa dinamicno zgeneriramo s klicem procedure Init (vrstice 14–17).Procedure Push, Pop in Empty v vrsticah 19–31 predstavljajo dobro znane osnovneoperacije, ki pripadajo podatkovni strukturi sklada.

V proceduri Sort (vrstice 33–46), ki dejansko opravlja urejanje, na zacetku (vrstica37) vstavimo v sklad podatke o celotni tabeli (leva meja je 1, desna, LEN (a)), natovstopimo v zanko (vrstice 38–45), ki z vrha sklada jemlje podatke o podtabelah invsakic sprozi porazdelitev.

V kaksnem primeru pride do najvecje porabe prostora za sklad? Ocitno takrat,ko je po vsakem izvajanju porazdelitvene procedure v vrstici 41 indeks i enak r in je

Page 58: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

50 POGLAVJE 2. UREJANJE

1 MODULE NRQuickSort ;2 IMPORT A:=ArrSort ,I :=IntSort ,S :=Sort ;45 TYPE5 StackRec=RECORD6 l ,r :LONGINT7 END;8 PStack=POINTER TO Stack ;9 Stack=ARRAY OF StackRec;

10 SortStruc∗=RECORD11 a∗:A.PAPItem; s∗:PStack ; t∗:LONGINT12 END;1414 PROCEDURE (VAR o:SortStruc)Init∗(m,n:LONGINT );15 BEGIN (∗ dinamicno generiramo tabelo a in sklad ∗)16 NEW (o.a,m); NEW (o.s,n); o.t :=017 END Init ;1919 PROCEDURE (VAR o:SortStruc)Push∗(l ,r :LONGINT );21 BEGIN21 o.s[o.t ].l :=l ; o.s[o.t ].r :=r ; INC (o.t)22 END Push;2424 PROCEDURE (VAR o:SortStruc)Pop∗(VAR l ,r :LONGINT );26 BEGIN26 DEC (o.t); l :=o.s[o.t ].l ; r :=o.s[o.t ].r27 END Pop;2929 PROCEDURE (VAR o:SortStruc)Empty∗():BOOLEAN ;30 BEGIN RETURN o.t=031 END Empty ;3333 PROCEDURE (VAR o:SortStruc)Sort∗;34 VAR i ,j ,l ,r : LONGINT ;3636 BEGIN37 o.Push(1,LEN (o.a↑));38 REPEAT39 o.Pop(l ,r);40 REPEAT i :=l ;j :=r ;41 A.Partition(o.a↑,i ,j ,o.a[((l+r)DIV 2)−1].k);42 IF i <= r THEN o.Push(i ,r) END;43 r :=j44 UNTIL l >= r45 UNTIL o.Empty()46 END Sort ;4848 END NRQuickSort .

Slika 2.22: Uporaba samostojnega sklada pri urejanju s porazdelitvami

Page 59: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.2. NOTRANJE UREJANJE 51

cas (v stot. sek)metoda n =1024 2048 5000 10000 20000n. zamenjave 22 93 576 2636 13297n. vstavljanje 8 39 243 1103 6677kopica 0 1 4 13 35porazdelitve 0 0 2 5 15

Slika 2.23: Rezultati urejanja razlicno dolgih zaporedij stevil

velikost tabele, na katero se nanasa nov ukaz iz vrstic 42 in 43, enaka 1. V takemprimeru bi algoritem dodal n ukazov (za urejanje podtabel velikosti 1) na sklad in bitorej za sklad potrebovali prostor Θ(n) (do enakega pojava pride v primeru, ko je nakoncu porazdelitve, j = 1). Glede velikostnega reda se seveda nic ne spremeni, ce bialgoritem postopal nekoliko bolj pametno in ukazov za urejanje podtabel velikosti 1ne bi zapisoval (temvec le take ukaze, ki se nanasajo na vecje podtabele). Seveda jetaksno obnasanje algoritma v nasprotju s pogojem, ki smo ga omenili na zacetku raz-delka. Vendar se izkaze, da je resitev tega problema presenetljivo preprosta: potrebnoje le primerjati velikosti intervalov [l, j] in [i, r] ter v sklad zapisati vecji interval. Nata nacin se velikost intervala, ki ga trenutno obdelujemo v zanki v vrsticah 40–44,najmanj prepolovi in med izvajanjem zanke ne moremo zapisati vec kot log2 n ukazovv sklad. Torej je potrebno zamenjati vrstic 42 in 43 z naslednjim stavkom:

IF (l < j )&(j−l>=r−i) THEN o.Push(l ,j );l :=iELSIF i < r THEN o.Push(i ,r);r :=jEND

V tem primeru je mozno za velikost sklada izbrati log2 n.

2.2.8 Primerjava razlicnih metod urejanja

Stiri metode urejanja tabel (dve navadni in dve izboljsani) smo tudi prakticno preiz-kusili. Tabela na sliki 2.23 prikazuje rezultate urejanja razlicno dolgih zaporedij 32-bitnih stevil. Za vsako dolzino smo nekajkrat nakljucno generirali opisano zaporedje,opravili meritev dejanske porabe casa (v stotinkah sekunde) na osebnem racunalnikuin nato izracunali povprecen rezultat. Slika 2.24 pa podatke iz tabele 2.23 prikazujegraficno v dvojno logaritemskem merilu.

2.2.9 Iskanje k-tega elementa v tabeli

Tehniko porazdelitve iz razdelka 2.2.7 lahko uporabimo tudi za resevanje nekega do-datnega problema: podana je neurejena tabela in zelimo poiskati k-ti element povelikosti. Seveda je mozno nalogo resiti tako, da tabelo uredimo in nato vzamemoelement z indeksom k. Toda ta nacin zahteva, kot ze vemo, cas Θ(n log n). Zastavlja

Page 60: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

52 POGLAVJE 2. UREJANJE

1

1024 2048 5000 10000 200001

10

50100

5001000

50001000019000

................................................

..............................................

..............................................

..............................................

..............................................

..............................................

...............................................

................................................

..............................................

..............................................

..............................................

..............................................

..............................................

..............................................

....................

............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. ............. .

............. ............. 4.0683 · 10−4n log10 n

........................................ 3.324 · 10−5n2

urejanje s kopico

urejanje s porazdelitvami

? navadne zamenjave

• navadno vstavljanje

sek−2

n

?

?

?

?

?

Slika 2.24: Graficna primerjava razlicnih metod urejanja

1 PROCEDURE Find∗(VAR a:APItem;k : LONGINT );2 VAR i ,j ,l ,r : LONGINT ;3 BEGIN4 l :=1; r :=LEN (a);5 WHILE l<r DO6 i :=l ; j :=r ;7 Partition(a,i ,j ,a[k−1].k);8 IF j<k THEN l :=i9 ELSIF k<i THEN r :=j

11 END12 END12 END Find ;

Slika 2.25: Iskanje k-tega elementa po velikosti

Page 61: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 53

se nam torej vprasanje, ali je mozno na racun bolj enostavne naloge zmanjsati cas,ki je potreben za njeno resitev. Izkaze se, da je nalogo mozno resiti z algoritmom, kije prakticno istoveten algoritmu urejanja s porazdelitvami, le da moramo vzeti mejox = a[k] ter spremeniti postopek, ki sledi porazdelitvi. Pri porazdelitvi so mozni trijeizidi: element a[k] je bodisi manjsi od k-tega po velikosti, enak ali vecji. V prvemprimeru je meja med podtabelama, ki sta rezultat porazdelitve, manjsa od k, v dru-gem je meja tocno pri k-tem elementu in v tretjem primeru je meja vecja od k. Vprvem primeru nadaljujemo z resevanjem iste naloge na podtabeli [j, r] (pri cemer vtej tabeli iscemo k− j + 1 element); v drugem primeru smo resitev nasli in v tretjemprimeru nadaljujemo z resevanjem iste naloge na podtabeli [l, i].

Analiza porabe casa. Glede na to, da je algoritem le nekoliko predelan algoritemurejanja s porazdelitvami, je pricakovati, da ima podobne znacilnosti. Tudi v temprimeru je najslabsi cas Θ(n2), kajti, ce je izid porazdelitve na vsakem koraku [1,m−1](m je velikost vsakokratne podtabele), je potrebno opraviti porazdelitev zaporedjapodtabel velikosti n, n − 1, . . . , 1, za kar je potreben kvadraticen cas. Ko pa imamosreco, je rezultat porazdelitve na vsakem koraku priblizno [m2 ,

m2 ] in moramo opraviti

porazdelitev na zaporedju podtabel velikosti n, n2 ,n4 , . . . , 1, kar zahteva cas Θ(n).

2.3 Zunanje urejanje

Pri razvijanju algoritmov za zunanje urejanje izhajamo iz osnovnih deklaracij, ki soprikazane na sliki 2.26. V pricujoci knjigi se nimamo namena spuscati v podrobnostioperacij z datotekami, oziroma trakovi, zato bomo uporabljali dolocene procedure, kiso deklarirane drugje, jih pa uporabnik modula za sortiranje lahko priredi spremen-ljivkam InitRd, InitWr, Rd in Wr (vrstice 23–25). Prvi dve proceduri pripravita trakza branje ali pisanje, preostali dve pa nanj bereta ali piseta.

2.3.1 Navadno zlivanje

Navadno zlivanje predstavlja osnovo, oziroma izhodisce za vse algoritme zunanjegaurejanja. Metoda deluje tako, da z vhodnega zaporedja bere podzaporedja dolzinek, za katera privzemamo, da so ze urejena, in jih izmenicno zapisuje na dva izhodnatrakova, nato pa s teh dveh trakov podzaporedja dolzine k zliva nazaj na vhodnitrak v podzaporedja dolzine 2k. Zlivanje dveh (urejenih) podzaporedij pomeni se-stavljanje novega urejenega podzaporedja iz elementov prvotnih podzaporedij. Nazacetku je k = 1, opisani postopek pa se ponavlja, dokler ne preostane eno samodolgo (pod)zaporedje (gl. sliko 2.27). Opisana struktura algoritma je jasno razvidnaiz osnovnega bloka programa 2.2 (vrstice 53-60). Pri notranjih procedurah procedurenavadnega zlivanja naj opozorimo na znacilno zgradbo procedure, ki zliva dve podza-poredji v novo podzaporedje dvakratne dolzine (MergeRun, ki zaseda vrstice 29–44):sestavljena iz treh zank, od katerih se prva izvaja v primeru, ko sta oba trakova ne-prazna, oziroma ko ustrezni podzaporedji nista zakljuceni; druga (oziroma tretja) pa,

Page 62: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

54 POGLAVJE 2. UREJANJE

1 MODULE FileSort ;2 IMPORT I :=IntSort ;45 TYPE5 PAL=POINTER TO AL;6 AL=ARRAY OF LONGINT ;7 PAPItem∗=POINTER TO APItem;8 APItem=ARRAY OF I .PItem;

1010 PSeq∗=POINTER TO Seq ;11 Seq∗=RECORD12 END ;13 FSeqInit∗ =PROCEDURE(p:PSeq);14 FRdItem∗ =PROCEDURE(p:PSeq):I .PItem;15 FWrItem∗ =PROCEDURE(p:I .PItem;q :PSeq);16 FCpyRun∗ =PROCEDURE( inf ,outf :PSeq ;17 VAR pI :I .PItem;18 VAR lastK :LONGINT );19 FPPSort∗ =PROCEDURE(in:PSeq ;VAR f :ARRAY OF PSeq):PSeq ;20 FNoParam∗=PROCEDURE;2223 VAR23 InitRd∗,InitWr∗:FSeqInit ;24 Rd∗:FRdItem;25 Wr∗:FWrItem;26 CopyRun∗:FCpyRun;27 SpecInit∗:FNoParam;

Slika 2.26: Osnovne deklaracije pri zunanjem urejanju

vhod:3; 7; 1; 2; 8; 6; 5; 4po prvi porazdelitvi:3; 1; 8; 57; 2; 6; 4

po prvem zlivanju:3, 7; 1, 2; 6, 8; 4, 5

po drugi porazdelitvi:3, 7; 6, 81, 2; 4, 5

po drugem zlivanju:1, 2, 3, 7; 4, 5, 6, 8

po tretji porazdelitvi:1, 2, 3, 74, 5, 6, 8

po tretjem zlivanju:1, 2, 3, 4, 5, 6, 7, 8

(Meje med podzaporedji so nakazane s podpicji, ki pa rabijo le kot pomoc bralcu; sicer pa vhodni

podatki ne vsebujejo nobenega posebnega znaka, ki bi podzaporedja loceval med seboj.)

Slika 2.27: Primer navadnega zlivanja

Page 63: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 55

ko je prvi (oziroma drugi) trak neprazen, oziroma nima zakljucenega podzaporedja.Pri tem programu ni tezko oceniti njegovega casa delovanja: ocenimo ga s casom,

ki je potreben za branje trakov, saj je to najbolj potratna operacija. Naj bo stevilopodatkovnih zapisov N . Glede na to, da se dolzina urejenih podzaporedij po vsakemzlivanju podvoji, je ocitno potrebnih log2(N) korakov porazdelitve in zlivanja, pricemer na vsakem takem koraku trak s podatki preberemo dvakrat. Torej je casoperacije navadnega zlivanja Θ(N log2(N)). Ker smo na ta nacin ze takoj dosegli“magicno” mejo Θ(N log(N)), so naprej mozne le se izboljsave za konstanten faktor.Vendar pa imamo glede tega se znatne zaloge, kot bomo videli kasneje.

Ko razmisljamo o moznih izboljsavah navadnega zlivanja, nam pride na misel nekajidej:

1. odpraviti posebna koraka porazdelitve in zlivanja ter porazdelitev na dva tra-kova izvajati istocasno z zlivanjem. Ker v tem primeru potrebujemo dva vhodnain dva izhodna trakova, pravimo tej metodi uravnotezeno zlivanje. Ucinek iz-boljsave je, da cas operacije prepolovimo;

2. povecati hitrost z uporabo vec vhodnih trakov. Takemu zlivanju pravimo vecsmernozlivanje. Ni se tezko prepricati, da vecsmerno zlivanje z n vhodnimi trakovizmanjsa cas z N log2(N) (kar velja za dva trakova) na N logn(N);

3. v primeru, ko znotraj vhodnega zaporedja ze obstajajo urejena podzaporedja,zlivati taka podzaporedja in ne podzaporedja vnaprej dolocene dolzine. Takemuzlivanju pravimo naravno zlivanje, ker izkorisca ze obstojeco urejenost vhodnegatraku. Najvecje urejeno podzaporedje v zaporedju, ki ga urejamo, poimenujemoceta. Bodimo pozorni, da ima “najvecje” pomen, da zaporedja ni mozno po-daljsati s prikljucitvijo sosednih elementov in ne, da je tako zaporedje po dolzininajdaljse (glej sliko 2.28). Izboljsava, ki jo vnasa naravno zlivanje, pa je odvi-sna od stopnje predhodne urejenosti vhodnih podatkov, oziroma od zacetnegastevila cet.

Program 2.2: Navadno zlivanje

1 PROCEDURE MergeSort∗(io,aux1 ,aux2 :PSeq);2 VAR k ,l :LONGINT ;44 PROCEDURE InitLoop;6 BEGIN6 InitRd(io); InitWr(aux1 ); InitWr(aux2 )7 END InitLoop;9

se nadaljuje

Page 64: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

56 POGLAVJE 2. UREJANJE

Navadno zlivanje (nadaljevanje)

9 PROCEDURE Distribute;10 VAR p:I .PItem;1212 PROCEDURE CopyKseq(in,out :PSeq ;VAR p:I .PItem):BOOLEAN ;13 VAR i :LONGINT ;14 BEGIN i :=0;15 WHILE (p#NIL) & (i<k) DO16 Wr(p,out); INC (i); p:=Rd(in)17 END;18 RETURN i=k19 END CopyKseq ;2122 BEGIN22 p:=Rd(io);23 WHILE CopyKseq(io,aux1 ,p) & CopyKseq(io,aux2 ,p) DO END24 END Distribute;2626 PROCEDURE Merge(in1 ,in2 ,out :PSeq);27 VAR p1 ,p2 :I .PItem;2929 PROCEDURE MergeRun ;30 VAR i1 ,i2 :LONGINT ;31 BEGIN i1 :=0;i2 :=0;32 WHILE (p1#NIL)&(i1<k)&(p2#NIL)&(i2<k) DO33 IF p1 .k<p2 .k THEN34 Wr(p1 ,out);INC (i1 );p1 :=Rd(in1 )35 ELSE Wr(p2 ,out);INC (i2 );p2 :=Rd(in2 )37 END37 END;38 WHILE (p1#NIL)&(i1<k) DO39 Wr(p1 ,out);INC (i1 );p1 :=Rd(in1 )40 END;41 WHILE (p2#NIL)&(i2<k) DO42 Wr(p2 ,out);INC (i2 );p2 :=Rd(in2 )44 END44 END MergeRun;4647 BEGIN47 InitWr(out);InitRd(in1 );InitRd(in2 );48 p1 :=Rd(in1 ); p2 :=Rd(in2 );49 REPEAT MergeRun; INC (l)50 UNTIL (p1 = NIL) & (p2 = NIL)51 END Merge;53

se nadaljuje

Page 65: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 57

vhod:7 ; 3, 6, 11; 8, 13; 9, 12; 1, 16; 10; 4, 15; 5; 2, 14;po porazdelitvi:7, 8, 13; 1, 16; 4, 15; 2, 14;3, 6, 11; 9, 12; 10; 5;po prvem zlivanju (in porazdelitvi):3, 6, 7, 8, 11, 13; 4, 10, 15;1, 9, 12, 16; 2, 5, 14;po drugem zlivanju (in porazdelitvi):1, 3, 6, 7, 8, 9, 11, 12, 13, 16;2, 4, 5, 10, 14, 15;po tretjem zlivanju:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16;

(Meje med cetami so nakazane s podpicji, ki pa rabijo le kot pomoc bralcu; sicer pa vhodni podatki

ne vsebujejo nobenega posebnega znaka, ki bi loceval cete med seboj.)

Slika 2.28: Primer naravnega, uravnotezenega, dvosmernega zlivanja

Navadno zlivanje (nadaljevanje)

53 BEGIN k :=1;54 REPEAT InitLoop;55 Distribute; (∗ porazdelitev ∗)56 l :=0;57 Merge(aux1 ,aux2 ,io) ; (∗ zlivanje ∗)58 k :=2∗k59 UNTIL l=1;60 END MergeSort ;

Navadno zlivanje (konec)

2.3.2 Naravno, uravnotezeno, dvosmerno zlivanje

V tem razdelku bomo opisali proceduro, ki vsebuje dve od prej omenjenih treh moznihizboljsav navadnega zlivanja: odpravili bomo poseben korak porazdelitve in namestopodzaporedij dolzine k, zlivali cete. Zlivanje cet pomeni, da moramo namesto proce-dure CopyKseq (vrstice 12-19 v programu 2.2) uporabljati proceduro SimpleCopyRun:

PROCEDURE SimpleCopyRun( inf ,outf :PSeq ;

VAR pI :I .PItem;VAR lastK :LONGINT );

(∗ Prepis ene cete; privzetek: na zacetku p # NIL ∗)BEGINREPEAT Wr(pI ,outf ); lastK :=pI .k ; pI :=Rd(inf )UNTIL (pI =NIL) OR (lastK>pI .k)

END SimpleCopyRun;

(2.23)

Page 66: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

58 POGLAVJE 2. UREJANJE

ki pa jo uporabljamo tako, da pred uporabo programa priredimo procedurni spremen-ljivki CopyRun (na sliki 2.26) proceduro SimpleCopyRun (posreden doseg do proce-dure SimpleCopyRun uporabljamo zato, ker bomo kasneje potrebovali dve razliciciprocedure CopyRun in jih bo primerno izbirati tako, da enkrat spremenljivki Co-pyRun priredimo eno proceduro, drugic pa drugo).

Program za naravno, uravnotezeno, dvosmerno zlivanje je prikazan kot program2.3, pri cemer podrejena procedura Distribute(t1, t2, t3, t4) (vrstice 32-47) zlije inporazdeli cete s trakov t1 in t2 na t3 in t4, kot rezultat pa vrne stevilo zapisanih cet.

Program 2.3: Naravno, uravnotezeno, dvosmerno zlivanje

1 PROCEDURE NatBal2MergeSort∗(io,aux1 ,aux2 ,aux3 ,aux4 :PSeq):PSeq ;33 PROCEDURE InitProg ;4 VAR p:I .PItem;last :LONGINT ;6 BEGIN6 InitRd(io); p:=Rd(io);7 InitWr(aux1 ); InitWr(aux2 );8 (∗ zacetna porazdelitev ∗)9 REPEAT CopyRun(io,aux1 ,p,last) ;

10 IF p#NIL THEN CopyRun(io,aux2 ,p,last) END11 UNTIL p=NIL12 END InitProg ;1414 PROCEDURE MergeRun(in1 ,in2 ,out :PSeq ;VAR p1 ,p2 :I .PItem):BOOLEAN ;15 (∗ Zlivanje po ene cete z in1 in in2 na out ∗)16 VAR last1 ,last2 :LONGINT ;17 BEGIN last1 :=MIN (LONGINT );last2 :=last1 ;18 WHILE (p1#NIL)&(last1<=p1 .k)&(p2#NIL)&(last2<=p2 .k) DO19 IF p1 .k<p2 .k THEN Wr(p1 ,out);last1 :=p1 .k ;p1 :=Rd(in1 )20 ELSE Wr(p2 ,out);last2 :=p2 .k ;p2 :=Rd(in2 )22 END22 END;23 IF (p1#NIL)&(last1<=p1 .k) THEN24 CopyRun(in1 ,out ,p1 ,last1 )25 END;26 IF (p2#NIL)&(last2<=p2 .k) THEN27 CopyRun(in2 ,out ,p2 ,last2 )28 END;29 RETURN (p1#NIL) OR (p2#NIL)30 END MergeRun;3232 PROCEDURE Distribute(aux1 ,aux2 ,aux3 ,aux4 :PSeq):LONGINT ;33 VAR l :LONGINT ; p1 ,p2 :I .PItem;35 BEGIN35 l :=0;

se nadaljuje

Page 67: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 59

Naravno, uravnotezeno, dvosmerno zlivanje (nadaljevanje)

36 InitRd(aux1 );InitRd(aux2 );37 InitWr(aux3 ); InitWr(aux4 );38 p1 :=Rd(aux1 ); p2 :=Rd(aux2 );39 LOOP INC (l);40 IF MergeRun(aux1 ,aux2 ,aux3 ,p1 ,p2 ) THEN41 INC (l);42 IF ∼MergeRun(aux1 ,aux2 ,aux4 ,p1 ,p2 ) THEN EXIT END43 ELSE EXIT45 END45 END;46 RETURN l47 END Distribute;4949 BEGIN InitProg ;51 LOOP51 IF Distribute(aux1 ,aux2 ,aux3 ,aux4 )=1 THEN RETURN aux352 ELSIF Distribute(aux3 ,aux4 ,aux1 ,aux2 )=1 THEN RETURN aux154 END54 END55 END NatBal2MergeSort ;

Naravno, uravnotezeno, dvosmerno zlivanje (konec)

Znacilnosti prikazanih procedur so naslednje:

1. pri naravnem zlivanju je potrebno uporabljati spremenljivko last oziroma last1in last2 (vrstice 4, 16) za to, da dolocimo konec cete;

2. procedura MergeRun (vrstice 14–30) ima se vedno znacilno zgradbo sestavljenoiz treh zank (ceprav sta dve zanki pravzaprav klica posebne procedure Co-pyRun);

3. preusmerjanje izhoda med dvema trakovoma opravljamo z locenima klicemaprocedure MergeRun znotraj procedure Distribute (vrstici 40, 42).

2.3.3 Naravno, uravnotezeno, vecsmerno zlivanje

Program je prikazan kot program 2.4. Njegova poglavitna zanimivost pa je procedura,ki usteza proceduri MergeRun iz programa 2.2. Slednja namrec vsebuje po eno zankoza vsako neprazno mnozico vhodnih trakov. V primeru, ko je stevilo vhodnih trakovenako 2, je takih podmnozic 3, v splosnem pa 2n−1, kjer je n stevilo vhodnih trakov.Ocitno je torej, da moramo poiskati drugacno obliko procedure MergeRun za primer,ko je n vecje od 2. Resitev je prikazana na sliki 2.29: trakovi (oziroma kazalci nanje)so urejeni v tabelo f , ki sta ji pridruzeni dve spremenljivki, ner, ki je enaka stevilutrakov, na katerih trenutna ceta se ni zakljucena, in nes, ki je enaka stevilu trakov, ki

Page 68: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

60 POGLAVJE 2. UREJANJE

f [x]

ner nes

ner nes

(a)

(b)

f

f

Slika 2.29: Postopek ob zakljucku cete oziroma traku

se niso do konca prebrani. Ce se tabela zacne z indeksom 1, sta to obenem indeksazadnjega traku, ki ima se nedokoncano ceto, ter zadnjega neprebranega traku. Denimosedaj, da se je na nekem traku ceta koncala (na sliki 2.29 je to trak z indeksom x).V takem primeru zamenjamo f [x] in f [ner] ter zmanjsamo ner za 1. Na ta nacin semed zlivanjem ene cete vrednost ner postopno zmanjsuje, dokler ne postane enaka0. Takrat je postopek zlivanja ene cete koncan. Podobno ravnamo s spremenljivkones. Proceduri Distribute v programu 2.3 sedaj ustreza zanka vrste REPEAT vproceduri MergeRun, ki se konca, ko postane spremenljivka ner enaka 0 (vrstice 49–77 v programu 2.4).

Program 2.4: Naravno, uravnotezeno, vecsmerno zlivanje

1 PROCEDURE NatBalMultiMergeSort∗(in:PSeq ;VAR f :ARRAY OF PSeq):PSeq ;3 VAR3 h, (∗ stevilo vhodov in izhodov ∗)4 dest , (∗ indeks izhoda, na katerega pisemo ∗)5 nes, (∗ stevilo nepraznih vhodov ∗)6 l :LONGINT ; (∗ stevilo cet, zapisanih v tekoci7 iteraciji ∗)8 pa:PAPItem;(∗ tabela kazalcev na vhodne elemente ∗)9 pl :PAL; (∗ tabela vrednosti kljucev, ki so bili

10 nazadnje zapisani na izhode ∗)11 ppa:I .PItem;12 ppl :LONGINT ;1414 PROCEDURE InitProg ;15 VAR i :LONGINT ;p:I .PItem;last :LONGINT ;16 BEGIN17 InitRd(in); p:=Rd(in);18 h:=LEN (f ) DIV 2;19 NEW (pa,h);NEW (pl ,h);

se nadaljuje

Page 69: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 61

Naravno, uravnotezeno, vecsmerno zlivanje (nadaljevanje)

20 (∗ zacetna porazdelitev ∗)21 FOR i :=1 TO h DO InitWr(f [i−1]) END;22 i :=h;23 REPEAT24 IF i=h THEN i :=1 ELSE INC (i) END;25 CopyRun(in,f [i−1],p,last)26 UNTIL p=NIL27 END InitProg ;293030 PROCEDURE InitLoop;3232 VAR i :LONGINT ;p:PSeq ;33 BEGIN l :=0;34 FOR i :=1 TO h DO35 InitRd(f [i−1]); InitWr(f [h+i−1])36 END;37 i :=1;nes:=h;38 (∗ tocno stevilo nepraznih trakov ∗)39 WHILE i<=nes DO40 pa[i−1]:=Rd(f [i−1]);41 IF pa[i−1]#NIL THEN INC (i)42 ELSE p:=f [i−1]; f [i−1]:=f [nes−1];43 f [nes−1]:=p; DEC (nes)45 END46 END46 END InitLoop;4848 PROCEDURE MergeRun ;49 VAR i ,50 minx ,51 ner (∗ stevilo nedokoncanih vhodnih cet ∗)52 :LONGINT ;53 p:PSeq ;54 BEGIN ner :=nes;55 IF dest=2∗h THEN dest :=h+1 ELSE INC (dest) END;56 (∗ zapisemo eno ceto ∗)58 REPEAT58 minx :=1;59 FOR i :=2 TO ner DO60 IF pa[i−1].k<pa[minx−1].k THEN minx :=i END61 END;62 Wr(pa[minx−1],f [dest−1]);63 pl [minx−1]:=pa[minx−1].k ;64 pa[minx−1]:=Rd(f [minx−1]);

se nadaljuje

Page 70: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

62 POGLAVJE 2. UREJANJE

Naravno, uravnotezeno, vecsmerno zlivanje (nadaljevanje)

65 IF (pa[minx−1]=NIL)66 OR (pl [minx−1]>pa[minx−1].k)67 THEN (∗ konec cete ∗)68 p:=f [minx−1]; f [minx−1]:=f [ner−1]; f [ner−1]:=p;69 ppa:=pa[minx−1];pa[minx−1]:=pa[ner−1];pa[ner−1]:=ppa;70 ppl :=pl [minx−1];pl [minx−1]:=pl [ner−1];pl [ner−1]:=ppl ;71 DEC (ner);72 IF pa[ner ]=NIL THEN(∗ konec traku ∗)73 p:=f [ner ]; f [ner ]:=f [nes−1]; f [nes−1]:=p;74 ppa:=pa[ner ]; pa[ner ]:=pa[nes−1];pa[nes−1]:=ppa;75 ppl :=pl [ner ]; pl [ner ]:=pl [nes−1];pl [nes−1]:=ppl ;76 DEC (nes)77 END79 END79 UNTIL ner=080 END MergeRun;8282 PROCEDURE SwitchTapes;83 VAR i :LONGINT ;p:PSeq ;85 BEGIN85 FOR i :=1 TO h DO86 p:=f [i−1]; f [i−1]:=f [h+i−1]; f [h+i−1]:=p88 END88 END SwitchTapes;9090 BEGIN InitProg ;91 dest :=h;92 REPEAT InitLoop;94 REPEAT94 INC (l); MergeRun95 UNTIL nes=0;97 SwitchTapes97 UNTIL l=1 ;98 RETURN f [h]99 END NatBalMultiMergeSort ;

Naravno, uravnotezeno, vecsmerno zlivanje (konec)

2.3.4 Polifazno urejanje

Do sedaj smo prvotni postopek navadnega zlivanja izboljsali na tri nacine: odpravilismo poseben korak porazdelitve, upostevali obstojeco urejenost v vhodnem zaporedjuin omogocili uporabo vec vhodnih trakov. Ali je mogoce postopek se izboljsati? Priuravnotezenem, naravnem vecsmernem zlivanju opazimo, da je izkoriscenost izhodnihtrakov nizka. Namrec, od n izhodnih trakov je naenkrat aktiven le eden, ostali miru-

Page 71: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 63

l\i 1 2 3 4

1 7 a6 4 0

2 3 b2 0 c43 1 0 2 24 0 1 1 15 1 0 0 0

(a) Stevilo cet na posameznihtrakovih (i) v trenutkih (l), kose eden od trakov izprazni

l\i 1 2 3 40 1 0 0 01 1 1 1 02 2 2 1 03 4 3 2 04 7 6 4 0

(b) Isti primer potem, ko smo vr-stice zasukali tako, da je trak znajvec cetami na prvem mestu injih uredili nasprotno kot v 2.30a

Slika 2.30: Primer polifaznega urejanja s stirimi trakovi

jejo in cakajo, da na njih pride vrsta. Zdi se nam, da bi bil postopek najhitrejsi, ce bilahko od celotnega stevila n trakov uporabljali n− 1 kot vhodne trakove in le enegakot izhodnega.

Tako zasnovano urejanje, ki mu pravimo polifazno urejanje, bomo prikazali naprimeru na sliki 2.30a, kjer uporabljamo stiri trakove. Pri trakovih prikazujemo lestevilo cet na posameznem traku, ker identiteta posameznega zapisa v tem primeruni pomembna. Osnovna ideja je, da vedno uporabljamo tri trakove kot vhodne inenega kot izhodnega. Ko se neki vhodni trak izprazni, postane takoj izhodni trak indotedanji izhodni trak postane vhodni. V prvi vrstici na sliki 2.30a smo trakove uredilipo padajocem stevilu cet. Ocitno lahko zlivamo na trak stevilka 4 do trenutka, ko setrak stevilka 3 izprazni (ko stevilo cet na njem doseze vrednost 0). Do tega trenutkasmo s trakov 1-3 prebrali po 4 cete in prav toliko zapisali na trak stevilka 4. V vrstici2 se to vidi po tem, da smo od vrednosti v stolpcih 1-3 odsteli 4 in prav toliko dodalistolpcu 4. Sedaj postane trak 3 izhodni trak in postopek nadaljujemo. V naslednjifazi na trak 3 zapisemo 2 ceti, po cemer se izprazni trak 2 in takoj postane izhodni.V naslednji fazi zapisemo na trak 2 1 ceto, kar ima za posledico, da se trak 1 izprazni,na vseh ostalih trakovih pa je prisotna ena sama ceta. Koncno zlijemo s trakov 2–4na trak 1 po eno ceto in na traku 1 dobimo eno samo ceto. Iz opisanega sledi, da jeosnovna relacija med stevili cet na posameznih vhodnih trakovih in izhodnem traku,

a = b+ c (2.24)

[gl. sliko 2.30a].Ko analiziramo polifazno urejanje, ugotovimo, da je bistveno odvisno od konkre-

tnih stevil, ki jih izberemo kot zacetna stevila cet na posameznih trakovih. Ce bita stevila izbrali nakljucno, postopka nikakor ne bi uspesno koncali. Kot primer jepotrebno le pomisliti na izbiro, ko je na vseh trakovih enako stevilo cet. V takemprimeru bi po zlivanju dobili en trak z nekim stevilom (daljsih) cet in n − 1 trakovs stevilom cet, 0. Ce bi hoteli postopek nadaljevati, bi morali ponoviti zacetno po-razdeljevanje cet, kar pa je seveda casovno potratno. Ce hocemo izpeljati pravilo,

Page 72: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

64 POGLAVJE 2. UREJANJE

po katerem se ravnajo stevila cet na posameznih trakovih, zato da postopek potekanajucinkoviteje, moramo tabelo na sliki 2.30a nekoliko preurediti: vsako naslednjovrstico krozno zasukamo za eno mesto v desno in na ta nacin vse nicelne elementeporavnamo v en stolpec, nato pa se vrstice preuredimo v nasprotnem vrstnem redukot na sliki 2.30a. Na ta nacin dobimo sliko 2.30b. Ce stevilo cet na traku i v vrsticil na sliki 2.30b zaznamujemo z ali, se relacija (2.24) spremeni v

al+1i = ali+1 + al1 = al1 + ali+1. (2.25)

Na podlagi pravkar zapisane rekurencne relacije in zacetnega podatka a01 = 1, a0i = 0pri i > 1 je mozno za poljubno stevilo trakov n sestaviti tabelo, ki je podobna tabelina sliki 2.30b.

Shema celotnega postopka polifaznega urejanja je, da nek vhodni trak z elementi,ki jih zelimo urediti, porazdelimo na n−1 trakov (kjer je n stevilo trakov), in sicer takokot narekuje vrstica l tabele (ki je podobna tabeli 2.30b pri izbranem n), pri cemer lizberemo kot indeks prve vrstice, v kateri je vsota elementov vecja ali enaka steviluvhodnih cet. Preden pa se zacnemo ukvarjati s podrobnostmi realizacije algoritma jedobro, da dobimo obcutek za stevila ali. Ce relacijo (2.25) uporabimo veckrat, dobimoza al1 naslednjo relacijo:

al1 = al−11 + al−21 + . . .+ al−n+11 , (2.26)

ki pa mocno spominja na definicijo dobro znanih Fibonaccijevih stevil

fl = fl−1 + fl−2 (2.27)

(kolicina fl ustreza al1). Zato bomo stevilom al1 v enacbi (2.26) rekli Fibonaccijevastevila reda n − 2 [red Fibonaccijevega stevila je za ena manjsi kot stevilo clenov nadesni strani (2.26)]. Glede na to, da navadna Fibonaccijeva stevila (reda 1) narascajo“priblizno kot” 2l (gl. nalogo 10), lahko sklepamo, da Fibonaccijeva stevila reda nnarascajo “priblizno kot” (n+ 1)l.

Preden pa pravkar opisano idejo o zgradbi programa za polifazno urejanje spreme-nimo v delujoci program, je potrebno razresiti dva drobna problema: 1. kako dolocitiindeks vrstice l v tabeli 2.30b, ki ga je potrebno uporabiti in 2. glede na to, da smopravkar ugotovili, da je postopek polifaznega urejanja kriticno odvisen od stevila cetna posameznih trakovih, kaj storiti, ko vsota stevil v vrstici l ni enaka stevilu vhodnihcet.

Na prvi pogled bi kazalo, da je za resitev problema 1. zgoraj potrebno prebratives vhod in presteti cete. Vendar se izkaze, da se temu lahko izognemo. Zacnemo sprivzetkom, da je zelena vrednost l enaka 1, nato preberemo stevilo cet, ki je enakovsoti stevil v vrstici l = 1 (na primer, v tabeli na sliki 2.30b je vsota stevil v vrsticil = 1 enaka 3) in jih porazdelimo po trakovih. Ce je po koncu te faze vhodni trakprazen, smo postopek koncali, sicer spremenimo privzetek tako, da povecamo l za 1in v novi fazi postopka preberemo stevilo cet, ki je enako razliki med vsotama stevil vvrsticah l+1 in l, ter te cete porazdelimo skladno z vrednostmi v posameznih stolpcih.Tako nadaljujemo, dokler na koncu neke faze trak ni prazen.

Page 73: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 65

Resitev problema 2. zgoraj je tudi razmeroma preprosta: ko se vhodni trak izpraznipreden smo prebrali stevilo cet, ki je enako vsoti stevil v neki vrstici, zapisemo man-kajoce cete v obliki “navideznih” cet, ki so prisotne samo zato, da se postopek izide.

012345678

0 1 2 3 4 5

Slika 2.31: Porazdelitev praznihcet

Takoj pa, ko smo sprejeli odlocitev o navideznihcetah, se postavi vprasanje, kako jih porazdeliti inseveda, kako jih predstavljati. Zadevo bomo prika-zali na primeru s slike 2.30b, ko je stevilo trakov 4.Denimo, da izvajamo postopek porazdeljevanja insmo koncali porazdeljevanje cet, ki ustrezajo l = 3,ne da bi vhodni trak izpraznili. Nato povecamo lna 4 in nadaljujemo z branjem. Po treh cetah ugo-tovimo, da je vhodni trak prazen. Kako porazdelitiprebrane tri cete in preostalih 5 navideznih cet? Alije primerno vse tri resnicne cete zapisati na trak 1ali pa kako drugace? Izkaze se, da je koristen nasle-dnji premislek: postopek je najucinkovitejsi takrat,ko se dolzina cet pri zlivanju najhitreje povecuje.To pa dosezemo takrat, ko pri zlivanju ne zlivamo navideznih in resnicnih cet. Zatonavidezne cete cimbolj enakomerno porazdelimo po trakovih in jih kasneje zlivamomed seboj, preostale, resnicne cete pa porazdelimo tako, kot predpisuje tabela na sliki2.30b. Postopek enakomernega porazdeljevanja navideznih cet prikazuje slika 2.31:visina grafa pri traku i je stevilo cet, ki bi jih morali zapisati na trak i, da dosezemostevilo ali (pri izbranem l). Enakomerno porazdeljenost dosezemo, ce navidezne cete(belo obarvano) pustimo “na dnu” grafa, medtem ko resnicne cete (sivo) pustimo navrhu. V programu postopamo tako, da zacnemo s celotno povrsino grafa pobarvanobelo, nato pa se sprehajamo po vodoravnih trakovih povrsine in vsakic, ko preberemoneko ceto, spremenimo eno enoto povrsine v sivo (zaradi tega se opisan nacin poraz-deljevanja cet imenuje “vodoravna strategija porazdeljevanja”). Ce se sredi postopkavhodni trak izprazni, predstavlja preostala bela povrsina navidezne cete. Iz opisapostopka sledi, da so navidezne cete porazdeljene po trakovih priblizno enakomerno,kar pomeni, da v postopku zlivanja lahko zlivamo bodisi samo navidezne cete ali pasamo resnicne cete. Obenem se tudi ponuja enostavna resitev problema predstavitvenavideznih cet. Namrec pri porazdeljevanju potrebujemo stevec, katerega vrednost jestevilo manjkajocih cet do stevila ali. Ko se vhodni trak izprazni, pa je prav to stevilopotrebno stevilo navideznih cet. Torej: navidezne cete predstavljamo z vrednostjonekega stevca, ki je prirejen traku.

Page 74: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

66 POGLAVJE 2. UREJANJE

Program 2.5: Polifazno urejanje

1 PROCEDURE PolyphaseSort∗(in:PSeq ;VAR f :ARRAY OF PSeq):PSeq ;2 VAR j , (∗ indeks tekocega traku pri porazdeljevanju ∗)3 k , (∗ stevilo nepraznih cet ∗)4 l , (∗ raven (nivo) porazdeljevanja ∗)5 n, (∗ stevilo trakov ∗)6 z :LONGINT ;(∗ stevilo cet, ki jih zlivamo na tekoci ravni ∗)7 pa:PAPItem; (∗ “okno” na vhod ∗)8 a, (∗ stevila cet na trakovih na ravni l ∗)9 d , (∗ stevila praznih cet na trakovih na ravni l ∗)

10 last , (∗ zadnji kljuc, ki je bil zapisan na posamezen trak ∗)11 t :PAL; (∗ indeksi trakov z nepraznimi cetami ∗)1313 PROCEDURE Select ;14 VAR i ,z :LONGINT ;16 BEGIN16 IF d [j ] < d [j +1] THEN INC (j )18 ELSE18 IF d [j ]=0 THEN INC (l);z :=a[1];19 FOR i :=1 TO n−1 DO d [i ]:=z+a[i+1]−a[i ];20 a[i ]:=z+a[i+1]21 END;22 END;23 j :=124 END;25 DEC (d [j ])26 END Select ;2828 PROCEDURE InitProg ;29 VAR i :LONGINT ;30 BEGIN31 n:=LEN (f );32 NEW (a,n+1);NEW (d ,n+1);NEW (last ,n+1);33 NEW (pa,n+1);NEW (t ,n+1);34 FOR i :=1 TO n−1 DO35 a[i ]:=1;d [i ]:=1;InitWr(f [i−1])36 END ;37 l :=1;j :=1;a[n]:=0;d [n]:=038 END InitProg ;4040 PROCEDURE Distribute;41 VAR p:I .PItem;i :LONGINT ;43 BEGIN43 SpecInit ; (∗ pri navadnem polifaznem urejanju, brez ucinka ∗)44 InitRd(in);p:=Rd(in);

se nadaljuje

Page 75: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 67

Polifazno urejanje (nadaljevanje)

45 REPEAT Select ; CopyRun(in,f [j−1],p,last [j ])46 UNTIL (p=NIL) OR (j =n−1);47 WHILE p#NIL DO Select ;48 IF last [j ]>p.k THEN CopyRun(in,f [j−1],p,last [j ])49 ELSE CopyRun(in,f [j−1],p,last [j ]);50 IF p#NIL THEN CopyRun(in,f [j−1],p,last [j ])51 ELSE INC (d [j ])53 END54 END54 END;55 FOR i :=1 TO n−1 DO InitRd(f [i−1]); pa[i ]:=Rd(f [i−1]) END56 END Distribute;5858 PROCEDURE InitInnerLoop;59 VAR i :LONGINT ;61 BEGIN61 k :=0;62 FOR i :=1 TO n−1 DO63 IF d [i ]>0 THEN DEC (d [i ])64 ELSE INC (k); t [k ]:=i66 END67 END67 END InitInnerLoop;6969 PROCEDURE MergeNonEmptyRuns;70 VAR i ,mx :LONGINT ;72 BEGIN72 REPEAT i :=1; mx :=1 ;73 WHILE i < k DO74 INC (i);75 IF pa[t [i ]].k < pa[t [mx ]].k THEN mx :=i END76 END;77 (∗ t [mx ] vsebuje najmanjsi element;78 zapisemo ga na f [n−1] ∗)79 Wr(pa[t [mx ]],f [n−1]);last [t [mx ]]:=pa[t [mx ]].k ;80 pa[t [mx ]]:=Rd(f [t [mx ]−1]);81 IF (pa[t [mx ]]=NIL) OR ( last [t [mx ]] > pa[t [mx ]].k) THEN82 (∗ konec cete na tem traku ∗)83 t [mx ]:=t [k ]; DEC (k)85 END85 UNTIL k=086 END MergeNonEmptyRuns;88

se nadaljuje

Page 76: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

68 POGLAVJE 2. UREJANJE

Polifazno urejanje (nadaljevanje)

88 PROCEDURE TermLoop;89 VAR i ,dn:LONGINT ;ff :PSeq ;p:I .PItem;91 BEGIN91 (∗ Zasuk trakov ∗)92 InitRd(f [t [n−1]]);pa[n]:=Rd(f [n−1]);93 ff :=f [n−1]; dn:=d [n]; z :=a[n−1];p:=pa[n];94 FOR i :=n TO 2 BY −1 DO95 f [i−1]:=f [i−2];96 d [i ]:=d [i−1];97 a[i ]:=a[i−1]−z ;98 pa[i ]:=pa[i−1]99 END;

100 f [0]:=ff ; d [1]:=dn; a[1]:=z ; pa[1]:=p;101 DEC (l)102 END TermLoop;104104 BEGIN InitProg ;105 IF p # NIL THEN106 Distribute;107 REPEAT (∗ f [0]. . . f [n−2] zlivamo na f [n−1] ∗)108 z :=a[n−1]; d [n]:=0; InitWr(f [n−1]);109 REPEAT (∗ z cet zapisemo na trak f [n−1] ∗)110 InitInnerLoop;111 IF k=0 THEN INC (d [n]) ELSE MergeNonEmptyRuns END;112 z :=z−1113 UNTIL z=0;115 TermLoop115 UNTIL l=0;116 END;117 (∗ Izhodno zaporedje je na f [0] ∗)118 RETURN f [0]119 END PolyphaseSort ;

Polifazno urejanje (konec)

Celotni program polifaznega urejanja je prikazan kot program 2.5, opisani po-stopek zacetnega porazdeljevanja cet realizira procedura Distribute (vrstice 40–56),“vodoravno strategijo” pa procedura Select , ki izbira naslednji izhodni trak j (vrstice13–26). Slednjo proceduro aktiviramo pred vsakim prepisovanjem cete z vhodnegatraku na izhodni trak. Kolicina d[j] je preostalo stevilo navideznih cet na traku j in jiob spremembi vrednosti l priredimo zacetno vrednost alj − a

l−1j . Pri porazdeljevanju

cet opazimo se neko zanimivost: kadarkoli porazdeljujemo cete na vec izhodnih tra-kov, obstaja moznost, da se zadnja ceta na nekem izhodnem traku zlije s tekoco ceto veno samo ceto. Pri dvo in vecsmernem zlivanju nas to ne skrbi prevec, ker je postopektako zasnovan, da ni obcutljiv na razlike v stevilu cet na posameznih trakovih. Pri

Page 77: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 69

polifaznem urejanju pa je postopek kriticno odvisen od stevila cet na nekem trakuin zato si ne moremo privosciti razlike med dejanskim stevilom in ali. Zato v zankiv vrsticah 39–46procedure Distribute, programa 2.5 vedno preverimo, ali se je staraceta na izhodu zlila s trenutno ceto in v tem primeru z vhoda prepisemo dodatno ceto.Pred to zanko opazimo posebno zanko v vrsticah 45–46, ki opravi zacetno prirejanjespremenljivki last, katere vrednost je nazadnje zapisani kljuc na nekem traku.

Sicer pa ima osnovni blok programa 2.5 dokaj preprosto zgradbo: po zacetnihprirejanjih in porazdeljevanju cet se izvajata vgnezdeni zanki v vrsticah 107–115.Zunanja pravzaprav “odvije” postopek porazdeljevanja in pri vsakem izvajanju jedrazanke zmanjsa l za ena, notranja pa pri vsakem izvajanju jedra zanke na izhodni trakzapise eno ceto. Procedura TermLoop natancno izvaja postopek, ki smo ga opisali vzvezi s tabelo na sliki 2.30b: stolpce tabel d, a in f zasuka za eno mesto v desno terzmanjsa l.

2.3.5 Polifazno urejanje s predurejanjem

Pri polifaznem urejanju imamo se eno moznost za pohitritev postopka: trajanje po-stopka je odvisno od potrebnega stevila l, ki pa je odvisno od zacetnega stevila cet.Ce to stevilo zmanjsamo, je mozno postopek pohitriti. Ena moznost za to se namponuja, ce ima racunalnik neizkoriscen notranji pomnilnik. V tem primeru lahko upo-rabimo neko metodo notranjega urejanja (tabel) za to, da povecamo dolzino cet (inna ta nacin zmanjsamo njihovo stevilo).

Postopek bomo izpeljali med zacetnim porazdeljevanjem cet preprosto tako, dabomo spremenljivki CopyRun priredili novo proceduro, ki podaljsa cete tako, da jihnekoliko preuredi, uporabljajoc v ta namen kopico, pri cemer je urejenost kopice se-daj nasprotna od urejenosti kopice iz razdelka 2.2.6: sedaj je element pri korenudrevesa manjsi ali enak od elementov v poddrevesih. Delovanje procedure prikazemona primeru, ko imamo na voljo kopico velikosti 12. Denimo, da imamo na vhodnemtraku zaporedje kljucev, ki so prikazani na sliki 2.32a. Ce nato 12 vhodnih podatkovpreberemo v prazna mesta tabele, ki predstavlja kopico, in nato tabelo uredimo v ko-pico (pozor na spremenjeno urejenost kopice), dobimo kopico, ki je prikazana na sliki2.32b. Nato zapisemo koren kopice na izhodni trak (cigar indeks dobimo s klicem pro-cedure Select), preberemo naslednji element z vhoda in nadaljujemo v odvisnosti odrazmerja med kljucem naslednjega vhodnega elementa in kljucem pravkar zapisanegaelementa:

1. Ce je kljuc zapisanega elementa manjsi ali enak od kljuca naslednjega elementana vhodu, slednji element pripada isti ceti kot pravkar zapisani element in gazapisemo v koren kopice ter sprozimo proceduro Sift (kopico popravimo);

2. Ce je kljuc zapisanega elementa vecji od kljuca naslednjega elementa, pripadanaslednji element naslednji ceti. V tem primeru kopico zmanjsamo za en elementtako, da zadnji element zapisemo v koren ter sprozimo Sift, naslednji elementna vhodu pa zapisemo v prejsnji konec kopice;

Page 78: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

70 POGLAVJE 2. UREJANJE

55,87,93; 17,21; 4,37,44,45; 19,100; 7,13,22; 2,57,88,101; 11,19,27; 9; 3;1,25,58,80; 70,110; 29

(meje med cetami so nakazane z znakom ;)(a) Vhodni podatki

4

17 7

44 19 55 37

87 45 21 100 93

(b) Kopica pred prvim izpisom na izhod

17

19 22

44 21 55 37

87 45 93 100 2

(c) Kopica se prvic zmanjsa

29

70 80

58 25 1 3

9 27 19 11 2

(d) Kopica v celoti izpisana; druga pripra-vljena na urejanje

Slika 2.32: Polifazno urejanje s predurejanjem

3. Zapisovanje in branje ponovimo.

Na sliki 2.32c je prikazano stanje, ko nastopi prvo zmanjsanje kopice (po branjuelementa 2), na sliki 2.32d pa trenutek, ko smo prvotno kopico izpraznili in je drugakopica pripravljena za urejanje in kasnejse izpise.

Celotni postopek se nekoliko zaplete, ker je sestavljen iz nekaj faz, med katerimije obnasanje algoritma razlicno. Prvo fazo predstavlja branje elementov iz vhodav tabelo ter sestavljanje kopice. Nato sledi faza, ko je vhodni trak neprazen. Medto fazo elemente prepisujemo na izhod do trenutka, ko se tekoca kopica izprazni,oziroma tekoca ceta konca (ta faza se lahko ponovi veckrat). Vsakic, ko se kopicaizprazni, moramo se sproziti urejanje elementov naslednje cete v kopico. Naslednjafaza nastopi, ko se vhod izprazni in na izhodni trak prepisemo ostanek tekoce cete,nato pa se elemente zadnje cete prestavimo na zacetek tabele ter jih uredimo v kopico.Zadnjo fazo predstavlja izpis zadnje cete.

Tezava pri realizaciji opisanega postopka je v tem, da moramo v proceduro Co-pyRun vgraditi spomin o tem, v kateri fazi je postopek. Najprimerneje je, da novo

Page 79: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 71

proceduro realiziramo kot tim. samostojno proceduro (angl. coroutine), ki se razlikujeod navadne procedure po tem, da si zapomni svoje stanje in ko se program vanjovrne, se izvajanje nadaljuje od mesta, kjer jo je program nazadnje zapustil. Programje prikazan kot progam 2.6, sledi pa nekaj pripomb o njegovem delovanju.

Program 2.6: Polifazno urejanje s predurejanjem

1 MODULE HeapPS ;2 IMPORT I :=IntSort ,F :=FileSort ;45 CONST5 N =8192;78 TYPE8 FCrCoroutine∗=PROCEDURE(P :PROCEDURE);

1010 VAR11 Rd∗:F .FRdItem;12 Wr∗:F .FWrItem;13 InitRd∗,InitWr∗:F .FSeqInit ;14 FinalSwitch∗,SwitchCoroutine∗:F .FNoParam;15 CrCoroutine∗:FCrCoroutine;16 in,out :F .PSeq ;17 dummy :I .Item;18 p:I .PItem;19 last : LONGINT ;20 Sort :F .FPPSort ;2222 PROCEDURE CopyRunCoroutine;23 (∗ Prepisovanje cet, ki smo jih predhodno podaljsali24 tako, da smo jih spustili skozi kopico; privzetek: vhod je neprazen ∗)2626 VAR m, (∗ velikost ostanka kopice, ko se vhod izprazni ∗)27 n: LONGINT ;(∗ zacetna velikost kopice ∗)28 a:F .PAPItem;3030 PROCEDURE Sift(l ,r : LONGINT );31 VAR i ,j :LONGINT ; x : I .PItem;32 BEGIN i :=l ; j :=2∗i+1; x :=a[i ];33 WHILE j < r DO34 IF a[j ].k > a[j +1].k THEN INC (j ) END;35 IF x .k <= a[j ].k THEN j :=r+1 (∗ Izhod iz zanke ∗)36 ELSE a[i ]:=a[j ]; i :=j ; j :=2∗i+138 END38 END;39 IF (j =r) & (x .k > a[j ].k) THEN

se nadaljuje

Page 80: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

72 POGLAVJE 2. UREJANJE

Polifazno urejanje s predurejanjem (nadaljevanje)

40 a[i ]:=a[j ]; a[j ]:=x41 ELSE a[i ]:=x43 END43 END Sift ;4545 PROCEDURE HeapOrder(n:LONGINT );46 VAR l : LONGINT ;48 BEGIN48 l :=m DIV 2;49 WHILE l >= 1 DO DEC (l) ; Sift(l ,m−1) END; (∗ Kopico uredimo ∗)50 END HeapOrder ;5252 PROCEDURE MoveAndOrder ;53 VAR i ,lim: LONGINT ;55 BEGIN55 (∗ Neurejene elemente prestavimo ∗)56 IF m>0 THEN57 IF m > n−m THEN lim:=n−m ELSE lim:=m END;58 FOR i :=0 TO lim−1 DO a[i ]:=a[n−i−1] END59 END;60 n:=n−m (∗ velikost zadnje cete ∗)61 HeapOrder(n)62 END MoveAndOrder ;6464 PROCEDURE Init ;66 BEGIN66 NEW (a,N );67 n:=0;InitRd(in);p:=Rd(in);68 REPEAT (∗ Kopico napolnimo ∗)69 a[n]:=p;INC (n);p:=Rd(in)70 UNTIL (p=NIL) OR (n=N );71 m:=n;72 HeapOrder(m)73 END Init ;7575 PROCEDURE NonEmptyInput ;76 VAR l : LONGINT ; pitem:I .PItem;78 BEGIN79 REPEAT79 (∗ Zacetek naslednje cete ∗)80 WHILE (p # NIL) & (m>0) DO81 Wr(a[0],out);last :=a[0].k ;82 IF p.k>=last THEN a[0]↑:=p↑; Sift(0,m−1)83 ELSE DEC (m); a[0]:=a[m]; a[m]:=p84 END;

se nadaljuje

Page 81: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.3. ZUNANJE UREJANJE 73

Polifazno urejanje s predurejanjem (nadaljevanje)

85 p:=Rd(in)86 END;87 IF m=0 THEN88 m:=n;89 HeapOrder(m);90 pitem:=p;p:=a[0];91 SwitchCoroutine;92 p:=pitem94 END94 UNTIL p=NIL95 END NonEmptyInput ;9797 PROCEDURE NextToLastRun;98 VAR rm: LONGINT ; pitem:I .PItem;99 BEGIN rm:=m;

100 (∗ Konec vhoda, pri cemer je morebiti ena ceta101 ostala nedokoncana ∗)102 IF rm > 0 THEN103 REPEAT (∗ Ostanek cete zapisemo ∗)104 Wr(a[0],out);last :=a[0].k ;105 DEC (rm);a[0]:=a[rm];Sift(0,rm−1)106 UNTIL rm = 0;107 MoveAndOrder ;108 pitem:=p;p:=a[0];109 SwitchCoroutine;110 p:=pitem111 ELSE MoveAndOrder113 END113 END NextToLastRun;115115 PROCEDURE LastRun;117 BEGIN117 WHILE n > 0 DO118 Wr(a[0],out);last :=a[0].k ;119 DEC (n);a[0]:=a[n];Sift(0,n−1)120 END;121 p:=NIL122 END LastRun;124124 BEGIN SwitchCoroutine;125 Init ;126 NonEmptyInput ;127 NextToLastRun;128 LastRun;129 FinalSwitch

se nadaljuje

Page 82: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

74 POGLAVJE 2. UREJANJE

Polifazno urejanje s predurejanjem (nadaljevanje)

130 END CopyRunCoroutine;132132 PROCEDURE CopyRun(inf ,outf :F .PSeq ;VAR pI :I .PItem;133 VAR lastK :LONGINT );134 (∗ Prepis ene cete; privzetek: na zacetku p # NIL ∗)136 BEGIN136 in:=inf ;out :=outf ;p:=pI ;last :=lastK ;137 SwitchCoroutine;138 pI :=p;lastK :=last139 END CopyRun;141141 PROCEDURE MakeCoroutine;142 BEGIN CrCoroutine(CopyRunCoroutine)143 END MakeCoroutine;145145 BEGIN F .CopyRun:=CopyRun;146 F .SpecInit :=MakeCoroutine;147 Sort :=F .PolyphaseSort148 END HeapPS .

Polifazno urejanje s predurejanjem (konec)

Mehanizem samostojnih procedur smo vgradili v program v obliki procedurnespremenljivke CrCoroutine, ki samostojno proceduro pripravi za izvajanje, ter dvehprocedurnih spremenljivk, SwitchCoroutine ter FinalSwitch, ki program prestavita izene samostojne procedure v drugo (vrstici 14-15). V naravo procedur, ki so prirejenetem spremenljivkam, se niti ne spuscamo, ker to presega okvir dela. Program, kiga gradimo, je sestavljen iz dveh samostojnih procedur, iz glavnega programa in izsamostojne procedure, ki realizira prepisovanje cet (CopyRunCoroutine).

1. Modul HeapPS inicializiramo tako, da procedurnim spremenljivkam CopyRunin SpecInit iz modula FileSort (slika 2.26) ter Sort is modula HeapPS priredimovrednosti (vrstice 145–147). Nato je mozno polifazno urejanje s predurejanjemsproziti s klicem procedurne spremenljvike Sort , ki pripada tipu FPPSort izmodula FileSort (slika 2.26). V tem sestavku se ne spuscamo v naravo procedur,ki so prirejene procedurnim spremenljivkam CrCoroutine, SwitchCoroutine terFinalSwitch;

2. Ob klicu procedurne spremenljvike Sort se najprej izvaja procedura SpecInit(program 2.5, vrstica 35), ki ima za posledico izvajanje procedure MakeCorou-tine iz programa 2.6 (vrstice 141–143). Slednja procedura pozene samostojnoproceduro, tako da pripravi proceduro CopyRunCoroutine za izvajanje in senato takoj vrne v glavni program;

3. glavni program nadaljuje z izvajanjem, kot smo to opisali v razdelku o polifa-znem urejanju, v samostojno proceduro, ki jo sedaj opisujemo, pa se vrne ob

Page 83: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.4. POVZETEK OSNOVNIH POJMOV 75

klicu CopyRun (vrstice 132–139). Ko pride do tega klica, se opravijo prire-janja spremenljivkam in, out, p in last (vhodni trak, izhodni trak, kazalec naelement, ki ga preberemo, in kljuc nazadnje prebanega elementa), nato pa sepoklice SwitchCoroutine, ki prestavi program iz samostojne procedure, ki jopredstavlja glavni program, v tisto, ki opravi prepisovanje cet;

4. Procedura CopyRunCoroutine se pricne s klicem Init (vrstice 64–73), ki di-namicno generira tabelo a za kopico, jo napolni z elementi, ki jih prebere zvhoda (moramo upostevati tudi moznost, da se vhod konca, preden je cela ta-bela popisana) ter na koncu sestavi kopico (vrstica 72);

5. Sledi klic procedure NonEmptyInput (vrstice 75–95), katere jedro je zanka, kise izvaja do trenutka, ko se vhod izprazni (mora pa biti tako zasnovana, dadeluje pravilno tudi, ko je vhod ze prazen ob vstopu). Zanka v vrsticah 80–86,v svojem jedru zapise koren kopice na izhodni trak, prebere naslednji element zvhoda ter njegov kljuc primerja s kljucem pravkar zapisanega elementa (vrstica82). Zanka se zakljuci, ko se bodisi vhod ali trenutna kopica izprazni. Ce sekopica izprazni, je to znak, da se je trenutna ceta koncala in je potrebno sestavitinovo kopico in zamenjati samostojno proceduro (vrstica 91);

6. Sledi klic procedure NextToLastRun, ki zapise preostale elemente trenutne ko-pice na izhod, nato prestavi elemente zadnje cete na zacetek tabele, jih preurediv kopico ter opravi zamenjavo samostojne procedure (vrstice 107–109);

7. Elemente zadnje cete nato izpise procedura LastRun;

8. Koncno se poklice procedure FinalSwitch, ki program dokoncno prestavi vosnovno samostojno proceduro.

2.4 Povzetek osnovnih pojmov

1. Naloga urejanja

2. Kriteriji za razvrscanje nalog urejanja

3. Operacije, s katerimi ocenjujemo porabo casa pri urejanju

4. Urejanje tabel in osnovni privzetek glede porabe prostora

5. Navadne metode urejanja. Znacilna zancna invarianta. Ocena porabe casa

6. Spodnja meja za cas urejanja tabel dolzine n. Uporabljeni racunalniski model. Mnozicavhodnih podatkov. Drevo sledi

7. Shellovo urejanje

8. Urejanje s kopico in ocenjevanje porabe casa

9. Urejanje s porazdelitvami. Ocena povprecne in najvecje porabe casa. Ocena porabeprostora

10. Iskanje k-tega elementa ter ocena povprecne in najvecje porabe casa

Page 84: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

76 POGLAVJE 2. UREJANJE

11. Navadno zlivanje datotek. Ocena porabe casa. Mozne poti izboljsave navadnega zli-vanja

12. Naravno zlivanje

13. Osnovni problem vecsmernega zlivanja in njegova resitev

14. Polifazno zlivanje; osnovna rekurencna relacija za potrebno zacetno stevilo cet naposameznih takovih; problem, ko celotno stevilo cet ni enako vsoti potrebnih zacetnihstevil cet na posameznih trakovih; problem zlivanja dveh cet v eno; “vodoravna”strategija porazdeljevanja cet;

15. Polifazno zlivanje s predurejanjem. Zakaj predurejanje. Programska resitev, ki upo-rablja samostojne procedure.

2.5 Naloge

1. Izpeljite oceno za cas, ki ga porabi algoritem na sliki 2.9 pri izvajanju zanke v vrsticahod 14 do 16.

2. Izpeljite oceno za stevilo zamenjav, ki jih opravi algoritem navadnih zamenjav na sliki2.11. Ocenite najmanjse, najvecje in povprecno stevilo zamenjav.

3. Dokazite, da je z naborom operacij na sliki 2.13 mozno realizirati urejanje poljubnetabele dolzine n. (Napotek: izhajajte iz ugotovitve, da je naloga urejanja enakovrednasestavljanju neke permutacije vhodnih podatkov.)

4. Izracunajte porabo casa pri urejanju s porazdelitvami, ce privzamemo, da je porabacasa za porazdelitev enaka cn in da vsaka porazdelitev tabelo razdeli tocno na dvetabeli enakih velikosti (napotek: uporabite izrek 1.3).

5. V razdelku o casu, ki ga porabi urejanje s porazdelitvami, smo dokazali relacijo (2.18),vendar le za ceno sorazmerno visokega povecanja konstante c. Poiscite tak nastavekza vrednost Tave(n), ki ohrani vrednost konstantnega faktorja c pri n lnn (napotek:clenu cn logn pristejte nek clen, ki se po integraciji v (6) unici z 1

4).

6. Izpeljava relacije (2.16) ni povsem prepricljiva, ker smo izhajali iz nekoliko nena-tancnega privzetka, da se tabela velikosti n vedno razdeli v razmerju k : n− k− 1 pri0 ≤ k ≤ n− 1. Do iste relacije pridemo z nekoliko spremenjenim opisom porazdeljeva-nja, ko tabelo razdelimo na tri dele, in sicer na levi del, ki vsebuje i elementov, ki somanjsi ali enaki mejnemu elementu, na element, ki je enak mejnemu elementu in nan− i− 1 elementov, ki so vecji ali enaki mejnemu elementu. Naloga: sestavite algori-tem, ki realizira taksno porazdelitev. Kaj menite o njegovi ucinkovitosti v primerjavis porazdelitvenim algoritmom na sliki 2.19?

7. Obravnavali smo vprasanje zmanjsevanja porabe prostora pri urejanju s porazdeli-tvami. Prikazali smo resitev, ki uporablja poseben sklad za shranjevanje novih zahtevpo porazdelitvi. Pokazite, da je mozno tudi prvotno proceduro Sort na sliki 2.20spremeniti v obliko, ko ne pride do pretirane porabe prostora.

8. Za neko metodo urejanja pravimo, da je stabilna, v primeru, ko ne more priti do zame-njave medsebojnega polozaja dveh zapisov z istim kljucem. Za vse metode notranjegaurejanja, ki smo jih predstavili (navadno vstavljanje, dvojisko vstavljanje, navadno iz-biranje, navadne zamenjave, izmenicne zamenjave, Shellovo urejanje, urejanje s kopico

Page 85: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

2.5. NALOGE 77

i1 j1 i2 j2

Slika 2.33: Urejanje tabel z uravnotezenim zlivanjem

in urejanje s porazdelitvami), ugotovite, katere so stabilne in podajte utemeljitev vasesodbe.

9. Shemo naravnega, uravnotezenega zlivanja lahko uporabimo tudi za urejanje tabel,kot to prikazuje sl. 2.33: dve vhodni tabeli sta prikazani na levi, pri cemer sta i1 in j1indeksa trenutnih elementov vhodnih cet, i2 in j2 pa indeksa elementov izhodnih cet.i1 in j1 zlivamo v i2, naslednjo ceto pa na j2.

(a) Sestavite podroben program za opisani postopek;

(b) zakaj se ta postopek ni uveljavil v praksi, ceprav je izredno hiter?

10. Na podlagi rekurencne relacije 2.27 izpeljite velikost Fibonaccijevih stevil prvega reda(napotek: uporabite nastavek fi = cxi).

Page 86: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

78 POGLAVJE 2. UREJANJE

Page 87: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 3

ALGORITMI ZREKURZIVNIMRAZCEPOM

3.1 Uvod

Algoritme, ki uporabljajo rekurzivni razcep prvotnega problema na manjse podpro-bleme, smo omenili ze v uvodnem poglavju (gl. razdelek 1.4.2), kasneje pa smo sez njimi srecali tudi pri urejanju tabel (metoda urejanja s porazdelitvami, razdelek2.2.7). Sedaj bomo prikazali se dva dodatna primera: nek algoritem za mnozenje ma-trik in dva za racunanje diskretne Fourierjeve transformacije, pri cemer slednji gotovospada med najkoristnejse algoritme, kar jih poznamo. V tem poglavju uporabljamodolocene pojme iz linearne in splosne algebre in v kolikor pojasnila v tem besedilu nezadostujejo, lahko bralec poisce dodatne informacije v delu Vidav [15, poglavje 1].

3.2 Mnozenje matrik

Podani sta dve matriki, A in B, s komponentami Aij in Bij pri 1 ≤ i, j ≤ n. Njunprodukt, C = A · B, je definiran na obicajen nacin kot Cij =

∑nk=1AikBkj . Zasta-

vimo si vprasanje, koliksno je minimalno stevilo aritmeticnih operacij, potrebnih zaizracun vseh komponent C? Iz zgodovinskih razlogov, pa tudi na podlagi teoreticnihpremislekov, je primerno kot prvi priblizek upostevati le operacije mnozenja1. Torej,koliksno je minimalno stevilo mnozenj, ki je potrebno za izracun komponent ma-tricnega produkta?

1Zgodovinski razlog je, da sta vcasih na racunalnikih mnozenje in deljenje zahtevala mnogo veccasa kot sestevanje in odstevanje (danes to vec ni res); teoreticni premislek pa je, da ima v algebraicnihizpeljavah mnozenje posebno mesto in da je laze ocenjevati stevilo mnozenj kot stevilo sestevanj.

79

Page 88: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

80 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

Najpreprostejsi algoritem za mnozenje matrik seveda izhaja neposredno iz defini-cije. Zanj se brez tezav prepricamo, da porabi n3 mnozenj in je potemtakem klasicenprimer racunsko potratnega algoritma.

3.2.1 Metoda S. Winograda

Prvi, ki je omenjeni problem raziskoval in prisel do dolocenih rezultatov, je bil S.Winograd l. 1967. Njegova metoda deluje, ko je n sodo stevilo2, sloni pa na uporabinaslednjih kolicin:

πi,k,j = (Ai,2k−1 +B2k,j)(B2k−1,j +Ai,2k)= Ai,2k−1B2k−1,j +Ai,2k−1Ai,2k +B2k,jB2k−1,j +B2k,jAi,2k,

ρi,k = Ai,2k−1Ai,2k,σk,j = B2k,jB2k−1,j ,

(3.1)

pri 1 ≤ i, j ≤ n in 1 ≤ k ≤ n2 . Vsako od zapisanih kolicin lahko izracunamo z enim

samim mnozenjem. Komponento Ci,j matricnega produkta lahko nato izrazimo kot

Ci,j =

n2∑

k=1

(πi,k,j − ρi,k − σk,j). (3.2)

Naj nπ, nρ in nσ predstavljajo stevila elementov posamezne vrste. Potem je stevilomnozenj za izracun vseh komponent matricnega produkta enako

nπ + nρ + nσ. (3.3)

Ker ocitno velja nπ = 12n

3, nρ = nσ = 12n

2, smo z metodo Winograda zmanjsali po-trebno stevilo mnozenj priblizno na polovico. Bodimo pozorni na to, da pri izracunihkomponent produkta uporabljamo kolicine ρi,k in σk,j enako pogosto kot πi,k,j , vendarso kolicine πi,k,j pri razlicnih komponentah razlicne, medtem ko se kolicine ρi,k in σk,jpri razlicnih komponentah ponavljajo. Bistveno za delovanje algoritma je dejstvo, daje mnozenje navadnih stevil komutativno (xy = yx). Namrec, ce to ne bi veljalo, nebi pri komponenti Ci,j iz kolicine πi,k,j mogli dobiti clena Ai,2kB2k,j .

Koliksno pa je stevilo operacij sestevanja in odstevanja? Ce upostevamo, da zaizracun ene kolicine πi,k,j porabimo 2 sestevanji, nato, da pri izracunu komponent C

racunamo vsote∑n

2

k=1 ρi,k ter∑n

2

k=1 σk,j , ki zahtevajo n2 −1 sestevanj, vseh takih vsot

pa je 2n, in koncno, da pri izracunu Ci,j porabimo se 2 dodatni sestevanji, dobimo,

2 · 1

2n3 + 2n(

n

2− 1) + 2n2 = n3 + 3n2 − 2n,

kar pa je vec kot zahteva klasicna metoda. Zaradi tega in drugih okoliscin, kizmanjsujejo hitrost metode v praksi, se metoda ni uveljavila.

2V kolikor n ni sodo, obravnavamo A in B kot n′ × n′ matriki pri n′ = n + 1, pri cemer so vsielementi v zadnji vrstici in zadnjem stolpcu enaki 0.

Page 89: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.2. MNOZENJE MATRIK 81

(A11 A12

A21 A22

) (A13 A14

A23 A24

)(A31 A32

A41 A42

) (A33 A34

A43 A44

)(B11 B12

B21 B22

) (B13 B14

B23 B24

)(B31 B32

B41 B42

) (B33 B34

B43 B44

)

Slika 3.1: Delitev problema mnozenja matrik pri n = 4

3.2.2 Metoda V. Strassena

V. Strassen je priblizno istocasno z Winogradom iznasel neko novo metodo za mnozenjematrik, ki tudi po velikostnem redu porabi manj mnozenj od klasicne metode. Metodasloni na neki posebni metodi mnozenja 2× 2 matrik, ki ne uporablja lastnosti komu-tativnosti stevil. Zaradi tega v identitetah, ki predstavljajo osnovo za metodo, stevilalahko zamenjamo s podmatrikami obeh matricnih faktorjev in dosezemo rekurzivnirazcep prvotne naloge.

Ce sta A in B dve 2× 2 matriki, lahko Strassenove produkte zapisemo takole:

π11 = (A11 +A22)(B11 +B22)π12 = (A12 −A22)(B21 +B22)π13 = (A11 +A12)B22

π14 = A22(B11 −B21)

π21 = (A22 +A11)(B22 +B11)π22 = (A21 −A11)(B12 +B11)π23 = (A22 +A21)B11

π24 = A11(B22 −B12).

(3.4)

Vseh skupaj je produktov na seznamu (3.4) 8, vendar sta π11 in π21 enaka, kar pomeni,da jih je 7. Lahko ugotovimo, da dobimo produkte π21, π22, π23, π24 iz π11, π12, π13, π14tako, da povsod indeks 1 zamenjamo z 2 in nasprotno, 2 z 1. Ni tezko ugotoviti, davelja

C11 = +π11 +π12 −π13 −π14C12 = +π13 −π24C21 = −π14 +π23C22 = +π21 +π22 −π23 −π24

(3.5)

Identitete (3.5) ne potrebujejo privzetka komutativnosti mnozenja elementov Ai,jin Bi,j . Zato lahko npr. pri n = 4 kolicine A11, A12, A21, A22 in B11, B12, B21, B22

zamenjamo s podmatrikami, kot je to prikazano na sliki 3.1.Pri izracunu porabe casa Strassenove metode uporabljamo izrek 1.3. V nasem

primeru smo velikost problema razpolovili (c = 2), za resitev prvotnega problema paje potrebno resiti sedem podobnih problemov polovicne velikosti (a = 7). Cena zadelitev problema in za kasnejse sestavljanje resitve je velikostnega reda Θ(n2) (torejr = 2), ker je vsak element matrik potrebno vsaj enkrat uporabiti v nekem izracunu.V tem primeru velja a > cr, zato dobimo

T (n) = Θ(nlogc a) = Θ(n2.80735). (3.6)

Page 90: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

82 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

Glede na rezultat (3.6) bi pricakovali, da se bo Strassenov algoritem mocno uve-ljavil v prakticnem racunanju. Zal pa zaradi njegove rekurzivne narave pride doprevelike porabe prostora, kar ga naredi neprimernega za delo z velikimi matrikami.Klasicni algoritem ima tudi to prednost, da uporablja zelo preproste operacije —nekako bi lahko rekli, da je “homogen”. Zato je primeren za realizacijo na velikih(“vektorskih”) racunalnikih. Zaradi teh in podobnih razlogov se klasicni algoritem sedanes uporablja tam, kjer je potrebno mnoziti velike matrike. Dodaten razlog, zakajse ucinkovitejsi algoritmi za mnozenje matrik v praksi niso uveljavili, tudi tam, kjerbi to lahko pricakovali, je, da je do danes prav zaradi casovne potratnosti klasicnegaalgoritma nastala vrsta matematicnih metod, ki dosezejo isti ali podoben ucinek brezuporabe matricnega mnozenja.

3.3 Diskretna Fourierjeva transformacija inalgoritmi zanjo

3.3.1 Uvod

Diskretna Fourierjeva transformacija spada med pomembnejsa orodja uporabne mate-matike, sodobni algoritmi zanjo so pa tudi primeri elegantnih in ucinkovitih racunalniskihalgoritmov. V tem sestavku bomo na kratko opisali diskretno Fourierjevo transfor-macijo, ali s kratico DFT, njeno uporabo pri racunanju konvolucije polinomov inalgoritme zanjo. DFT je opisana v zelo obsezni literaturi. Na tem mestu lahko ome-nimo Aho, Hopcroft in Ullman [1, 7. poglavje] ali Kozak [10, §7.7].

3.3.2 Diskretna Fourierjeva transformacija

Pri definiciji diskretne Fourierjeve transformacije izhajamo iz n-razseznostnega vek-torskega prostora nad nekim obsegom K(3)

ei0 =

ei2πn n = 1

ei2πn

Slika 3.2: Klasicni primern-tega primitivnega korenaenote

Prostor oznacujemo z VK . Pri K privzamemo, davsebuje nek poseben element ω, ki mu pravimo n-tiprimitivni koren enote zaradi naslednjih lastnosti:

ωn = 1, (3.7)

in

ωi 6= 1, pri 1 ≤ i ≤ n− 1. (3.8)

[Elementu ω pravimo koren enote zaradi lastnosti(3.7) in primitivni koren enote zaradi (3.8).] Takojlahko ugotovimo, da sta (3.7) in (3.8) enakovredni

3Spomnimo se, da je obseg matematicna struktura kolobarja, v katerem imata tako sestevanje kotmnozenje ustrezni inverzni operaciji. V nekaterih virih se od mnozenja zahteva, da je komutativno,v drugih te zahteve ni. Za nase potrebe lahko privzamemo, da je mnozenje komutativno.

Page 91: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 83

naslednji lastnosti:n−1∑i=0

ωpi =

n, pri p = n;0, pri 1 ≤ p ≤ n− 1.

(3.9)

Dejansko: naj veljata (3.7) in (3.8). Veljavnost (3.9) pri p = n je ocitna. Naj bo sedaj1 ≤ p ≤ n− 1 in zapisimo:

1− ωpn = (1− ωp)∑n−1i=0 ω

pi

= 0.(3.10)

Ker na desni strani prve vrstice (3.10) prvi faktor ni enak nic [na podlagi (3.8)], morabiti drugi faktor enak nic in torej (3.9) velja. Nasprotno pa, naj ne veljata (3.7) in(3.8). Pravzaprav (3.7) velja, ker nas zanimajo le koreni enote, torej naj koren enoteni primitiven [ne velja (3.8)]. V tem primeru eksistira nek 1 ≤ p ≤ n− 1, pri kateremvelja ωp = 1. Tedaj pa pri tej vrednosti p ne more veljati druga vrstica desne strani(3.9), in torej (3.9) ne velja. 2

3.1 Primer Klasicen primer n-tega primitivnega korena enote je kompleksno steviloei

2πn (gl. sliko 3.2).

3.2 Definicija Diskretna Fourierjeva transformacija stopnje n prostora VK je line-arna transformacija tega prostora z matriko F in elementi Fij = ωij, pri 0 ≤ i, j ≤n− 1.

Ponavadi je n znano in vnaprej doloceno tako, da stopnje transformacije niti ne ome-njamo. Osnovna lastnost DFT je, da ima inverz v primeru, ko je izpolnjen naslednjipogoj:

3.3 Trditev Ce obseg k vsebuje element 1n , ima F inverz z matriko F−1 in elementi

F−1ij = 1nω−ij.

Dokaz. Pri sprejetem privzetku o elementu 1n obsega je element v vrstici i in stolpcu

j produkta F · F−1 enak

1

n

n−1∑h=0

ω(i−j)h,

ta vsota pa je na podlagi (3.9) enaka

δij =

1 pri i = j;0 sicer.

2

Kolicini δij ponavadi pravimo Kroneckerjev delta simbol.

Page 92: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

84 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

3.4 Pripomba Pri eksponentu i ·j elementa ωij ugotovimo, da je pomemben le osta-nek po deljenju z n zaradi relacije ωn = 1. Pogoj o eksistenci elementa 1

n najpogostejeopisemo s pogojem, da ima K karakteristiko, ki je razlicna od n, pri cemer je karakte-ristika obsega K tisti najmanjsi mnogokratnik 1, ki je enak 0. Na primer, pri stevilihpo modulu 3 je to 3. Ce takega mnogokratnika ni, definiramo karakteristiko kot ∞(npr. pri racionalnih stevilih). 2

3.5 Primer Pri n = 2 je n-ti primitivni koren enote enak -1 in sta matrika DFT innjen inverz,

F =

(1 11 −1

);F−1 =

1

2

(1 11 −1

)=

1

2F

(seveda pa v splosnem ne velja F−1 = 1nF ). Ce pri n = 4 oznacimo n-ti primitivni

koren enote z ω, sta matrika DFT in njen inverz,

F =

1 1 1 11 ω ω2 ω3

1 ω2 1 ω2

1 ω3 ω2 ω1

;F−1 =1

4

1 1 1 11 ω−1 ω−2 ω−3

1 ω−2 1 ω−2

1 ω−3 ω−2 ω−1

.

Ce upostevamo, da velja ω2 = ω−2 = −1, ω−1 = ω3 = −ω ter ω−3 = ω1, dobimo

F =

1 1 1 11 ω −1 −ω1 −1 1 −11 −ω −1 ω

;F−1 =1

4

1 1 1 11 −ω −1 ω1 −1 1 −11 ω −1 −ω

.

Primer lahko zakljucimo z izracunom podobe nekega vektorja. Naj bo n = 4 inx = [1, 1, 2, 2] t, pri cemer xt oznacuje transpozicijo vektorja x. Na podlagi pravkarzapisane vrednosti F lahko izracunamo Fx kot

[6,−1− ω, 0,−1 + ω] t.

Naj se pripomnimo, da je v primeru n = 4 in ko je K obseg kompleksnih stevil, ωenako “imaginarnemu” stevilu i (glej primer 3.1). 2

3.3.3 Interpretacija DFT s polinomi

V mnogih aplikacijah je primerna interpretacija DFT s polinomi: baza VK je sesta-vljena iz polinomov xi, pri 0 ≤ i ≤ n−1. Ker imamo le n baznih elementov, je moznoz elementi prostora predstavljati le polinome stopnje n− 1:

n−1∑i=0

aixi.

Page 93: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 85

Lahko si pa tudi mislimo, da predstavljamo vse polinome (ne glede na stopnjo), vendarizenacimo dva polinoma, ki se razlikujeta le po koeficientih pri stopnjah ≥ n. V temprimeru pravimo, da sta polinoma enaka po modulu xn. Povedano drugace, dvapolinoma sta enaka po modulu xn takrat, ko sta ostanka po deljenju z xn ista. Torejso elementi prostora VK polinomi ene spremenljivke po modulu xn s koeficienti iz K.Glede na to, da polinome ne le sestevamo, temvec tudi mnozimo, imamo pravzapravopravka s kolobarjem. Pri polinomih uporabljamo razlicne predstavitve, med katerimista najpomembnejsi koeficientna predstavitev in pa vrednostna predstavitev. Prvapredstavitev ustreza pravkar omenjeni bazi za prostor polinomov po modulu xn: v temprimeru je i-ta komponenta polinoma p(x) koeficient pri baznem elementu xi. Drugapredstavitev pa je povezana z n elementi, c0, c1, . . . , cn−1 (ki pripadajo K), polinomp(x) pa predstavljamo z n-terko vrednosti p(c0), p(c1), . . . , p(cn−1) (gl. nalogi 2 in 3).V nasem primeru je posebno zanimiv nabor elementov ci = ωi pri 0 ≤ i ≤ n− 1. Nise tezko prepricati v to, da predstavlja DFT transformacijo, ki preslika koeficientnopredstavitev nekega polinoma v vrednostno predstavitev v tockah ωi, pri 0 ≤ i ≤ n−1.Resnicno:

p(ωi) =

n−1∑j=0

ajωi·j ,

kar predstavlja i-to komponento F ([a0, a1, . . . , an−1]) (gl. tudi nalogo 4).

3.3.4 Konvolucija polinomov

Za hip bomo obravnavali splosne polinome (ne po modulu xn). Vsak polinom si lahkopredstavljamo kot element vektorskega prostora neskoncne razseznosti, katerega baznielementi so xi, i ≥ 0, ki pa ima le koncno mnogo nenicelnih komponent.

3.6 Definicija Konvolucija polinomov p(x) in q(x) je koeficientna predstavitev nju-nega produkta p(x) · q(x). Ce sta vektorja koeficientov polinomov p(x) in q(x), a inb, po vrsti, oznacujemo vektor koeficientov produkta p(x) · q(x) z a b.

Ko imamo dva polinoma stopnje n− 1,

p(x) =∑n−1i=0 aix

i, q(x) =∑n−1j=0 bjx

j ,

je njun produkt,

p(x) · q(x) =

2n−2∑i=0

n−1∑j=0

ajbi−j

xi,pri cemer kolicine bi z indeksom i, ki lezijo izven intervala [0, n − 1], izenacimo z 0.Torej, ko sta podana dva vektorja s komponentami

a = [a0, a1, . . . , an−1]b = [b0, b1, . . . , bn−1] ,

Page 94: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

86 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

je njuna konvolucija c = a b vektor z najvec 2n− 1 nenicelnimi komponentami. i-takomponenta ci pa je enaka

ci =

n−1∑j=0

ajbi−j , 0 ≤ i ≤ 2n− 2.

Tezava pri racunanju konvolucije je, da je razmeroma potratna operacija. Ceupostevamo samo mnozenja, zahteva racunanje i-te komponente i + 1 mnozenj, pri0 ≤ i ≤ n− 1 in 2n− i− 1 pri n ≤ i ≤ 2n− 2, kar pomeni, da za vseh 2n− 2 kompo-nent potrebujemo n2 mnozenj (gl. nalogo 1). Izkaze pa se, da obstaja pot, ki zahtevamanj operacij mnozenja (in tudi operacij nasploh). Ideja je v tem, da najprej ovre-dnotimo oba faktorja, p(x) in q(x), pri potencah 2n-tega primitivnega korena enote,za kar uporabimo diskretno Fourierjevo transformacijo stopnje 2n, nato tako prido-bljene vektorje F (p(x)) in F (q(x)) zmnozimo po komponentah ter koncno uporabimoinverzno DFT na vektorju, ki je sestavljen iz produktov istoleznih komponent. Idejasloni na dejstvu, da je vrednost produkta dveh polinomov v poljubni tocki, produktvrednosti faktorjev v isti tocki. Ce sta a in b vektorja koeficientov p(x) in q(x), lahkozapisemo,

a b = F−1(F (a) ∗ F (b)),

kjer simbol ∗ oznacuje vektor, ki ga dobimo iz dveh faktorjev tako, da zmnozimoistolezne komponente4. Na prvi pogled je tezava v tem, da sta faktorja polinomastopnje n − 1, rezultat pa polinom stopnje 2n − 2. Ponavadi postopamo tako, daoba vektorja faktorjev podaljsamo do dolzine 2n (z dodajanjem nicelnih komponent)in tudi rezultat obravnavamo kot vektor dolzine 2n (namesto 2n − 1). Razlog je vtem, da je vedno ugodno, ce je n potenca stevila 2. To, kar smo doslej opisali, lahkostrnemo v naslednji izrek:

3.7 Izrek (o konvoluciji). Podana sta dva polinoma stopnje n− 1:

p(x) =

n−1∑i=0

aixi in q(x) =

n−1∑j=0

bjxj .

Naj bostaa = [a0, a1, . . . , an−1, 0, . . . , 0]t inb = [b0, b1, . . . , bn−1, 0, . . . , 0]t

vektorja dolzine 2n, pri cemer predstavlja t simbol za transponiranje, vektorja

F (a) = [a′0, a′1, . . . , a

′2n−1]t in F (b) = [b′0, b

′1, . . . , b

′2n−1]t

pa sta ustrezni DFT transformiranki. Potem velja a b = F−1(F (a) ∗ F (b)).

4Naslednje dejstvo navajamo kot zanimivost: spomnimo se, da je Kroneckerjev produkt neke m×nmatrike A in neke m′×n′ matrike B, mm′×nn′ matrika C = A⊗B z elementi Cii′,jj′ = AijBi′j′ .Zato lahko predstavimo operacijo ∗ takole: levi faktor si predstavljamo kot neko n×1 matriko, desnipa kot neko 1× n matriko; potem je a ∗ b enako diagonali matrike a⊗ b.

Page 95: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 87

Dokaz. Ker velja ai = bi = 0, pri n ≤ i ≤ 2n− 1, lahko zapisemo

a′l =∑n−1j=0 ajω

lj , b′l =∑n−1k=0 bkω

lk,

pri 0 ≤ l ≤ 2n− 1. Torej velja

a′lb′l =

n−1∑j=0

n−1∑k=0

ajbkωl(j+k). (3.11)

Zapisimo sedaja b = [c0, c1, . . . , c2n−1]t

terF (a b) = [c′0, c

′1, . . . , c

′2n−1]t.

Ker velja cp =∑2n−1j=0 ajbp−j , lahko zapisemo

c′l =

2n−1∑p=0

2n−1∑j=0

ajbp−jωlp.

Ce zamenjamo vrstni red pri vsoti ter p− j s k, dobimo

c′l =

2n−1∑j=0

2n−1−j∑k=−j

ajbkωl(j+k).

Glede na to, da indeksa j in k lahko omejimo na interval [0, n−1], lahko v drugi vsotispremenimo k = −j v k = 0 in 2n − 1 − j v n − 1, v prvi vsoti pa 2n − 1 v n − 1.Zato je c′l enako a′lb

′l, kot smo to zapisali v (3.11). 2

3.8 Primer Dana sta polinoma p(x) = 2x + 1 in q(x) = −2x + 1 (ki ju pisemo naobicajen nacin, po padajocih potencah x) in zelimo izracunati njuno konvolucijo napravkar opisan nacin. Seveda jo je v tem primeru mozno izracunati tudi neposrednokot −4x2 + 1. Najprej koeficiente polinomov predstavimo z vektorjema dolzine 4:

p = [1, 2, 0, 0] t,q = [1,−2, 0, 0] t

(bodimo pozorni, da so sedaj koeficienti razvrsceni po narascajocih potencah x), ki junato zmnozimo z leve z matriko DFT pri n = 4, ki smo jo predstavili v primeru 3.5:

F (p) = F · p = [3, 1 + 2ω,−1, 1− 2ω] t, F (q) = F · q = [−1, 1− 2ω, 3, 1 + 2ω] t.

Naslednji korak je izracun vektorja

F (p) ∗ F (q) = [−3, 5,−3, 5] ,

Page 96: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

88 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

na katerem nato uporabimo inverzno DFT (gl. ponovno primer 3.5):

F−1(F (p) ∗ F (q)) =1

4[4, 0,−16, 0] ,

kar se ujema z neposrednim izracunom. 2

V nekaterih aplikacijah uporabljamo tim. “ovito konvolucijo”.

3.9 Definicija Dana sta dva vektorja

a = [a0, a1, . . . , an−1]t,b = [b0, b1, . . . , bn−1]t.

Potem je pozitivna ovita konvolucija a in b vektor c = [c0, c1, . . . , cn−1]t s kompo-nentami

ci =

i∑j=0

ajbi−j +

n−1∑j=i+1

ajbn+i−j .

Pozitivno ovito konvolucijo a in b oznacujemo z a2b. Na podoben nacin definiramonegativno ovito konvolucijo a in b kot vektor d = [d0, d1, . . . , dn−1]t s komponentami

di =

i∑j=0

ajbi−j −n−1∑j=i+1

ajbn+i−j .

Negativno ovito konvolucijo a in b oznacujemo z a3b.

3.10 Primer Naj bo n = 4 in naj bosta dana dva vektorja dolzine 4,

a = [a0, a1, a2, a3] ,b = [b0, b1, b2, b3] .

V tem primeru ima njuna pozitivna (negativna) ovita konvolucija komponente

c0 = a0b0 ± a1b3 ± a2b2 ± a3b1c1 = a0b1 + a1b0 ± a2b3 ± a3b2c2 = a0b2 + a1b1 + a2b0 ± a3b3c3 = a0b3 + a1b2 + a2b1 + a3b0,

pri cemer za pozitivno ovito konvolucijo izbiramo znak +, za negativno pa znak −(takrat ko je izbira nakazana). 2

3.11 Izrek Dana sta dva vektorja

a = [a0, a1, . . . , an−1]t,b = [b0, b1, . . . , bn−1]t.

Page 97: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 89

Naj bo ω n-ti primitivni koren enote, za ψ pa naj velja ψ2 = ω (torej je ψ 2n-tiprimitivni koren enote). Naj ima n multiplikativni inverz. Potem velja

a2b = F−1(F (a) ∗ F (b))

ina3b = F−1(F (a) ∗ F (b)),

kjer velja za poljuben vektor

c = [c0, c1, . . . , cn−1]t,

c = [c0, ψc1, . . . , ψn−1cn−1]t.

Dokaz izreka je podoben dokazu izreka 3.7, ce upostevamo ψn = −1.

3.3.5 Rekurzivni algoritem za DFT

V tem razdelku bomo opisali osnovno idejo, ki pripelje do najenostavnejsega algo-ritma za DFT. Kot osnovo uporabljamo interpretacijo DFT s polinomi, ki smo joopisali v razdelku 3.3.3 in na podlagi katere so komponente podobe vektorja a =[a0, a1, . . . , an−1],

[p(ω0), p(ω1), . . . , p(ωn−1)

], kjer je p polinom p(x) =

∑n−1i=0 aix

i.Izhajamo iz dveh preprostih lastnosti n-tega primitivnega korena enote. Naj bon = 2r. Potem velja

(ωj+r)2 = ω2jω2r = ω2j (3.12)

inωj+r = −ωj . (3.13)

V veljavnost (3.13) se prepricamo na podlagi relacije (3.8). Namrec, razliko levega indesnega dela (3.12) razcepimo in dobimo

(ωj+r + ωj)(ωj+r − ωj) = 0.

Ker desni faktor leve strani ne more biti 0 [na podlagi (3.8)], velja torej (3.13).Sedaj pa naj bo podan polinom p(x) z vektorjem koeficientov a. Torej

p(x) = a0 + a1x+ . . .+ an−1xn−1.

Vpeljali bomo dva pomozna polinoma, p1(x) in p2(x), stopnje r − 1:

p1(x) = a1 + a3x+ . . .+ a2i+1xi + . . .+ an−1x

r−1,p2(x) = a0 + a2x+ . . .+ a2ix

i + . . .+ an−2xr−1.

(3.14)

Torej ima p1(x) koeficiente lihih potenc xi polinoma p(x), p2(x) pa sodih potenc.Nato lahko zapisemo

p(x) = xp1(x2) + p2(x2). (3.15)

Page 98: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

90 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

Ko iscemo F (a), oziroma vrednosti p(ωk) pri 0 ≤ k ≤ n−1, lahko uporabimo relacijo(3.15). Imamo torej

p(ωk) = ωkp1(ω2k) + p2(ω2k),p(ωk+r) = ωk+rp1(ω2(k+r)) + p2(ω2(k+r))

= −ωkp1(ω2k) + p2(ω2k),(3.16)

pri 0 ≤ k ≤ r − 1. Leve strani (3.16) lahko neposredno izracunamo s algoritmom,ki uporablja rekurzivni razcep: problem smo razbili na dva podproblema polovicnevelikosti. Podproblema sta izracuna pi(ω

2k), pri 0 ≤ k ≤ r − 1 in i = 1, 2. Bodimopozorni na to, da je ω2 primitivni r-ti koren enote in sta torej podproblema identicnaprvotnemu problemu, razen da smo n prepolovili. Relacija (3.13) nam se omogoca,da dobimo eno polovico vrednosti p(ωk) prakticno zastonj (izracunamo p(ωk), pri0 ≤ k ≤ r− 1, p(ωk+r) pa dobimo skoraj brez dodatnega racunanja, ce v desni straniprve vrstice 3.16 negiramo prvi clen).

3.12 Primer Opisano metodo bomo prikazali na majhnem primeru. Podan je po-linom x3 + 2x2 + 2x + 1 in zelimo izracunati DFT vektorja njegovih koeficientov,[1, 2, 2, 1]. V tem primeru sta p1(x) = x + 2 in p2(x) = 2x + 1. Lahko bi p1 in p2 senaprej razcepili in dobili stiri polinome stopnje 0, vendar bomo p1(ω0), p1(ω2), p2(ω0)in p2(ω2) kar neposredno izracunali z matriko DFT pri n = 2 (gl. primer 3.5).[

p1(ω0)p1(ω2)

]=

(1 11 −1

)[21

]=

[31

][p2(ω0)p2(ω2)

]=

(1 11 −1

)[12

]=

[3−1

].

Nato za izracun komponent transformiranega vektorja uporabimo enacbe (3.16):

p(ω0) = ω0p1(ω0) + p2(ω0) = 3 + 3 = 6p(ω1) = ω1p1(ω2) + p2(ω2) = −1 + ωp(ω2) = ω2p1(ω0) + p2(ω0) = 3− 3 = 0p(ω3) = ω3p1(ω2) + p2(ω2) = −1− ω

in dobimo isti rezultat kot ce [1, 2, 2, 1] neposredno zmnozimo z leve z matriko DFTza n = 4. 2

Cas, ki ga porabi algoritem, ki uporablja opisani izracun, ocenimo na podlagiizreka 1.3. Problem smo razcepili na dva podproblema (c = 2), ki ju moramo obaresiti (a = 2) in ker moramo za vsak element p(ωi), 0 ≤ i ≤ n− 1, izracunati le vsotodveh clenov, je r = 1. Iz tega izpeljemo porabo casa Θ(n log n) (gl. tudi nalogo 5 zanekatere podrobnosti).

Page 99: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 91

3.3.6 Iterativni algoritem za DFT

Pri zasnovi algoritmov se poskusamo izogibati rekurziji, ce je to le mogoce, ker je njenarealizacija casovno potratna. Izkaze se, da je to mozno storiti tudi v primeru DFT.Podobno kot pri rekurzivnem algoritmu iz razdelka 3.3.5 izhajamo iz pojmovanja DFTkot seznama vrednosti polinoma p(x) po modulu xn v tockah x = ω0, ω1, . . . , ωn−1,pri cemer so komponente vektorja, ki ga transformiramo, koeficienti p(x) pri stopnjahx. Pri sestavljanju iterativnega algoritma se opiramo na dve trditvi. Prva je

3.13 Trditev Naj bo p(x) polinom nad izbranim obsegom K in naj bo c ∈ K. V temprimeru velja

p(c) = p(x) mod (x− c). (3.17)

Dokaz. Relacija (3.17) sledi iz tega, ker je x − c polinom prve stopnje in je zatop(x) mod (x− c) polinom stopnje 0 (konstanta) c′ z lastnostjo

p(x) = q(x) · (x− c) + c′, (3.18)

kjer je q(x) nek drug polinom, ki ima stopnjo za eno manjso od stopnje p(x). Ocitnoje pri x = c prvi clen desne strani (3.18) enak 0 in je p(c) enako c′. 2

Druga trditev, ki jo potrebujemo, je

3.14 Trditev Naj bodo p(x), s(x), t(x) in u(x) polinomi nad izbranim obsegom K innaj velja s(x) = t(x) · u(x). V tem primeru velja

p(x) mod t(x) = (p(x) mod s(x)) mod t(x). (3.19)

Dokaz. Relacija (3.19) sledi iz definicije p(x) mod s(x) = rs(x), kjer je rs(x) polinom,ki ima stopnjo manjso ali enako stopnji s(x) ter lastnost,

p(x) = qs(x) · s(x) + rs(x), (3.20)

pri cemer je qs(x) nek drug polinom, ki zagotavlja enakost (3.20). Sedaj v levi strani(3.19) zamenjajmo p(x) z desno stranjo (3.20):

(qs(x) · s(x) + rs(x)) mod t(x) = (qs(x) · t(x) · u(x) + rs(x)) mod t(x)= rs(x)) mod t(x).

(3.21)

Leva stran prve vrstice (3.21) je enaka desni strani druge vrstice zato, ker velja qs(x) ·t(x) · u(x) mod t(x) = 0. 2

Relacija (3.19) omogoca, da uredimo vmesne delitelje v izracunu p(x) mod (x−ωk),pri 0 ≤ k ≤ n− 1 v drevesno strukturo, s cimer dosezemo, da izracunov ni potrebnoponavljati. Zadevo bomo najprej prikazali na primeru n = 4 in sele nato podali opissplosnega algoritma.

Page 100: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

92 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

x4 − 1

x− ω0

= x− 1x− ω2

= x+ 1 x− ω1x− ω3

= x+ ω

x2 − 1 x2 + 1

Slika 3.3: Drevesna urejenost deliteljev med izracunom DFT pri n = 4.

x3 + 2x2 + 2x+ 1

6 0 −1 + ω −1− ω

3x+ 3 x− 1

Slika 3.4: Ostanki po deljenju polinoma x3 + 2x2 + 2x+ 1 z delitelji na sliki 3.3.

3.15 Primer Slika 3.3 prikazuje delitelje za primer n = 4. Mimogrede: neposrednapodrejenost dveh deliteljev nekemu tretjemu delitelju pomeni, da je produkt prvihdveh enak tretjemu. Ce je podan polinom p(x) = a0 +a1x+a2x

2 +a3x3, je potrebno

izracunati vrednosti p(x) mod (x−1), p(x) mod (x+1), p(x) mod (x−ω) in p(x) mod(x + ω). Na podlagi relacije (3.19) bomo na primer pri izracunu p(x) mod (x − ω)najprej poiskali ostanek po deljenju p(x) z x4 − 1 (ocitno je to kar p(x)), nato bomodelili ta ostanek z x2 + 1 in poiskali ostanek, in koncno bomo slednji ostanek deliliz x − ω. Opisano zaporedje izracunov je na sliki 3.3 nakazano s crtkano potjo medkorenom in koncnim vozliscem x − ω. Bodimo pozorni na to, da v spodnji vrsticideliteljev na sliki 3.3 eksponenti ω niso urejeni v vrstnem redu 0, 1, 2, 3.

Metodo lahko prikazemo na primeru 3.12, ki smo ga ze uporabili kot primer zarekurzivno metodo. Izracun ostankov je prikazan na sliki 3.4 in lahko ugotovimo, da

Page 101: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 93

d03(x)

d00(x) d10(x) d20(x) d30(x) d40(x) d50(x) d60(x) d70(x)

d01(x) d21(x) d41(x) d61(x)

d02(x) d42(x)

Slika 3.5: Drevesna urejenost deliteljev med izracunom DFT pri n = 8.

d03(x) = x8 − ω0

d02(x) = x4 − ω0 d42(x) = x4 − ω4

d01(x) = x2 − ω0 d21(x) = x2 − ω4 d41(x) = x2 − ω2 d61(x) = x2 − ω6

d00(x) = d10(x) = d20(x) = d30(x) = d40(x) = d50(x) = d60(x) = d70(x) =x− ω0 x− ω4 x− ω2 x− ω6 x− ω1 x− ω5 x− ω3 x− ω7

Slika 3.6: Vrednosti delitevljev pri n = 8.

so ostanki v spodnji vrstici istovetni z vrednostmi, ki smo jih dobili v primeru 3.12.2

Sedaj se pa lotimo splosnega algoritma. Obravnavali bomo primer n = 2k, prik ≥ 0. Delitelje uredimo v drevesno strukturo, podobno kot na sliki 3.3. Oznacevanjedeliteljev, kakor tudi njihove dejanske vrednosti za primer k = 3 so prikazani naslikah 3.5 in 3.6. Iz slik 3.3 in 3.5 ugotovimo, da ima drevo deliteljev k+1 vodoravnihvrstic, ki so ostevilcene od 0 do k, in sicer od spodnje vrstice do korena drevesa. Pridelitelju z oznako dih predstavlja indeks h stevilko vrstice (“visino”), za prve indeksei pri doloceni visini h pa uporabljamo ostevilcenje, ki se zacenja z 0 in uporabljaprirastek 2h. Lahko postavimo vprasanje, zakaj i preprosto ne ustreza mestu deliteljav svoji vrstici, vendar za enkrat nanj se ne bomo odgovorili, naj zadostuje, da povemo,da ima tudi stevilo, ki predstavlja mesto delitelja svojo vlogo, ki jo bomo razloziliv kratkem. Pri stevilih, ki oznacujejo eksponente oziroma indekse, je n izenacenoz 0 (ker predstavljamo polinome po modulu xn!), zato za njih zadostuje dvojiska

Page 102: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

94 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

0l . . . 0

i︷ ︸︸ ︷h bitov

k bitov

Slika 3.7: Dvojiska predstavitev indeksa i delitelja dih.

rev4(19) = rev4(1011B) = 1101B = 21

Slika 3.8: Funkcija rev (dvojiska predstavitev je oznacena z “B”).

predstavitev dolzine k (k bitov)5. Pri taki predstavitvi in na podlagi pravkar zapisanerazlage predstavlja indeks i delitelja dih stevilo, ki ima zadnjih h bitov enakih 0 (gl.sliko 3.7), z drugimi besedami, i = i′ · 2h, pri nekem i′ v intervalu [0, . . . , 2k−h − 1].

Delitelji so definirani kot,

dih = x2h

− ωs, (3.22)

pri cemer je s podobno kot i neko stevilo z dvojisko predstavitvijo, ki ima na desni hnicelnih bitov, torej je s = l · 2h. V takem primeru dobimo naslednjo povezavo meddelitelji v dveh sosednih vrsticah drevesa deliteljev:

x2h+1 − ωl·2h+1

= (x2h − ωl·2h)(x2

h

+ ωl·2h

)

= (x2h − ωl·2h)(x2

h − ωl·2h+n2 ).

(3.23)

Preden nadaljujemo bomo zapisali se neko definicijo, ki jo bomo potrebovali.

3.16 Definicija Naj bosta k in n pozitivni celi stevili. Z revk(n) bomo oznacevalistevilo z dvojisko predstavitvijo dolzine k, ki je enako zrcalni podobi dvojiske predsta-vitve n (gl. sliko 3.8). V primeru, ko je dolzina dvojiske predstavitve n vec kot k, predzrcaljenjem odvecne bite odrezemo, v primeru, ko pa je manj kot k, dodamo ustreznostevilo nicelnih bitov.

Sedaj se bomo poglobili v urejenost deliteljev x2h − ωl·2

h

v vrstici h. Relacija

(3.23) nam razodeva, da se delitelj iz visje vrstice, x2h+1 − ωl·2h+1

, razcepi na dvadelitelja, pri katerih dobimo ustrezna eksponenta ω tako, da l · 2h+1 pomaknemo za

5Seveda pa to ne velja za koeficiente ai polinomov, ki jih predstavljamo kot obicajna stevila, neglede na vrednost k.

Page 103: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 95

h+ 1 bitov︷ ︸︸ ︷

︸ ︷︷ ︸h bitov

l 0 . . . . . . 0

l0 0 . . . 0

l1 0 . . . 0

Slika 3.9: Odvisnost indeksov deliteljev v nizji vrstici drevesa od indeksa delitelja vvisji vrstici.

eno dvojisko mesto v desno in nato enkrat v prvo dvojisko mesto z leve zapisemo 0,drugic pa 1 (gl. sliko 3.9). Na podlagi te ugotovitve lahko dokazemo naslednjo trditev,

3.17 Trditev Naj bo,

x2h

− ωli·2h

, i = 0, 1, . . . , 2k−h − 1,

delitelj na mestu i z leve v vrstici h. V tem primeru je li · 2h = revk(i). Ocitno veljatudi i = revk(li · 2h).

Preden se lotimo dokaza, naj opozorimo, da v pravkar zapisani trditvi uporabljamomesto delitelja v vrstici in ne njegovega indeksa, kot je bil opisan prej.

Dokaz. Za zgornjo vrstico drevesa je trditev ocitna, saj vsebuje le en delitelj zvrednostjo l0 = 0. Sedaj denimo, da trditev velja za delitelje v vrstici h+ 1 in naj bo

x2h+1 − ωl·2h+1

nek delitelj iz te vrstice. Njegovo mesto je revk(l · 2h+1) (na podlagipredpostavke), mesti njegovih naslednikov v nizji vrstici pa sta 2 · revk(l · 2h+1) in2 · revk(l · 2h+1) + 1 (ker je deliteljev v nizji vrstici dvakrat toliko kot v visji). Cesta koeficienta pri 2h dveh naslednikov l′ in l′′, sledi iz (3.23) oziroma pripombe predtrditvijo 3.17, da je

revk(l′2h) = 2 · revk(l · 2h+1)

inrevk(l′′2h) = 2 · revk(l · 2h+1) + 1.

Slednji dve enacbi veljata zato, ker se desni pomik kolicine l · 2h+1 prevede v levipomik (in s tem mnozenje z 2) kolicine revk(l · 2h+1). 2

Page 104: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

96 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

3.18 Primer Naj bo n = 23 = 8. V tem primeru so delitelji v spodnji vrstici drevesa(h = 0),

d00(x) = (x− ω0),d10(x) = (x− ω4),d20(x) = (x− ω2),d30(x) = (x− ω6),

d40(x) = (x− ω1),d50(x) = (x− ω5,d60(x) = (x− ω3),d70(x) = (x− ω7).

Torej je zaporedje eksponentov ω,

0, 4, 2, 6, 1, 5, 3, 7,

kar je enako,

rev3(0), rev3(1), rev3(2), rev3(3), rev3(4), rev3(5), rev3(6), rev3(7). 2

Pri eksponentu ω, l · 2h, delitelja dih bodimo pozorni na dejstvo, da v primeru, kone bi zrcalili zaporednega mesta delitelja temvec njegov indeks i (ki ima desnih h bitovenakih 0), bi dobili l in ne l · 2h. Do sedaj smo za eksponent ω potrebovali lastnost,da je mnogokratnik 2h, zato da smo izpeljali rekurzivno relacijo (3.23), odslej pa nasnjegov razcep v obliki l · 2h ne bo zanimal in bo zadostovalo, da je njegova vrednostv zrcalni povezavi z mestom delitelja v svoji vrstici.

Glede na to, da imajo vsi delitelji dij preprosto obliko x2h − ωs, se tudi izracun

ostankov ustrezno poenostavi. Ko je p(x) =∑2h+1−1j=0 ajx

j , lahko zapisemo

p(x) mod (x2h

− ωs) = r(x) =

2h−1∑j=0

(aj + ωsaj+2h)xj . (3.24)

Relacijo (3.24) preverimo tako, da desno stran vstavimo namesto r(x) v

p(x) =

2h−1∑j=0

aj+2hxj

(x2h

− ωs) + r(x).

Popoln iterativni algoritem za DFT je prikazan na sliki 3.10. V prikazanem al-goritmu so vhodni podatki v tabeli a, rezultat pa v b. Bodimo pozorni na operacijozrcaljenja dvojiske predstavitve l v vrstici 8, ki je potrebna zaradi trditve 3.17.

Nasa zadnja pripomba o algoritmu na sliki 3.10 se bo nanasala na njegovo poraboprostora. Koeficienti polinoma r0,k (ostanek pri korenu drevesa) so kar vhodni podatkia. Nato pa bi se na prvi pogled zdelo, da v vsaki vrstici drevesa potrebujemo enotabelo, ki vsebuje koeficiente ri,h+1, ter dve, ki vsebujeta koeficiente rl,h in rl+2h,h.Ker pa je koeficientov ri,h+1 natanko toliko kot koeficientov rl,h in rl+2h,h skupaj, jeskupna dolzina izhodnih tabel enaka dolzini vhodne tabele. Nadalje, ce smo pozorniugotovimo, da koeficiente rl,h in rl+2h,h pravzaprav lahko spravimo v prostor, ki so gaprej zasedali koeficienti ri,h+1. Namrec, ce v vrsticah 9 in 10 izracun koeficientov rl,h

Page 105: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.3 DISKRETNA FOURIERJEVA TRANSFORMACIJA 97

1 (∗ n = 2k ∗)3 BEGIN

3 (∗ Naj bo r0,k =∑n−1

j=0ajx

j ∗)4 FOR h:=k−1 BY −1 TO 0 DO5 i :=0 ;6 WHILE i < n DO

7 (∗ Naj bo ri,h+1 =∑2h+1−1

j=0ajx

j ∗)8 s:= revk(i DIV 2h) ;

9 ri,h :=∑2h−1

j=0(aj + ωsaj+2h)xj ;

10 ri+2h,h :=∑2h−1

j=0(aj + ωs+n/2aj+2h)xj ;

11 i := i + 2(h+1)

13 END13 END ;14 FOR i :=0 TO n−1 DO brevk(i) := ri,0 END16 END

Slika 3.10: Iterativni algoritem za DFT

in rl+2h,h izvajamo istocasno, lahko koeficiente rl,h zapisujemo na mesta koeficientovaj ostanka ri,h+1 pri 0 ≤ j < 2h, koeficiente rl+2h,h pa na mesta koeficientov aj+2h . Iztega sledi, da potrebujemo le eno tabelo koeficientov med celotnim izracunom. Sedajpostane ocitna tudi indeksacija deliteljev dih: i predstavlja zacetni indeks koeficientovostanka ri,h v tabeli koeficientov a. Ker ima ri,h 2h koeficientov, narasca i s takimprirastkom. Lahko tudi ugotovimo, da posebna izhodna tabela b ni potrebna, kajtizaradi lastnosti revk(revk(i)) = i, lahko izracun v vrstici 14 izpeljemo kot eno samozaporedje zamenjav dveh vrednosti, ki ga lahko opravimo z eno zacasno spremenljivko(za podrobnosti gl. nalogo 6).

Do sedaj smo zanemarili neko navidez pomembno vprasanje: opisali smo dvaucinkovita algoritma za DFT, vendar nobenega za inverzno transformacijo! Glede nato, da inverzno transformacijo potrebujemo enako pogosto kot DFT, bi kazalo, daproblema sploh nismo resili. Vendar je na sreco mozno iz algoritma za DFT breztezav pridobiti algoritem za inverzno DFT na podlagi ugotovitve, da je v primeru,ko je ω n-ti primitivni koren enote, tudi ω−1 n-ti primitivni koren enote (preverjanjetega prepuscamo bralcu za vajo). Na podlagi tega je mozno inverzno matriko DFTpredstaviti v obliki

F−1 =1

n

(ω−ij

)=

1

n

((ω−1)ij

).

Matrika na desni (brez faktorja 1n ) seveda predstavlja matriko DFT glede na nov n-ti

primitivni koren enote ω−1. To pa pomeni, da je mozno inverzno DFT izracunatis poljubnim algoritmom za DFT po zamenjavi ω z ω−1 in z naknadnim mnozenjemvseh komponent rezultata z 1

n .

Page 106: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

98 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

Na koncu bi bilo potrebno se preveriti, da iterativni algoritem na sliki 3.10 zahtevaO(n2 log n) operacij. Na ta nacin bi se prepricali, da je po velikostnem redu enakoucinkovit kot rekurzivni algoritem, ker pa ne uporablja rekurzije, lahko upamo, da jedejansko boljsi (in tudi je). Vendar podrobno izpeljavo tega dejstva izpuscamo, kerbrez tezav sledi iz zapisa algoritma na sliki 3.10 (vaja).

3.4 Povzetek osnovnih pojmov

1. Klasicni algoritem za mnozenje matrik in njegova poraba casa

2. Winogradov algoritem in zakaj ga ni mozno uporabiti rekurzivno

3. Strassenov algoritem in ocena njegove porabe casa

4. n-ti primitivni koren enote in njegove lastnosti

5. Matrika diskretne Fourierjeve transformacije in njene lastnosti

6. Koeficientna in vrednostna predstavitvi polinoma

7. Polinomi po modulu xn

8. Povezava med DFT in polinomi

9. Konvolucija polinomov ter izrek o konvoluciji

10. Pozitivna in negativna ovita konvolucija ter izrek o pozitivni in negativni oviti konvo-luciji

11. Rekurzivni algoritem za DFT in lastnosti n-tega primitivnega korena enote, ki omogocajonjegovo delovanje

12. Iterativni algoritem za DFT (povezava med racunanjem vrednosti polinoma in racunanjemostanka polinoma po deljenju z linearnim polinomom; nacelo postopnega ali iterira-nega racunanja ostankov; urejanje deliteljev pri racunanju ostankov v dvojisko drevo;operator zrcaljenja)

13. Algoritem za inverzno DFT.

3.5 Naloge

1. Preverite izracun, da definicija konvolucije dveh polinomov stopnje n − 1 vsebuje n2

mnozenj.

2. Opisite matriko koordinatne transformacije, ki spremeni koeficientno predstavitev po-linoma p(x) stopnje n−1 v vrednostno predstavitev pri vrednostih x = c0, c1, . . . , cn−1.

3. Kaksen pogoj mora biti izpolnjen, da je predstavitev polinomov po modulu xn z vre-dnostmi pri c0, c1, . . . , cn−1 enakovredna predstavitvi s koeficienti pri xi? Razmisliteo pomenu pojma “enakovredna”.

4. Bazo prostora polinomov po modulu xn pri koeficientni predstavitvi tvorijo polinomixi, 0 ≤ i ≤ n− 1. Kateri polinomi pa predstavljajo bazo prostora po opravljeni DFT?

Page 107: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

3.5. NALOGE 99

5. Pri realizaciji rekurzivnega algoritma za DFT se srecamo z naslednjim problemom: priprvem poskusu ugotovimo, da je potrebno uporabiti poleg prostora za vektor koefici-entov vhodnega polinoma se dodaten prostor za koeficiente polinomov, ki nastanejopri rekurzivnih klicih. Ce je prvotni vektor dolzine n, potrebujemo 2n dodatnih celicprostora (naloga: preverite to trditev). Razmislite o realizaciji rekurzivnega algoritma,ki ne bi potreboval dodatnega prostora (kot smo to dosegli pri algoritmu za urejanjes porazdelitvami). Napotek: osnovna tezava je, da so pri kolicinah, ki predstavljajorezultat rekurzivnih klicev,

p2(ω0), p1(ω0), . . . , p2(ω2i), p1(ω2i), . . . , p2(ω2(r−1)), p1(ω2(r−1))

in rezultatu DFTb0, b1, . . . , br, br+1, . . . , bn−1,

bi in br+i, pri 0 ≤ i ≤ r − 1 odvisni od p2(ω2i) in p1(ω2i), kar preprecuje, da za prviin drugi vektor uporabimo isti prostor.

Mozna resitev je, da rezultata rekurzivnih klicev preuredimo v vrstni red

p2(ω0), . . . , p2(ω2i), . . . , p2(ω2(r−1)), p1(ω0), . . . , p1(ω2i), . . . , p1(ω2(r−1)).

Po tem je mozno prostor, ki sta ga zasedala p2(ω2i) in p1(ω2i), uporabiti za bi in br+i.Najugodneje je preurejanje izvajati ze na prvotnih koeficientih polinoma p. Kolikocasa porabi opisani postopek?

6. Na koncu iterativnega algoritma za DFT smo morali opraviti zamenjave koeficientov vizhodni tabeli tako, da smo vsak koeficient zamenjali s koeficientom, ki ima “zrcalni”indeks. Zapisano je, da za to operacijo ni potrebno imeti posebne tabele izhodnihkoeficientov. Vendar bi se na prvi pogled zdelo, da potrebujemo vsaj en bit informacijena koeficient, ki nam pri obiskovanju koeficientov pove, ali smo koeficient ze zrcalili.Predlagajte algoritem, ki odpravi potrebo tudi po tem dodatnem prostoru.

Page 108: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

100 POGLAVJE 3. ALGORITMI Z REKURZIVNIM RAZCEPOM

Page 109: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 4

POZRESNI ALGORITMI

4.1 Uvod

V tem poglavju se bomo zaceli ukvarjati z optimizacijskimi problemi, kot pravimonalogi iskanja najboljse resitve v neki mnozici resitev. Optimizacijski problemi sepojavljajo v stevilnih razlicicah, ki pogojujejo tudi razlicne pristope k njihovemuresevanju. V najpreprostejsi razlicici naloge imamo mnozico “objektov”, ki jim znamoprirediti “ceno”, oziroma vrednost, in iscemo takega, ki ima najmanjso (ali najvecjo)ceno, oziroma vrednost1. Pogosto uporabljamo pri izbiri predmetov poleg kriterijavrednosti se kaksen drug kriterij, ki mu preprosto pravimo kriterij “dopustnosti”.Splosno zgradbo takega problema predstavlja kar navadno, linearno iskanje, kot gaprikazuje slika 4.1. Ponavadi je osnovna tezava pri podobnih problemih velikost nin je potrebno vloziti precej napora, da spravimo obseg racunanja v znosne meje.V skrajnem primeru je n neskoncno in je potrebno z matematicno analizo izracunoptimuma prevesti na iskanje po koncni mnozici.

Vcasih pa imamo opravka z zmerno velikostjo n, vendar je naloga poiskati nekopodmnozico elementov ui, 1 ≤ i ≤ n, ki ima zelene, optimalne lastnosti (gl. sliko 4.2).V takem primeru naloga pogosto postane neobvladljiva tudi pri zmerno velikem n (inkljub temu, da je program na sliki 4.2 prakticno identicen s programom na sliki 4.1),zato ker je stevilo podmnozic eksponentno odvisno od n.

V nekaterih primerih pa je mozno nalogo na sliki 4.2 mocno poenostaviti in izpe-ljati izbiro elementov optimalne podmnozice tako, da jih izbiramo enega za drugim,pri cemer vsak element obravnavamo le enkrat. To je mozno, kadar je vrednost nekepodmnozice preprosto vsota vrednosti njenih elementov in ko izbira nekega elementane more postaviti pod vprasaj izbire njegovih predhodnikov (izbire elementov so ne-odvisne). V tem primeru je mozno elemente ovrednotiti pred postopkom sestavljanjaoptimalne podmnozice in jih vkljucevati v optimalno podmnozico na podlagi njihovevrednosti. Ker opisan algoritem najprej “pohrusta” element z najvecjo vrednostjo

1Izraz cena je primeren, ko iscemo najmanjso kolicino, vrednost pa, ko iscemo najvecjo.

101

Page 110: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

102 POGLAVJE 4. POZRESNI ALGORITMI

VAR maxvr :INTEGER;x ,maxelx :index ; (∗ tip, ki mu pripadajo indeksi elementov ∗)

BEGIN(∗ U je mnozica elementov u1, u2, . . . , un ∗)

maxelx :=1; maxvr :=vrednost(u1);FOR x :=2 TO n DOIF dopustno(ux) & (vrednost(ux) > maxvr) THEN

maxvr :=vrednost(ux); maxelx :=xEND

END(∗ rezultat je element z indeksom maxelx in vrednostjo maxvr ∗)

END

Slika 4.1: Osnovna oblika algoritma za resevanje optimizacijskega problema

VAR maxvr :INTEGER;(∗ U je mnozica elementov u1, u2, . . . , un ∗)(∗ podmnozico Ax ⊂ U predstavljamo s karakteristicno funkcijo x, ki pa jo lahkopredstavimo kot stevilsko vrednost, cigar dvojiska predstavitev nakazuje,kateri elementi so vkljuceni v podmnozico ∗)

x ,mnx :INTEGER; (∗ indeksa trenutne podmnozice in maksimalne podmnozice ∗)BEGIN

mnx :=0; maxvr :=vrednost(Amnx);FOR x :=1 TO 2n − 1 DOIF dopustno(Ax) & (vrednost(Ax) > maxvr) THEN

maxvr :=vrednost(Ax); mnx :=(x )END

END(∗ rezultat je Amnx z vrednostjo maxvr ∗)

END

Slika 4.2: Iskanje optimalne podmnozice

Page 111: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

4.2. OSNOVNA ZGRADBA POZRESNEGA ALGORITMA 103

TYPEElement = . . .

VAR maxvr :INTEGER; s:SetOfElement ;VAR a: ARRAY OF Element ;

BEGIN(∗ U je mnozica elementov u1, u2, . . . , un ∗)(∗ Elemente u1, u2, . . . , un uredimo po nenarascajocivrednosti in tako urejeno zaporedje priredimo tabeli a ∗)

maxvr :=0; s:=∅;FOR x :=1 TO n DOIF dopustno(s∪a[x]) THEN

s:=s∪a[x] ; INC (maxvr ,Vrednost(a[x ]))END

END(∗ rezultat je mnozica s z vrednostjo maxvr ∗)

END

Slika 4.3: Osnovna oblika pozresnega algoritma

(najbolj “slasten” element), mu pravimo, da je “pozresen”.

4.2 Osnovna zgradba pozresnega algoritma

Osnovna zgradba pozresnega algoritma je prikazana na sl. 4.3. Iz slike je razvi-dno, da pri takem nacinu resevanja ne gre za zapleten program in je torej morebitnatezavnost resevanja problema s pozresnim algoritmom kvecjemu v iskanju primernegapozresnega vrstega reda in pa v dokazovanju, da pozresna metoda resnicno poisceresitev.

V preostanku poglavja bomo prikazali nekaj zgledov, kako se prepricamo v pravil-nost pozresnega resevanja problemov.

4.3 Razvrscanje zapisov na magnetnem traku

Imamo n zapisov, ki jih zelimo zapisati na magnetni trak tako, da jih lahko kasnejepo potrebi preberemo. Naprava za magnetni trak ima lastnost, da pred vsako zahtevopo branju zapisa trak previje na zacetek, nato zeleni zapis poisce tako, da vsebinotraku bere od zacetka proti koncu, dokler ne prebere iskanega. Trak se premika skonstantno hitrostjo in zato je cas za celotno operacijo sorazmeren dolzini traku dokonca iskanega zapisa. Ce je verjetnost zahteve po branju i-tega zapisa enaka pri vsehi, 1 ≤ i ≤ n, katero zaporedje zapisov na traku zagotavlja najmanjsi povprecni casbranja enega zapisa. Dolzina zapisa z indeksom i je li. Naj bo zaporedje zapisov natraku

i1, i2, . . . , in. (4.1)

Page 112: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

104 POGLAVJE 4. POZRESNI ALGORITMI

Cas, ki ga porabimo za branje j-tega zapisa je potemtakem,

tj = c ·j∑

k=1

lik ,

kjer je c koeficient proporcionalnosti med casom in dolzino. Povprecni cas za branjevseh zapisov pri privzetku, da je njihovo branje enakoverjetno, pa je

t =1

n

n∑j=1

tj =c

n

n∑j=1

j∑k=1

lik . (4.2)

Naloga je torej, poiskati zaporedje (4.1), ki zagotavlja minimalno vrednost kolicine(4.2).

Ceprav je naloga trivialna, predstavlja njena resitev prikaz osnovne tehnike resevanjasorodnih problemov. Naloga je namrec trivialna zato, ker iz pogojev vidimo, da sezapisi pri zacetku traku veckrat berejo od zapisov pri koncu in je torej smiselno po-staviti krajse zapise na zacetek. Torej na podlagi tega premisleka uganemo, da jepravilna resitev razvrstitev zapisov v nepadajocem zaporedju njihove dolzine. V temprimeru je predikat dopustno na sliki 4.3 neodvisen od x in vedno resnicen. Sedajdokazimo, da v takem primeru pozresno zaporedje predstavlja pravilno resitev. Najbo

I = i1, i2, . . . , in,

pozresno zaporedje, torej zaporedje, za katerega velja

li1 ≤ li2 ≤ . . . ≤ lin ,

pri cemer imamo dodaten pogoj, da v primeru dveh zapisov ij in ij+1 enakih dolzin ve-lja ij < ij+1. Sedaj denimo, da to zaporedje ni pravilna resitev. Z drugimi besedami,obstaja neko drugo zaporedje,

J = j1, j2, . . . , jn,

ki je optimalno. Glede na to, da sta I in J razlicna, obstaja prvi indeks (ko gremo odzacetka proti koncu), kjer se razlikujeta. Naj bo to indeks h. Torej velja ik = jk, 1 ≤k < h, in ih 6= jh. In ker se v obeh zaporedjih pojavljajo vsi indeksi, gotovo obstajatako k > h, da je jk = ih. Sedaj J spremenimo v J ′ tako, da zamenjamo polozaja jhin jk, nato pa na podlagi (4.2) izracunamo t(J)− t(J ′):

t(J)− t(J ′) =c(k − h)

n(ljh − ljk).

Glede na to, da velja ljk = lih ≤ ljh , ugotovimo, da velja t(J) − t(J ′) ≥ 0. Vprimeru vrednosti 0 je J ′ enakovredna resitev, vendar bolj podobna resitvi I. Cepostopek nadaljujemo z J ′ namesto J , dobimo na koncu v primeru, ko je razlikamed povprecnima casoma zaporedij vedno 0, zaporedje, ki je identicno z I, kar je vnasprotju s privzetkom, da I ni pravilna resitev. Ko pa velja t(J) − t(J ′) > 0, smodobili strogo boljso resitev od J , kar je v protislovju s privzetkom, da je J optimalnaresitev.

Page 113: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

4.4. RAZVRSCANJE POSLOV V DELAVNICI Z ENIM STROJEM 105

resitev zaporedje vrednost1,2 2,1 1101,3 1,3 ali 3,1 115

• 1,4 4,1 1272,3 2,3 253,4 4,3 421 1 1002 2 1003 3 154 4 27

Slika 4.4: Resitev problema razvrscanja poslov iz primera 4.1

4.4 Razvrscanje poslov v delavnici z enim strojem

Neka delavnica ima en sam stroj, ki obdeluje posle enega za drugim in za vsak poselporabi enoto casa. Ce imamo n poslov, tako da je i-temu prirejena vrednost vi in rokizgotovitve ti, se postavlja problem poiskati podmnozico poslov in vrstni red njihovegaizvajanja, s katerima dosezemo najvecjo skupno vrednost izgotovljenih poslov pripogoju, da so vsi posli iz podmnozice dokoncani do svojega roka.

4.1 Primer Imamo naslednje podatke:

n = 4 v = 〈100, 10, 15, 27〉 t = 〈2, 1, 2, 1〉 ,

kjer je v vektor vrednosti poslov, t pa vektor roka izgotovitve. Slika 4.4 prikazuje vsemozne resitve ter med njimi optimalno (gl. tudi nalogo 1). 2

Najprej vpeljemo nekaj pojmov: zaporedje poslov 〈i1, i2, . . . , ik〉 je dopustno, kose posli lahko obdelujejo v takem zaporedju, ne da bi katerikoli zamujal. Podmnozicaposlov i1, i2, . . . , ik je dopustna v primeru, ko za posle iz podmnozice obstaja nekodopustno zaporedje.

Sedaj dokazemo, da ni potrebno obravnavati vseh moznih zaporedij poslov iz nekepodmnozice, temvec je pri preverjanju dopustnosti podmnozice potrebno preveriti leeno samo zaporedje.

4.2 Trditev Ce je zaporedje izvajanja poslov

J = 〈j1, j2, . . . , jk〉,

dopustno, je dopustno tudi pozresno zaporedje

I = 〈i1, i2, . . . , ik〉,

ki ima lastnost, da so posli urejeni po nepadajocem roku izgotovitve: ti1 ≤ ti2 ≤ . . . ≤tik , v primeru enakega roka pa po narascajocem indeksu.

Page 114: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

106 POGLAVJE 4. POZRESNI ALGORITMI

Dokaz. Trditev dokazemo podobno, kot smo dokazali optimalnost pozresnega zapo-redja iz razdelka 4.3: naj bo I pozresno zaporedje in denimo, da ni dopustno. J jedopustno zaporedje, ki pa se razlikuje od I. V tem primeru obstaja nek prvi indeks h(od leve proti desni), pri katerem se zaporedji razlikujeta. Ker je I pozresno zaporedje,velja tih ≤ tjh in ker obe zaporedji vsebujeta iste elemente, je posel z indeksom ih tudiv zaporedju J , na primer na k-tem mestu, pri cemer velja k > h in seveda jk = ih.Ko v J zamenjamo mesti poslov jh in jk, dobimo zaporedje J ′, ki je bolj podobnoI in prav tako dopustno. Namrec jk = ih lahko obdelamo na h-tem mestu, ker vsakposel lahko prestavimo naprej; po drugi strani pa lahko jh obdelamo na k-tem mestuzato, ker velja tih = tjk ≤ tjh (ce je bilo mozno obdelati jk na k-tem mestu, je gotovomozno obdelati na tem mestu tudi jh, ki ima enak ali kasnejsi rok). Z veckratnouporabo opisanega postopka pridemo do dopustnega zaporedja, ki je identicno z I. 2

Naslednji izrek pa utemeljuje uporabo pozresne metode.

4.3 Izrek Optimalno zaporedje izvajanja poslov je pozresno zaporedje

I = 〈i1, i2, . . . , ik〉,

kjer na koraku j izberemo posel z najvecjo vrednostjo med preostalimi posli, pod pogo-jem, da po prikljucitvi novega posla mnozica izbranih poslov ostane dopustna.

Dokaz. Naj trditev iz izreka ne drzi in naj bo I zaporedje poslov na podlagi pozresnegakriterija, kot je opisano v trditvi,

J = 〈j1, j2, . . . , jr〉,

pa domnevno razlicno, optimalno zaporedje.Najprej obe zaporedji uredimo po padajoci vrednosti, v primeru enakih vrednosti

pa po narascajocem indeksu:

vi1 ≥ vi2 ≥ . . . ≥ vik ,

vj1 ≥ vj2 ≥ . . . ≥ vjr .

Takoj ugotovimo, da I ni stroga podmnozica J (I ⊂ J in I 6= J), ker bi v takemprimeru tudi pozresna metoda nadaljevala z izbiranjem elementov. Torej eksistiraindeks h ≤ min(k, r), tako da velja

iq = jq, q = 1, 2, . . . , h− 1 in ih 6= jh.

Pozresna metoda izbira posle po padajoci vrednosti, v primeru enakih vrednostipa po narascajocem indeksu. Zato velja vih ≥ vjh . V primeru vih > vjh ugotovimo,da ih∈/ J (ker smo zaporedje J naknadno uredili po padajoci vrednosti oziroma, vprimeru enakih vrednosti, po narascajocem indeksu); pri vih = vjh pa prav tako veljaih∈/ J , ker pozresna metoda v takem primeru posle izbira na podlagi narascajocegaindeksa, J pa smo na tak nacin uredili naknadno.

Page 115: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

4.5. POVZETEK OSNOVNIH POJMOV 107

Ker je J dopustna resitev, lahko posle, ki jo sestavljajo, izvrsimo v vrstnem redunepadajocega roka izgotovitve. Naj bo R podmnozica poslov iz J , ki vsebuje zacetneposle iz pravkar opisanega zaporedja izvajanja, do vkljucno posla, ki se izvaja nakoraku tih . Ker vsak posel traja en korak, velja

| R | = min(r, tih).

Toda | R | < tih ni mozno (ker bi potem lahko vkljucili se posel ih); torej velja

| R | = tih .

Ker so posli do h-tega prisotni v obeh resitvah, obstaja v R posel jh′ , pri h′ > h.Sedaj sestavimo mnozico,

J ′ = J − jh′+ ih.

Mnozica J ′ je dopustna. Ker velja vih ≥ vjh ≥ vjh′ , velja tudi∑i∈J′

vi ≥∑i∈J

vi. (4.3)

Torej smo prisli do resitve, ki je na podlagi (4.3) bodisi boljsa od J , kar je v nasprotju sprivzetkom o optimalnosti J , ali prav tako optimalna in bolj podobna pozresni resitvi(ima daljsi skupni zacetek). 2

Za nalogo razvrscanja poslov v delavnici z enim strojem prikazuje slika 4.5 preprostalgoritem, ki uporablja urejanje z navadnim vstavljanjem. Resitev E vsebuje posle, kiso na podlagi trditve 4.2 urejeni po narascajocem roku izgotovitve. Zanka v vrsticah33–39 obravnava predmete enega za drugim in za vsak predmet preverja, ali ga jedopustno vstaviti v obstojeco resitev. To je mozno takrat, ko imajo vsi predmeti skasnejsim rokom kot je rok predmeta i, se toliko zaloge pri svojem roku izgotovitve,da jih lahko v resitvi prestavimo za eno mesto visje.

4.5 Povzetek osnovnih pojmov

1. Opis optimizacijskega problema

2. Opis pozresne metode

3. Osnovna tezava pri realizaciji pozresne metode

4. Znacilen nacin dokazovanja pravilnosti pozresne metode na primeru razvrscanja zapi-sov na magnetnem traku

5. Naloga razporejanja poslov v delavnici z enim strojem.

Page 116: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

108 POGLAVJE 4. POZRESNI ALGORITMI

1 (∗ stevilo poslov je n in imajo indekse 1, 2, . . . , n. Podatki o poslih2 so zapisani v tabeli AElt, urejeni pa so po nenarascajocih cenah;3 AElt[i].t je skrajni rok izgotovitve posla i, AElt[i].v pa je njegova4 vrednost. E[r] je indeks posla v optimalni resitvi, ki se izvaja na5 koraku r ∗)6 TYPE Elt=RECORD v ,t :INTEGER (∗ opis posla ∗)7 END;8 VAR (∗ posli urejeni po nenarascajoci vrednosti ∗)9 AElt : ARRAY n OF Elt ;

10 maxvr : INTEGER;11 (∗ resitev urejena po narascajocem roku izgotovitve ∗)12 E : ARRAY n+1 OF INTEGER;13 i , (∗ tekoci indeks tabele AElt ∗)14 j , (∗ pomozna spremenljivka ∗)15 k , (∗ tekoci indeks resitve E ∗)16 r , (∗ meja znotraj E , do katere elementov ne prestavljamo ∗)17 : INTEGER;1919 PROCEDURE Dopustno(i ,k :INTEGER;20 VAR r :INTEGER):BOOLEAN ;21 (∗ posel i je mozno dodati resitvi velikosti k ;22 r je mesto, nad katerega vstavimo nov posel ∗)24 BEGIN24 r :=k ;25 (∗ poiscemo mesto posla i ∗)26 WHILE (E [r ].t > AElt [i ].t) & (E [r ].t # r) DO DEC (r) END;27 (∗ preverimo dopustnost ∗)28 RETURN (E [r ].t≤AElt [i ].t) & (AElt [i ].t > r)29 END Dopustno ;3131 BEGIN AElt [0].t :=0;E [0]:=0; (∗ cuvaj ∗)32 maxvr :=0; k :=1; E [1]:=1;33 FOR i :=2 TO n DO34 IF Dopustno(i ,k ,r) THEN35 (∗ elemente resitve prestavimo za eno mesto ∗)36 FOR j :=k TO r+1 BY −1 DO E [j +1]:=E [j ] END;37 (∗ i postavimo na svoje mesto v resitvi, povecamo k in maxvr ∗)38 E [r+1]:=i ; INC (k); INC (maxvr ,AElt [k ].v)39 END;41 END41 END.

Slika 4.5: Podrobnosti programa za razvrscanje poslov

Page 117: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

4.6. NALOGE 109

4.6 Naloge

1. Pri primeru 4.1 opravite natancno analizo in dokazite, da slika 4.4 prikazuje vse mozneresitve.

2. (Cormen, Leiserson in Rivest) Potnik se pelje po avtocesti od mesta A do B in zelipotovanje opraviti s cimmanj postanki za polnjenje goriva. Ima tudi karto z razdaljamido vseh avtocestnih servisov. Ce velja privzetek, da v potnikovo posodo za gorivo grevec goriva kot je potrebno za najvecjo razdaljo med sosednjima servisoma, sestaviteucinkovit algoritem za opisano nalogo in dokazite, da je pravilen.

3. Podanih je n predmetov z vrednostmi v1, v2, . . . , vn. Zelimo poiskati podmnozico m <n predmetov, ki ima najvecjo skupno vrednost. Dokazite, da resitev lahko poiscemo spozresno metodo. Napotek: posnemajte metodo iz razdelka 4.3.

4. Problem 0-1 nahrbtnika je definiran z n predmeti, ki imajo vrednost ci in prostorninovi pri 1 ≤ i ≤ n, ter stevilom V , naloga pa je poiskati n stevil xi ∈ 0, 1, 1 ≤ i ≤ n,tako da je ∑n

i=1xivi ≤ V,∑n

i=1xici

pa doseze najvecjo vrednost. Ta problem bomo obravnavali kasneje. V primeru pa,ko dovolimo, da ima eno stevilo xk, 1 ≤ k ≤ n, poljubno vrednost v intervalu [0, 1]govorimo o poenostavljenem problemu nahrbtnika. Slednji problem je mozno resitis pozresno metodo, tako da za pozresni kriterij izberemo kolicino ci/vi (“specificnovrednost”). Dokazite pravilnost te metode. Uporabite podoben pristop, kot smo gaizbrali pri razvrscanju zapisov na magnetnem traku.

Page 118: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

110 POGLAVJE 4. POZRESNI ALGORITMI

Page 119: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 5

PRETOKI IN LINEARNOPROGRAMIRANJE

5.1 Uvod

V tem poglavju nadaljujemo z metodami za resevanje optimizacijskih problemov.V predhodnem smo prikazali probleme, ki jih je mogoce resevati na najpreprostejsimozen nacin, sedaj pa nadaljujemo s takimi, ki zahtevajo nekoliko bolj premisljen pri-stop. Pravzaprav se bomo ukvarjali s problemi, ki imajo neko posebno matematicnoznacilnost, ki omogoca ucinkovito resevanje. Gre za probleme, ki spadajo v podrocjelinearnega programiranja, oziroma za probleme, ki predstavljajo poenostavljeno oblikoproblemov tega razreda.

5.2 Problem maksimalnega pretoka skozi omrezje

1

2

3

4

5

6

3

2

3

1

1

1

2

2

2

Slika 5.1: Graf s kapacitetamipovezav

Poenostavljena oblika problema linearnega programi-ranja, ki jo bomo predstavili na zacetku, je problemmaksimalnega pretoka skozi omrezje.

5.2.1 Definicija problema

Podan je graf z vozlisci 1, 2, . . . , n, vsaki povezavi 〈i, j〉pa je prirejeno nenegativno stevilo cij , ki mu pravimokapaciteta (gl. sliko 5.1). Ce si povezave predsta-vljamo kot cevi, po katerih se pretaka neka tekocina,je kapaciteta najvecja kolicina tekocine, ki lahko venoti casa pretece po povezavi v stabilnih razmerah.Z drugimi besedami, kapaciteta je najvecji pretok popovezavi. Smer pretoka je v smeri povezave, torej od i do j.

111

Page 120: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

112 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

Sedaj opisemo problem maksimalnega pretoka od nekega vhodnega vozlisca, ki mupravimo izvor , do nekega izhodnega vozlisca, ki mu pravimo ponor (denimo, da stato vozlisci 1 in n, po vrsti). Naj xij predstavlja pretok skozi povezavo 〈i, j〉. Tedajocitno velja,

0 ≤ xij ≤ cij . (5.1)

Poleg tega pogoja velja pri vseh vozliscih, razen izvora in ponora, se zakon o ohra-njanju pretoka. Z drugimi besedami, kar pritece v neko vozlisce i, mora iz njega tudiizteci: ∑

j

xji =∑j

xij . (5.2)

Ce upostevamo se izvor in ponor, dobimo relacijo,

∑j

xji −∑j

xij =

−v, i = 10, i 6= 1, nv, i = n.

(5.3)

Ce je x = (xij) nabor vrednosti, ki zadoscajo pogojema (5.1) in (5.3) in ce je v(x)kolicina na desni strani 5.3, pravimo, da je v celotni pretok med izvorom in ponorom.Ko ne bo nevarnosti za nesporazum, bomo z besedo pretok poimenovali tudi naborx. Ce ima v najvecjo vrednost med vsemi nabori, ki izpolnjujejo zapisane pogoje, jev maksimalen pretok. V tem razdelku bomo spoznali nekaj lastnosti maksimalnegapretoka, ki nam omogocajo, da ga na ucinkovit nacin izracunamo.

Naj bo P neusmerjena pot od izvora do ponora, kar pomeni, da lahko vsebujetako povezave, ki so usmerjene od izvora do ponora, kakor tudi take, ki so nasprotnousmerjene. Na primer, na sliki 5.1 je primer take poti 1–2–4–5–6 in na njej so povezaveprve vrste 1–2, 2–4 in 5–6, povezava 4–5 pa je druge vrste. Na kratko bomo reklipovezavi 〈i, j〉 prve vrste (torej, ko je usmerjena od i proti j), da je pozitivna, povezavidruge vrste pa, da je negativna. Ce so podani pretoki po vseh povezavah x = (xij), kizadoscajo pogojema (5.1) in (5.3) in neka pot P od izvora do ponora, pravimo, da jeP zasicena v primeru, ko bodisi za neko pozitivno povezavo na poti velja, xij = cij ,bodisi za neko negativno povezavo, xij = 0. Na primer na sliki 5.2 predstavlja slika5.2b zasiceno pot, 5.2c pa nezasiceno pot. Lahko bi tudi rekli, da je neka pozitivnapovezava 〈i, j〉 zasicena, ko velja xij = cij , negativna pa, ko velja xij = 0. V temprimeru lahko opisemo zasiceno pot kot tako, na kateri je vsaj ena povezava zasicena.

Na sliki 5.2a je prikazan nek mozen pretok skozi graf. Prvo stevilo ob povezavi〈i, j〉 predstavlja njeno kapaciteto cij , drugo pa pretok xij . Ni se tezko prepricati, dakolicine xij zadoscajo pogojema (5.1) in (5.3) in da je celoten pretok med izvorom inponorom enak 3.

Na sliki 5.2c je prikazana nezasicena pot od izvora do ponora pri pretoku na sliki5.2a. Pretok po prikazani poti lahko povecamo za eno enoto tako, da ga v vsaki pozi-tivni povezavi povecamo za eno enoto in zmanjsamo prav za toliko v vsaki negativnipovezavi. Kot posledico dobimo povecan pretok z vrednostjo 4, ki je prikazan na sl.5.2d. Ni se tezko prepricati, da tudi spremenjeni pretok zadosca pogojema (5.1) in(5.3).

Page 121: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.2. PROBLEM MAKSIMALNEGA PRETOKA SKOZI OMREZJE 113

1

2

3

4

5

6

3,1

2,1

3,2

1,0

1,0

1,1

2,1

2,2

2,2

(a) Zacetni pretok

1

2

3

4

6

3,1 3,2

1,0

1,0

(b) Zasicena pot

1

2 4

5

6

3,1

2,1

1,1

2,1

(c) Nezasicena pot

1

2

3

4

5

6

3,2

2,2

3,2

1,0

1,0

1,0

2,2

2,2

2,2

(d) Povecan pretok

Slika 5.2: Postopek vecanja nekega zacetnega pretoka. Pri povezavah pomeni prvostevilo kapaciteto, drugo pa vrednost pretoka

Sedaj definirajmo pojem prereza med izvorom in ponorom. To je par komple-mentarnih podmnozic vozlisc 〈S, T 〉, pri cemer velja 1 ∈ S ter n ∈ T . Ce hocemopoudariti izvor in ponor, zapisemo, da je 〈S, T 〉 (1, n)-prerez. Kapaciteto prereza〈S, T 〉 definiramo kot

c(S, T ) =∑

i∈S,j∈Tcij , (5.4)

torej je to vsota kapacitet vseh povezav med S in T , ki so usmerjene od S proti T .

Vrednost poljubnega (celotnega) pretoka med izvorom in ponorom ima neko la-stnost, ki je sicer precej ocitna, a jo bomo opisali s posebnim izrekom:

5.1 Izrek (o zgornji meji za vrednost pretoka) G = 〈V,E〉 naj bo graf z utezenimipovezavami, pri cemer utezi predstavljajo kapacitete. Naj bo 1 izvor, n pa ponor. Ceje x = (xij) nabor pretokov po povezavah, ki zadosca pogojema (5.1) in (5.3), v pavrednost celotnega pretoka med izvorom in ponorom, velja

v ≤ c(S, T ), (5.5)

kjer je c(S, T ) kapaciteta poljubnega (1, n)-prereza 〈S, T 〉.

Dokaz. Izrek dokazemo tako, da sestejemo vse enacbe (5.3), ki so prirejene vozliscem

Page 122: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

114 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

i ∈ S. V tem primeru dobimo,

v =∑i∈S(

∑j xij −

∑j xji)

=∑i,j∈S(xij − xji) +

∑i∈S,j∈T (xij − xji)

=∑i∈S,j∈T (xij − xji).

(5.6)

Vrednost desne strani tretje vrstice (5.6) je enaka vrednosti desne strani druge vrsticezato, ker je prvi clen druge vrstice enak 0. Namrec, v tem clenu se vsaka kolicina xij ,pri i, j ∈ S, pojavlja dvakrat, enkrat s pozitivnim predznakom, drugic z negativnim(pozitivni predznak se pojavi pri ciljnem vozliscu povezave 〈i, j〉, negativni pa priizhodiscnem vozliscu). Tretja vrstica torej pravi, da je vrednost v celotnega pretokaenaka razliki vsot vseh pretokov skozi povezave, ki vodijo iz S v T in onih, ki sonasprotno usmerjene1. Ker pa velja xij ≤ cij ter xji ≥ 0, imamo,

v ≤∑

i∈S,j∈Tcij = c(S, T ). (5.7)

Torej celotni pretok od izvora do ponora ne presega kapacitete poljubnega prereza(med izvorom in ponorom). 2

Pravkar zapisani izrek 5.1 ima preprosto, a pomembno posledico:

5.2 Posledica Naj bodo definicije iste kot v zapisu izreka 5.1. V primeru, ko pri(5.5) velja enakost, je pretok v maksimalen.

Na primer v primeru povecanega pretoka na sl. 5.2d dejansko obstaja (1,6)-prerez skapaciteto, ki je enaka vrednosti pretoka. Primer takega prereza je 〈1, 2, 3, 4, 5, 6〉.Posledica 5.2 tedaj zagotavlja, da je pretok na sliki 5.2d maksimalen.

Sedaj bomo zapisali in dokazali tri osnovne izreke o pretokih, ki jih bomo kasnejeuporabili pri sestavljanju algoritma za izracun maksimalnega pretoka.

5.3 Izrek (o zasicenih poteh) Nek pretok je maksimalen natanko tedaj, ko so vsepoti od izvora do ponora zasicene.

Dokaz. V primeru, ko obstaja nezasicena pot od izvora do ponora, pretok ocitno nimaksimalen, ker lahko pretok po njej povecamo tako, kot smo to storili v primeruna sliki 5.2a. Po drugi strani pa naj bo x nek pretok, ki ima vse poti zasicene. Najbo S mnozica vozlisc, ki vsebuje izvor ter vozlisca, do katerih pelje nezasicena pot izizvora, T pa naj bo komplementarna mnozica. Na podlagi definicije nezasicene potisklepamo, da pri vseh i ∈ S in j ∈ T velja xij = cij ter xji = 0 (ker bi v nasprotnemprimeru tudi j pripadalo mnozici S). Iz tega izpeljemo vrednost pretoka

v =∑

i∈S,j∈Tcij ,

1Naceloma je mozno, da sta med i in j dve, nasprotno usmerjeni povezavi, sicer pa je tistavrednost xij oziroma xji, ki ustreza neobstojeci povezavi, enaka 0.

Page 123: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.2. PROBLEM MAKSIMALNEGA PRETOKA SKOZI OMREZJE 115

kar predstavlja kapaciteto prereza 〈S, T 〉. Na podlagi posledice 5.2 sklepamo, da jepretok maksimalen. 2

Pomen izreka je, da nam ponuja kriterij za presojo, kdaj smo dosegli maksimalenpretok.

5.4 Izrek (o celostevilcnosti maksimalnega pretoka) V primeru, ko so vse ka-pacitete cela stevila, obstaja tudi celostevilcen maksimalen pretok.

Dokaz. Naj bodo vse kapacite celostevilcne in naj bo zacetni pretok x0. V primeru,ko v(x0) ni maksimalen, obstaja nezasicena pot, kar ima za posledico eksistencocelostevilcnega pretoka x1, tako da velja v(x1) > v(x0). Ce v(x1) se vedno ni maksi-malen, imamo zopet nezasiceno pot itn. Glede na to, da je vrednost vsakega pretokanajmanj za ena vecja od vrednosti predhodnega, na koncu pridemo do celostevilcnegapretoka, ki ima vse poti zasicene in je torej maksimalen. 2

Pomen pravkar zapisanega izreka je v tem, da zagotavlja, da lahko pridemo doresitve v koncnem stevilu korakov, pri cemer je en korak sestavljen iz iskanja ne-zasicene poti ter njenega zasicenja.

5.5 Izrek (o max pretoku pri min prerezu) Vrednost maksimalnega pretoka jeenaka minimalni kapaciteti nekega (1, n)-prereza.

Dokaz. V primeru, ko je pretok enak minimalni kapaciteti nekega prereza, je gotovomaksimalen na podlagi posledice 5.2. Ko pa imamo opravka z maksimalnim preto-kom, lahko tako kot v dokazu izreka 5.3 poiscemo prerez s kapaciteto, ki je enakapretoku. Ta prerez pa ima ocitno minimalno kapaciteto, ker je pretok manjsi ali enakod kapacitet vseh prerezov. 2

Zapisani izrek ni toliko pomemben za prakticno racunanje kot za teoreticno razlagoproblema, ker ga uvrsca v druzino problemov, pri katerih poznamo podobne, tim.izreke vrste min-max. V nasem primeru ga preprosto predstavljamo kot zanimivost.

5.2.2 Algoritem za maksimalni pretok

Ceprav je mozno algoritem za maksimalni pretok realizirati tako, da na vsakem korakupoisce najvecji mozen prirastek pritoka, se bomo v tem delu zadovoljili z algoritmom,ki nima te lastnosti.

Algoritem je prikazan na sliki 5.3. V postopku vozlisca opremimo z oznakami,ki imajo (pri vozliscu j) obliko (i+, δj) ali (i−, δj). (i+, δj) pomeni, da obstaja ne-zasicena pot od izvora do vozlisca j, po kateri lahko pretok povecamo za prirastek δjin je (pozitivna) povezava 〈i, j〉 zadnja na tej poti. (i−, δj) pa pomeni, da je zadnjapovezava na poti od izvora do vozlisca j povezava 〈j, i〉 (in je torej negativna). Nazacetku je le izvor (vozlisce 1) oznacen s posebno oznako (−,∞), ki se med celotnimpostopkom ne spreminja, nato oznacujemo ostala vozlisca na en izmed dveh nacinov:

Page 124: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

116 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

Vhod:Seznam kapacitet cij povezav grafa G = 〈V,E〉, pri cemer je V = 1, 2, . . . , n.Privzetek je, da je vozlisce 1 izvor, vozlisce n pa ponor ter da so vse kapacitetecelostevilcne.

Izhod:Maksimalna vrednost celotnega pretoka od izvora do ponora ter vrednosti pretokovxij po posameznih povezavah, pri 1 ≤ i, j ≤ n, i 6= j

Postopek:

1. (Zacetek) Zacnemo z nekim moznim celostevilcnim pretokom x, v skrajnemprimeru takim, pri katerem so pretoki skozi vse povezave enaki nic. Viru(vozliscu 1) priredimo stalno oznako (−,∞), ostala vozlisca nimajo oznak.

2. (Oznacevanje in obiskovanje)

(a) Poiscemo neko oznaceno, a neobiskano vozlisce i; ce takega vozlisca ni,nadaljujemo s korakom 4;

(b) Pri vsaki povezavi 〈i, j〉, za katero velja xij < cij in je j neoznaceno,priredimo vozliscu j oznako (i+, δj), tako da je

δj = minδi, cij − xij.Pri vsaki povezavi 〈j, i〉, pri kateri velja xij > 0 in je j neoznaceno,priredimo vozliscu j oznako (i−, δj), tako da je

δj = minδi, xji.(c) V primeru, ko je ponor (vozlisce n) oznacen, nadaljujemo s korakom 3,

sicer ponovimo korak 2 ;

3. (Vecanje pretoka) Nezasiceno pot odkrijemo tako, da zacnemo pri ponoru inuporabljamo prve komponente oznak. Na primer, prva komponenta oznakepri ponoru nam odkrije predzadnje vozlisce na poti, prva komponenta oznakele-tega nam odkrije predpredzadnje vozlisce itn. Pretok povecamo tako, dapovecamo ali zmanjsamo pretok skozi povezave na nezasiceni poti, odvisno odznaka prve komponente oznake. Nadaljevanje pri koraku 2.

4. (Dolocanje prereza z minimalno kapaciteto) V tem primeru je trenutni pretokmaksimalen. Prerez z minimalno kapaciteto 〈S, T 〉 dobimo tako, da postavimovsa oznacena vozlisca v S, neoznacena pa v T . S tem smo izracun zakljucili.

Slika 5.3: Algoritem za maksimalni pretok

Page 125: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.3. LINEARNO PROGRAMIRANJE 117

Ce je vozlisce i oznaceno in obstaja povezava 〈i, j〉, kjer velja xij < cij , lahkonezaznamovano vozlisce j opremimo z oznako (i+, δj), pri cemer je

δj = minδi, cij − xij.

Ce je vozlisce i oznaceno in obstaja povezava 〈j, i〉, kjer velja xji > 0, lahkonezaznamovano vozlisce j opremimo z oznako (i−, δj), pri cemer je

δj = minδi, xji.

V primeru, ko procedura zaznamuje ponor n, smo odkrili nezasiceno pot in jemozno vrednost pretoka povecati za δn. Ce se procedura ustavi, ne da bi oznacilaponor, so vse poti zasicene. V tem primeru je mozno dobiti prerez z minimalnokapaciteto 〈S, T 〉 tako, da v S postavimo vsa vozlisca, ki so oznacena, v T pa ostalavozlisca.

Zaznamovano vozlisce je bodisi “obiskano” ali “neobiskano”. Vozlisce obiscemotako, da preiscemo vse povezave, ki izhajajo iz vozlisca ali prihajajo vanj in opremimovozlisca, ki se dotikajo teh povezav, z oznakami v primeru, ko je to mogoce in ko oznakse nimajo.

Pri algoritmu moramo najprej dokazati njegovo pravilnost, ki je podana s pogo-jem, da kadar se algoritem ustavi po koraku 4, je vrednost pretoka v maksimalna.Dejansko: ko pridemo do koraka 4 po koraku 2a, ponor ni oznacen in predstavljamnozica oznacenih vozlisc (ter ustrezna komplementarna mnozica) prerez, iz kateregavodijo same zasicene povezave (kajti ce neka povezava ne bi bila zasicena, bi se posto-pek oznacevanja nadaljeval). Torej je v tem primeru celotni pretok enak kapacitetitega prereza in nam posledica 5.2 zagotavlja, da je pretok maksimalen.

Potrebno stevilo operacij algoritma lahko ocenimo takole: naj bo m stevilo po-vezav. Vsega skupaj moramo pri vsakem iskanju nezasicene poti 2m-krat pregledatipovezave ter nato morebiti se opraviti oznacevanje2 . V primeru, ko so vse kapaci-tete celostevilcne, moramo ponoviti iskanje nezasicene poti najvec v-krat, kjer je vvrednost maksimalnega pretoka. Torej je stevilo operacij O(mv).

5.3 Linearno programiranje

5.3.1 Uvod

Pri problemu maksimalnega pretoka skozi graf smo omenili, da je le poseben primersirsega razreda problemov, ki jim pravimo problemi linearnega programiranja. Slednjirazred problemov je izredno pomemben iz dveh razlogov: prvic, mnogi prakticniproblemi se dajo prevesti na obliko linearnega programiranja in drugic, za ta razredproblemov poznamo ucinkovit algoritem. V tem delu se bomo seznanili z nekaterimiosnovnimi pojmi ter v osnovnih obrisih spoznali simpleksni algoritem. Izhajamo iz n-dimenzionalnega vektorskega prostora nad obsegom K, za katerega pa ne privzemamo

2V najslabsem primeru je potrebno vsako povezavo obravnavati dvakrat: enkrat ob obisku njenegaizvora, drugic pa ob obisku njenega ponora.

Page 126: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

118 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

kakih posebnih lastnosti (kot smo to storili, na primer, v razdelku 3.3 o diskretniFourierjevi transformaciji). Prostor bomo oznacevali z Vn. Torej so njegovi elementin-terke x elementov K.

Problem linearnega programiranja opisemo z m × n matriko A, s stolpcnim vek-torjem b dolzine m ter vrsticnim vektorjem c dolzine n, naloga pa je poiskati x ∈ Vn,z lastnostma A ·x ≤ b in c ·x je maksimalno. A ·x predstavlja produkt matrike A instolpcnega vektorja x, c · x pa skalarni produkt c in x(3). Funkciji f = c · x pravimotudi ciljna funkcija problema.

Linearno programiranje obravnava zelo obsezna literatura. Naj omenimo le dvedeli: Vidav [15, 2. poglavje, str. 135] in Kemeny [7, 7. poglavje, str. 314]. Pricujocisestavek se ne drzi strogo nobenega od citiranih del, predvsem pa se ne dotikamostevilnih vprasanj, ki so pomembna za prakticno uporabo linearnega programira-nja. Na primer, ne omenjamo zveze med osnovnim in dualnim problemom in se nespuscamo v primer, ko problem degenerira.

5.6 Primer Primerov problemov linearnega programiranja je brez stevila, tipicen paje naslednji: imamo n izdelkov, vsak izmed katerih zahteva na enoto izdelka dolocenokolicino vsake od m surovin, prinasa pa tudi na enoto izdelka dolocen dobicek. Vsakasurovina je na razpolago v omejeni kolicini, postavlja pa se vprasanje, koliko kosovvsakega izdelka izdelati, da bo dobicek najvecji. Na primer, neki izdelovalec kartonskihskatel izdeluje dve vrsti skatel, majhne in velike. Vsaka majhna skatla porabi 0.5m2

kartona in prinasa 1 SIT dobicka, vsaka velika skatla pa porabi 0.75m2 kartona inprinasa 2 SIT dobicka. Ce je na razpolago 100m2 kartona, koliko skatel vsake vrstenaj izdela, da bo dobicek cim vecji? Uporabljamo tudi privzeti pogoj, da je kolicinaobeh vrst skatel nenegativna. Kolicino majhnih in velikih skatel oznacujemo z x1 inx2, po vrsti. Torej lahko zapisemo:

−x1 ≤ 0−x2 ≤ 0

0.5x1 +0.75x2 ≤ 100,(5.8)

pri cemer mora bitix1 + 2x2 (5.9)

maksimalno. V matricnem zapisu lahko zapisemo problem takole:[−1 0

0 −10.5 0.75

]· x ≤

[00

100

],[

1 2]· x maksimalno. (5.10)

V nadaljnjem besedilu bomo obravnavali naslednja vprasanja: prvic, kaksna jemnozica tock x prostora Vn, ki izpolnjujejo pogoj Ax ≤ b, drugic, kako opisemo tiste

3Obstaja tudi soroden problem, ki zahteva, da poiscemo v ∈ V ∗n tako, da velja vA ≥ c in je b · vminimalno, pri cemer je V ∗n dualen vektorski prostor, v in c sta vrsticna vektorja, b pa je stolpcnivektor. Vendar se v tem sestavku ne bomo spuscali do takih podrobnosti, ker presegajo zastavljeniokvir.

Page 127: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.3. LINEARNO PROGRAMIRANJE 119

tocke mnozice, kjer funkcija c ·x doseze maksimum in tretjic, kako te tocke ucinkovitopoiscemo.

5.3.2 Konveksne poliedrske mnozice

Naj bo a vrsticni vektor dolzine n, b pa naj pripada K (torej je konstanta). Tedajpravimo mnozici tock x prostora Vn, ki izpolnjujejo pogoj a · x = b, hiperravninaprostora Vn. Pri n = 2 je hiperravnina premica, pri n = 3 je ravnina, itn. Mnozicitock x prostora Vn, ki izpolnjujejo pogoj a ·x ≤ b, pravimo zaprt polprostor Vn (odprtpolprostor je dolocen s pogojem a · x < b), hiperravnini a · x = b pa pravimo mejnahiperravnina zaprtega polprostora a · x ≤ b.

5.7 Primer Oglejmo si (5.8) iz primera 5.6. Prva relacija ustreza zaprtemu pol-prostoru, ki vsebuje ordinatno os in vse, kar je desno od nje, druga relacija ustrezazaprtemu polprostoru, ki vsebuje abscisno os in vse, kar je nad njo, tretja pa ustrezazaprtemu polprostoru, ki vsebuje premico 0.5x1 + 0.75x2 = 100 in vse, kar je pod njo.

Na podlagi dosedanjih definicij lahko takoj zapisemo:

5.8 Trditev Mnozica tock x prostora Vn, ki izpolnjujejo pogoj Ax ≤ b, kjer je Aneka m × n matrika, b pa je stolpcni vektor dolzine m, je presek najvec m zaprtihpolprostorov.

V treh dimenzijah pravimo telesu, ki je omejeno z ravninami, polieder in zatomnozici tock iz trditve 5.8 pravimo poliederska mnozica tudi, kadar je n 6= 3.

Mnozica tock x prostora Vn, ki izpolnjujejo pogoj Ax ≤ b ima naslednjo po-membno lastnost:

5.9 Trditev Naj velja Ax1 ≤ b in Ax2 ≤ b. Tedaj velja tudi,

A((1− λ)x1 + λx2) ≤ b,

pri vseh vrednostih 0 ≤ λ ≤ 1.

Za dokaz gl. vajo 7. Sedaj se spomnimo, da je premica, ki vsebuje x1 in x2,mnozica tock, ki so odvisne od parametra λ in jih opisuje enacba,

x = x1 + λ(x2 − x1), pri−∞ < λ < +∞. (5.11)

Torej lezijo tocke (1 − λ)x1 + λx2, pri 0 ≤ λ ≤ 1, na daljici med x1 in x2 in trditev5.9 pravi, ce dve tocki izpolnjujeta pogoj Ax ≤ b, ga izpolnjujejo tudi vse tockena daljici med njima. Za mnozico, kjer velja ta lastnost, pravimo, da je konveksna.Sedaj je tudi ocitno, zakaj mnozicam tock x, ki izpolnjujejo neki pogoj Ax ≤ b,pravimo konveksne poliederske mnozice, oziroma s kratico KPM. (Vprasanje: v ravninipredstavite poliedersko mnozico, ki NI konveksna.)

Page 128: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

120 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

x1

x2

100 200

100

200

tocke,ki izpolnjujejo pogoj

−x1 ≤ 0−x2 ≤ 0

0.5x1 +0.75x2 ≤ 100

Slika 5.4: Konveksna poliedrska mnozica

5.10 Primer V primerih 5.6 in 5.7 je KPM, ki izpolnjuje pogoj Ax ≤ b, notranjosttrikotnika, ki je omejen z abscisno in ordinatno osema in premico 0.5x1+0.75x2 = 100(gl. sliko 5.4). V zvezi s tem primerom je morda koristno poudariti, da je vcasih KPM,ki izpolnjuje pogoj Ax ≤ b, prazna. Na primer v primeru, ki ga obravnavamo, ce bidodali se pogoj +x1 + x2 ≤ −1, bi bila ustrezna KPM prazna.

Na tem mestu je koristno vpeljati se neko dodatno znacilnost konveksnih polie-drskih mnozic. Razlikovali bomo med omejeno KPM in neomejeno KPM. Seveda jeneomejena KPM taka, ki je “neskoncna”, vendar, kako to povedati na primeren nacin?Najlaze to povemo tako, da istovetimo neomejene KPM s takimi KPM, ki vsebujejonek poltrak. Na primer v primeru 5.7, ce odpravimo omejitev 0.5x1 + 0.75x2 = 100,dobimo KPM, ki vsebuje (na primer) poltrak, ki se zacenja pri izhodiscu in ima po-zitivni kot 45.

Pravkar smo videli, kako je videti neka konveksna poliedrska mnozica v dveh di-menzijah. V treh dimenzijah je to “izbocen” polieder. V prostorih, ki imajo dimenzijovec kot tri, pa si takih mnozic vec ne znamo predstavljati, ceprav seveda matematicnoeksistirajo. Pri n = 2 smo ugotovili, da so mejne hiperravnine pravzaprav premicein v tem primeru pravimo tockam, ki pripadajo po dvema mejnima hiperravninamahkrati, obenem pa pripadajo tudi KPM, ekstremne tocke. Drugi pogoj (pripadnostKPM) je pomemben, ker ni nujno, da se dve mejni hiperravnini vedno sekata v tocki,ki pripada KPM. Na primer, v primeru 5.7 so ekstremne tocke (0, 0), (0, 132.3) in(200, 0). V splosnem primeru je ekstremna tocka neke KPM tista tocka x, ki izpol-njuje pogoja, prvic Bx = bB , kjer je B neka n × n podmatrika matrike A, bB paje ustrezni podvektor vektorja b in, drugic, Ax ≤ b. V primeru 5.7 ekstremne tocke(0, 0), (0, 132.3) in (200, 0) ustrezajo naslednjim podmatrikam B in podvektorjem bB(po vrsti): [ −1 0

0 −1

]x =

[00

];

[ −1 00.5 0.75

]x =

[0

100

];[

0 −10.5 0.75

]x =

[0

100

] (5.12)

V primeru neomejene KPM dodamo h seznamu ekstremnih tock se “neskoncno tocko”zato, da lahko dolocene trditve izrazimo bolj jedrnato.

Ce vzamemo neko poljubno n × n podmatriko B matrike A, seveda ni nujno, daima sistem Bx = bB resitev. Pogoj za obstoj resitve je, da je matrika B nesingularna,

Page 129: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.3. LINEARNO PROGRAMIRANJE 121

oziroma, da je njena determinanta, |B|, razlicna od nic. Lahko bi rekli, da je v primeru|B| = 0 resitev Bx = bB tocka v neskoncnosti. Zaradi enostavnosti se bomo v bodoceomejili na primere, ko tak primer ne nastopi, torej odslej privzemamo, da je poljubnan× n podmatrika matrike A nesingularna. Naslednji privzetek se nanasa na velikostmatrike A. Odslej k matriki A vedno dodamo se pogoje −xi ≤ 0, s cimer se omejimona pozitivni “kvadrant” prostora Vn (in obenem dosezemo, da je m ≥ n). Ceprav sene bomo spuscali v podrobnosti, naj pripomnimo, da nas slednji pogoj pravzapravne omejuje prevec, saj lahko ponavadi s preprostimi transformacijami spremenimoproblem, kjer −xi ≤ 0 ne velja, v takega, kjer so ti pogoji izpolnjeni.

5.3.3 Maksimum linearne funkcije na konveksni poliedrskimnozici

Preden zacnemo obravnavati vprasanje iz naslova razdelka, zapisimo neko ocitno la-stnost konveksnih poliederskih mnozic:

5.11 Trditev Naj bo K KPM prostora Vn z matriko A in vektorjem omejitev b innaj bo

a = 〈a1, a2, . . . , an〉neka vrstica A, b pa ustrezna komponenta b. Tedaj je mnozica tock, ki izpolnjujejopogoj a · x = b (namesto a · x ≤ b), neka KPM K′ prostora Vn−1, ekstremne tocke K′pa ustrezajo dolocenim ekstremnim tockam K.

Dokaz. Na podlagi relacije a · x = b izrazimo xn z xi pri 1 ≤ i ≤ n − 1. Na tanacin spremenimo relacijo Ax ≤ b v A′x′ ≤ b′, kjer A′ nima vrstice a · x = b, ostalielementi postanejo a′ij =

aij−ajan

, omejitve pa b′i = bi − bian

. Tako smo ze dokazali, datocke, ki zadoscajo pogoju a · x = b, tvorijo KPM K′ prostora Vn−1. Preslikavo medekstremnimi tockamiK′ in ekstremnimi tockamiK nato dobimo na podlagi ugotovitve,da so ektremne tocke K′ dolocene z naborom n− 1 vrstic matrike A′, vsak tak naborpa ustreza enemu samemu naboru n vrstic matrike A (ki doloca neko ekstremno tockeK) tako, da na matriki A′ uporabimo nasprotno transformacijo od tiste, s katero smoA spremenili v A′, in dodamo vrstico a. 2

Naj bo podana neka KPM prostora Vn. Iscemo tocko ali tocke, kjer funkcijac · x doseze maksimum. Pravzaprav nas bo zanimala funkcija c · x + δ, kjer je δneka poljubna konstanta, vendar clen δ ne igra bistvene vloge. Resitev zastavljenegaproblema daje naslednji izrek:

5.12 Izrek (o maksimumu ciljne funkcije na KPM) Naj bo dana neka nepra-zna KPM K, ki je dolocena z m × n matriko A in vektorjem omejitev b ter nekapoljubna linearna funkcija c · x + δ. c · x + δ doseze svoj maksimum v neki ekstremnitocki K.

Dokaz. Dokaz bomo izpeljali z indukcijo po n. Pri n = 1 se vse neenacbe prevedejona obliko ai1x1 ≤ bi. Vsaka neenacba ustreza nekemu poltraku, njihov presek, ce

Page 130: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

122 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

je neprazen, pa je bodisi koncen zaprt interval stevilcne preme x1 (torej mnozicavrednosti b1 ≤ x1 ≤ b2) ali nek poltrak (a1x1 ≤ b1). Primer vidimo na sliki 5.5. V temprimeru ima linearna funkcija obliko c1x1+δ in na stevilcni premi je bodisi konstantna,monotono narasca ali pa pada. Torej svoj maksimum doseze v eni ekstremni tocki (kije lahko tudi neskoncna).

−x ≤ −3

x ≤ 7

−x ≤ −3 ∧ x ≤ 7

Slika 5.5: Presek dveh konve-ksnih poliedrskih mnozic di-menzije ena

Pri n > 1 bomo dokazali, da eksistira neka ekstre-mna tocka x ∈ K, za katero pri vseh tockah y ∈ Kvelja c·x+δ ≥ c·y+δ. Privzeli bomo, da obstaja nekatocka x1 ∈ K z lastnostjo Ax1 < b (vse komponenteAx1 so strogo manjse od ustreznih komponent b). Cetake tocke ni, velja vsaj za eno omejitev a·x1 = b (a jeneka vrstica A) in lahko eno komponento x1 izrazimoz drugimi ter primer prevedemo na nizjo dimenzijo,za katero smo izrek ze dokazali. Torej velja Ax1 < b.

Sedaj izberemo poljubno premico, ki vsebuje tockox1. Presek premice in K je KPM K′ dimenzije 1 (gl.nalogo 9). Na K′ doseze c·x+δ svoj maksimum na eniod svojih dveh ekstremnih tock, npr. x2 (na podlagiinduktivne predpostavke). Ker pa x2 pripada vsajeni mejni hiperravnini KPM K, velja v tocki x2 tudiax2 = b vsaj za eno vrstico a matrike A. Iz trditve

5.11 sledi, da x2 pripada KPM K′′, ki ima manjso dimenzijo od K, ekstremne tocke K′′pa ustrezajo dolocenim ekstremnim tockam K. Sedaj ponovno uporabimo induktivnopredpostavko in lahko sklepamo, da eksistira neka ekstremna tocka x3 ∈ K, tako davelja

c · x3 + δ ≥ c · x2 + δ ≥ c · x1 + δ.

Torej smo v vseh primerih dokazali, da tocki x1 ustreza neka ekstremna tocka x3 zlastnostjo c · x3 + δ ≥ c · x1 + δ. 2

Na koncu se ugotovimo, da ima KPM K koncno mnogo ekstremnih tock, in sicer

najvec(mn

).

Izrek 5.12 nam ze ponuja algoritem za probleme linearnega programiranja (z ome-jitvami, ki smo jih opisali na koncu razdelka 5.3.2): ce je podana KPM z m × nmatriko A, vektorjem omejitev b ter ciljno funkcijo c · x, preprosto poiscemo vre-dnost ciljne funkcije v vseh ekstremnih tockah in izberemo tisto, v kateri je vrednostnajvecja. Vendar je ta algoritem razmeroma neucinkovit, saj je obseg racunanja za is-kanje ekstremnih tock nesprejemljivo velik. V naslednjem razdelku se bomo ukvarjalis vprasanjem, kako lahko izracun znatno pohitrimo.

Page 131: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.3. LINEARNO PROGRAMIRANJE 123

5.3.4 Lokalni pogoj za globalni maksimum linearne funkcije nakonveksni poliedrski mnozici

Naj bo K KPM prostora Vn z matriko A in vektorjem omejitev b in naj bo xB nekaekstremna tocka mnozice K. Kot ze vemo, je xB resitev sistema linearnih enacbB · x = bB , kjer je B neka n × n podmatrika matrike A, bB pa vektor omejitev, kipripadajo vrsticam B. Ekstremna tocka xC je soseda tocke xB v primeru, ko je tockaxC resitev sistema C · x = bC , kjer novi sistem enacb dobimo iz B · x = bB tako, dazamenjamo eno samo enacbo ax = b (z neko drugo enacbo med enacbami Ax = b).Denimo na primer, da zamenjamo enacbo a = b z a′ = b′. Najprej si zastavimovprasanje, kaksna je predstavitev premice, ki povezuje xB in xC? Dobimo jo napreprost nacin iz splosne enacbe premice (5.11). Ce xB in xC zadoscata pogojemaBx = bB in Cx = bC po vrsti, zadoscajo tocke na premici, ki povezuje ti dve tocki,pogoj

[(1− λ)B + λC] x = (1− λ)bB + λbC .

Ker se B in C razlikujeta le v eni vrstici, bB in bC pa v ustrezni komponenti, se tudipri (1 − λ)B + λC = (1 − λ)bB + λbC pojavlja parameter λ le v tisti vrstici. Cevrstici a pripadajo komponente ai, 1 ≤ i ≤ n (in podobno za a′), so torej elementi(1−λ)B+λC v vrstici, ki je odvisna od λ, (1−λ)ai +λa′i, 1 ≤ i ≤ n. Podobno veljaza vektor omejitev (1− λ)bB + λbC . Nato dokazemo:

5.13 Trditev Vsaka ekstremna tocka KPM K prostora Vn z matriko A in vektor-jem omejitev b ima najvec n sosedov. V kolikor je stevilo sosedov n − k, ustreza kmanjkajocih sosedov neskoncni ekstremni tocki.

Dokaz. Naj bo ekstremna tocka xB in naj velja BxB = bB . Ne da bi se omejili, lahkoprivzamemo, da je matrika A enaka

A =

[BB′

],

vektor omejitev b pa

b =

[bBb′

].

Sedaj vpeljemo nove koordinate y na podlagi relacije x − xB = B−1y in se natorelacija,

Ax ≤ b,

spremeni v, [BB′

](B−1y + xB) ≤

[bBb′

],

oziroma, [I

B′B−1

]y ≤

[0

b′ −B′xB

].

Page 132: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

124 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

Z drugimi besedami, B smo transformirali v enotsko matriko, ekstremno tocko xB vizhodisce koordinatnega sistema, K pa premaknili v “negativni kvadrant” Vk. Sedajprehod od trenutne ekstremne tocke (ki ji pripada enotska n×n matrika) do sosednjeopravimo tako, da neko enacbo yi = 0 zamenjamo z enacbo, katere leva stran je enaizmed vrstic B′B−1y, desna pa ustrezna komponenta b′ −B′xB . Vendar, ker so vseenacbe yj = 0, j 6= i, ostale v veljavi, se spremenjena vrstica pretvori v aiyi = biin tako postane nova ekstremna tocka, yi = bi

ai, yj = 0, j 6= i; torej se je daljica

med dvema ekstremnima tockama spremenila v eno izmed koordinatnih osi. Ker jekoordinatnih osi n, je seveda stevilo ekstremnih tock ≤ n. Seveda lahko z razlicnimizamenjavami dobimo razlicne enacbe yi = bi

ai, vendar ekstremno tocko dobimo le v

primeru, ko tocka pripada K, to pa velja le za vrednost biai

, ki lezi najblizje izhodiscunovega koordinatnega sistema.

Lahko se tudi zgodi, da je ai = 0. V tem primeru pripada mnozici K celotnakoordinatna os spremenljivke yi, in imamo opravka z neskoncno sosedno ekstremnotocko. 2

Potem, ko smo uporabili opisano koordinatno transformacijo, je determinantapodmatrike, ki doloca ekstremno tocko, produkt diagonalnih elementov podmatrike(v primeru tocke xB smo transformiraliii B v I in je torej determinanta kar 1). Ko naopisan nacin iz I dobimo C, je v primeru ai = 0 determinanta C enaka 0, z drugimibesedami C je singularna. Torej ustrezajo neskoncnim sosednim ekstremnim tockamsingularne n× n podmatrike matrike A in ker smo privzeli, da takih ni, smo se tudiobvarovali pred neskoncnimi ekstremnimi tockami.

Sedaj pa osnovni rezultat tega razdelka:

5.14 Izrek (o lokalnem pogoju za globalni maksimum) Naj bodo dani: nekaKPM K prostora Vn z matriko A in vektorjem omejitev b, neka linearna funkcijaf = c · x + δ ter neka n × n podmatrika B matrike A in ustrezna ekstremna tockaxB, ki predstavlja resitev sistema linearnih enacb B ·x = bB. Ce je vrednost f v vsehsosednih ekstremnih tockah manjsa ali enaka vrednosti f v tocki xB, potem f v xBdoseze svoj globalni maksimum na mnozici K.

Dokaz. Izrek dokazemo tako, da ponovno uporabimo koordinatno transformacijo, kismo jo uporabili v dokazu trditve 5.13. Po uporabi transformacije x−xB = B−1y seciljna funkcija transformira v c(B−1 ·y+xB)+δ. V trditvi 5.13 smo ugotovili, da imatransformacija, ki jo uporabljamo, lastnosti (a) vse dovoljene vrednosti spremenljivkyi, 1 ≤ i ≤ n, so nepozitivne in (b) do sosednih ekstremnih tock pridemo tako, daopravimo premik po neki koordinatni osi. Ce sedaj velja pogoj iz izreka, da v nobenisosednji ekstremni tocki vrednost ciljne funkcije ni vecja od vrednosti c ·xB +δ, sledi,da so vse komponente nove predstavitve koeficientov ciljne funkcije, c · B−1 nenega-tivne. V takem primeru pa tudi nobena linearna kombinacija dovoljenih vrednostispremenljivk (in vsaka tocka K ima tako lastnost) ne more dati vecje vrednosti ciljnefunkcije od c · xB + δ. 2

Page 133: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.3. LINEARNO PROGRAMIRANJE 125

x1 x2 b

+4 +1 +5 y1+1 +5 +20 y2+2 +3 +8 y3

+1 +1 0 −f

Slika 5.6: Zacetna simpleksna tabela.

Izrek 5.14 nas napeljuje na naslednji algoritem za resitev problemov linearnegaprogramiranja: postavimo se v neko ekstremno tocko in ponavljamo zanko, v kateri sevsakic premaknemo do neke sosedne ekstremne tocke, kjer je vrednost ciljne funkcijevecja; ce take ekstremne tocke ni, se ustavimo in smo na podlagi izreka 5.14 nasliglobalni maksimum ciljne funkcije.

5.3.5 Simpleksni algoritem

V tem razdelku bomo nekoliko bolj podrobno opisali algoritem, ki smo ga nakazali nakoncu prejsnjega razdelka. Pri opisu algoritma bomo uporabljali naslednji primer:

+4x1 +1x2 ≤ 5+1x1 +5x2 ≤ 20+2x1 +3x2 ≤ 8,

(5.13)

pri cemer mora bitix1 + x2 (5.14)

maksimalno. Pogojem (5.13) moramo seveda se pripisati pogoj nenegativnosti vsehspremenljivk. Uporabili bomo metodo, ki nekoliko spominja na dokaz izreka 5.14:uporabili bomo nek koordinatni sistem, kjer prehod do sosedne ekstremne tockedosezemo s spremembo dveh koordinat (in ne ene kot v dokazu izreka 5.14), ven-dar ker bo ciljna funkcija odvisna le od ene izmed teh koordinat, bo zato takoj moznoodkriti smer njenega spreminjanja. Natancen opis postopka pa je naslednji: dodalibomo m spremenljivk yi, pri 1 ≤ i ≤ m, in vsak pogoj ai · x ≤ bi spremenili vai · x + yi = bi, pri cemer je bi komponenta b, ki ustreza vrstici ai matrike A. Nata nacin smo A podaljsali v desno z m ×m enotsko matriko, vse neenakosti pa smospremenili v enakosti. Poleg pogojev, ki so izrazeni s spremenjeno matriko A, imamose implicitne pogoje yi ≥ 0, 1 ≤ i ≤ m, in xj ≥ 0, 1 ≤ j ≤ n. Vsega skupaj imamotorej n + m spremenljivk in n + 2m pogojev. Za zacetno ekstremno tocko izberemotocko s komponentami yi = bi, pri 1 ≤ i ≤ m, in xj = 0, pri 1 ≤ j ≤ n. Tej ek-stremni tocki ustreza m pogojev Ax + y = b ter n pogojev x = 0. Sedaj opisemoosnovni korak algoritma, s katerim povecamo vrednost ciljne funkcije. V tem korakuzamenjamo enega izmed opisanih pogojev z nekim pogojem yi = 0, 1 ≤ i ≤ m, kini bil vsebovan v opisu trenutne ekstremne tocke. Z nekoliko premisleka ugotovimo,da pogoj yi = 0 lahko nadomesti bodisi pogoj ai · x + yi = bi ali pa enega izmed

Page 134: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

126 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

y1 x2 b

+ 14 + 1

4 + 54 x1

− 14 + 19

4 + 754 y2

− 24 + 10

4 + 224 y3

− 14 + 3

4 − 54 −f

Slika 5.7: Prvi korak.

pogojev xj = 0, 1 ≤ j ≤ n. Prvi primer ni zanimiv zato, ker se pri nespremenjenivrednosti spremenljivk xj , 1 ≤ j ≤ n ciljna funkcija ne poveca. Torej moramo z yi = 0nadomestiti enega izmed pogojev xj = 0, 1 ≤ j ≤ n. Izberemo tak pogoj xj = 0,katerega odpravljanje zagotavlja vecanje ciljne funkcije. Pri rocnem izracunu podatkeponavadi uredimo v tabelo, ki je za primer (5.13) prikazana na sliki 5.6. Stolpci tabelepripadajo vektorju omejitev ter spremenljivkam, ki trenutno imajo vrednost 0 in odkaterih je odvisna ciljna funkcija, vrstice pa spremenljivkam, ki so trenutno nenicelne(od katerih pa ciljna funkcija ni odvisna). Prehod do sosedne ekstremne tocke z visjovrednostjo funkcije f opravimo tako, da najprej izberemo neko spremenljivko x, ki jivrednost povecamo, neki spremenljivki y 6= 0 pa priredimo vrednost 0 tako, da osta-nejo vsi ostali pogoji izpolnjeni. Spremenljivko x izberemo na podlagi komponentc (spodnje vrstice tabele): izberemo tako spremenljivko x, kateri ustreza pozitivnavrednost v vrstici c, kar pomeni, da se pri vecanju te spremenljivke veca tudi vrednostf . V nasem primeru izberemo x1. x1 bomo toliko povecali, da se bo neka vrednost yspustila do 0. Ce se pri vecanju x1 tudi vse vrednosti y vecajo, to pomeni, da sosednaektremna tocka ni koncna (v tabeli se to vidi po tem, da so v ustreznem stolpcu vsevrednosti, razen one, ki pripada zadnji vrstici, negativne). V nasem primeru to nevelja, saj so koeficienti v prvem stolpcu, ki pripada x1, 4, 1, 2. Ko smo izbrali spre-menljivko x1, da jo bomo postavili v mnozico nenicelnih spremenljivk, pogledamo,katera spremenljivka yi se bo pri vecanju x1 prva spustila do 0. To se bo zgodilo zy1, pri vrednosti x1 = 5

4 . Sedaj bomo postavili y1 v zgornjo vrstico, x1 pa v desnistolpec in obenem spremenili A z upostevanjem novih razmer. Kaksne spremembeso potrebne? Vrstici, ki ustreza y1, moramo dati novo obliko, ko se x1 pojavlja skoeficientom 1: to dosezemo preprosto tako, da celo vrstico delimo z elementom napreseku stolpca x1 in vrstice y1 (temu elementu pravimo pivota ali, slovensko, opora).Naslednja sprememba je, da moramo iz vseh vrstic, ki ustrezajo ostalim y spremen-ljivkam, izlociti spremenljivko x1. To storimo tako, da od vsake vrstice odstejemonovo vrednost v vrstici, ki ustreza x1, pomnozeno s starim elementom stolpca x1 (kipripada vrstici, ki jo spreminjamo). Enako storimo z zadnjo vrstico v tabeli, ki vse-buje komponente c. Nova tabela za nas primer je prikazana na sliki 5.7. V naslednjemkoraku je edina pozitivna komponenta c c2 (za prvo komponento ni presenetljivo, daje manjsa od nic, saj ustreza poti, po kateri smo prisli v trenutno ekstremno tocko,

Page 135: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.4. POVZETEK OSNOVNIH POJMOV 127

y1 y3 b

+ 310 − 1

10 + 710 x1

+ 710 − 19

10 + 8310 y2

− 210 + 4

10 + 2210 x2

− 110 − 3

10 − 2910 −f

Slika 5.8: Drugi korak.

in to na podlagi kriterija vecanja ciljne funkcije). Na podlagi poskusov ugotovimo,da se z vecanjem x2 prva spusti do nic spremenljivka y3, kar pomeni, da bo prav taspremenljivka zamenjala x2. Tabela, ki smo jo spremenili na podlagi istih pravil kotprej, je prikazana na sliki 5.8.

Celotni simpleksni algoritem je prikazan na sliki 5.9.

5.4 Povzetek osnovnih pojmov

1. Problem maksimalnega pretoka skozi omrezje

2. Zakon o ohranjanju pretoka

3. Poti med izvorom in ponorom — pozitivne in negativne povezave

4. Zasicene in nezasicene povezave, oziroma poti

5. Izrek o zasicenih poteh

6. Izrek o celostevilcnosti maksimalnega pretoka

7. Izrek o maksimalnem pretoku pri minimalnem prerezu

8. Algoritem za maksimalni pretok

9. Problem linearnega programiranja in primeri

10. Ciljna funkcija

11. Hiperravnina v prostoru Vn

12. Zaprt polprostor v Vn

13. Mejna hiperravnina zaprtega polprostora

14. Konveksnost

15. Konveksna poliedrska mnozica Vn (KPM)

16. Omejena, neomejena KPM

17. Ekstremna tocka KPM

18. Linearna funkcija doseze svoj maksimum na KPM v neki ekstremni tocki

19. Osnovni privzetek, ki ga uporabljamo v nasi obravnavi problema linearnega progra-miranja

Page 136: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

128 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

Vhod:m×n matrika A, vektor omejitev b dolzine m in linearna ciljna funkcija f = c·x+δ.

Izhod:vrednosti spremenljivk xi, pri 1 ≤ i ≤ n, kjer f doseze maksimum (ter velikost tegamaksimuma).

Postopek:

1. Sestavimo zacetno simpleksno tabelo tako, da elemente A vpisemo v vrstice1 . . .m in stolpce 1 . . . n. V vrstico m + 1 zapisemo komponente c, v stolpecn + 1 pa komponente b. V element 〈m + 1, n + 1〉 zapisemo vrednost −δ.Stolpce poimenujemo x1, x2, . . . , xn, b, vrstice pa y1, y2, . . . , ym,−f .

2. Izberemo katerikoli stolpec xJ , ki mu ustreza pozitivna komponenta cJ innadaljujemo. Ce takega stolpca ni, se ustavimo, ker smo globalni maksimumf ze dosegli in lahko vrednosti nenicelnih spremenljivk odcitamo iz stolpcan+ 1, negativno vrednost funkcije f pa iz elementa 〈m+ 1, n+ 1〉.

3. Izberemo tisto vrstico yI , ki ima pozitiven aIJ in mu ustreza najmanjsa vre-

dnost bIaIJ

. Ce so vse vrednosti aIJ negativne, to pomeni, da f nima koncne

maksimalne vrednosti in se ustavimo.

4. Vrstico yI spremenimo tako, da vse elemente, razen aIJ , delimo z aIJ , elementaIJ pa nadomestimo z 1

aIJ.

5. Ostale vrstice yi spremenimo tako, da od vseh elementov aij , razen aiJ ,

odstejemoaIjaiJaIJ

ter aiJ zamenjamo z − aiJaIJ

.

6. Stolpec xJ preimenujemo v yI , vrstico yI pa v xJ in se vrnemo na korak 2.

Slika 5.9: Simpleksni algoritem

20. Sosedne ekstremne tocke in njihovo stevilo

21. Lokalni pogoj za globalni maksimum linearne funkcije na KPM

22. Simpleksni algoritem.

5.5 Naloge

1. Poiscite vse prereze z minimalno kapaciteto v grafu na sl. 5.1.

m mmm

l- >

ZZ~ ?

ZZ~

>

1 2

3

4

55

3

3

2

c35

c24

Slika 5.10: Graf iz naloge 2.

Page 137: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

5.5. NALOGE 129

2. Za graf na sl. 5.10 izrazite vrednost maksimalnega pretoka kot funkcijo c24 in c35.

3. Mnozico S, ki jo sestavljajo vozlisca, do katerih vodi nezasicena pot od izvora (vozlisca1), lahko definiramo rekurzivno:

1 ∈ S,i ∈ S, xij < cij ⇒ j ∈ S,i ∈ S, xji > 0⇒ j ∈ S.

Podajte podobno rekurzivno definicijo mnozice T , ki jo sestavljajo vozlisca, iz katerihvodijo nezasicene poti do ponora (vozlisca n).

4. Katera izmed naslednjih dveh trditev je resnicna?

(a) Ce je x maksimalen pretok, eksistirata i in j, tako da je bodisi xij = 0 ali xji = 0

(b) Obstaja tak maksimalen pretok, pri katerem velja za nek i in j bodisi xij = 0ali xji = 0.

Podajte utemeljitev svojega mnenja.

5. Kriticno povezavo definiramo kot tisto povezavo, katere odstranitev najbolj zmanjsamaksimalni pretok. Presodite, ali je naslednja trditev resnicna: kriticna povezava jepovezava z maksimalno kapaciteto v prerezu minimalne kapacitete. Podajte utemelji-tev svojega mnenja.

6. Dokazite trditev 5.9.

7. V primeru 5.6 smo obravnavali primer problema linearnega programiranja. Spremenitezapis problema (matriko A, vektor omejitev b in ciljno funkcijo c), tako da bo ustrezal

(a) istemu opisu z dodatno omejitvijo “stevilo majhnih skatel ni manjse od stevilavelikih skatel”. Narisite geometrijsko predstavo spremenjenega problema.

(b) Poleg predhodne omejitve naj velja se “stevilo majhnih skatel ne presega 20”.Tudi za ta primer opisite A, b in c ter narisite geometrijsko predstavo.

8. Konveksno poliedrsko mnozico (KPM) smo opisali kot mnozico elementov x, ki zadoscajopogoju Ax = b. Opisite isto mnozico potem, ko smo v prostoru Vn uporabili nekokoordinatno transformacijo.

9. Naj bosta K1 in K2 konveksni poliedrski mnozici prostora Vn. Dokazite, da je njunpresek KPM dimenzije, ki je enaka ali manjsa od dimenzij K1 in K2. Napotek: di-menzijo Ki definiramo kot minimalno stevilo r, tako da lahko z neko koordinatnotransformacijo predstavimo Ki v obliki A · x ≤ b, pri cemer je A m × n matrika z rnenicelnimi stolpci.

10. Problem linearnega programiranja smo opisali z m×n matriko A, (stolpcnim) vektor-jem b ter (vrsticnim) vektorjem c, potrebno pa je poiskati (stolpcni) vektor x tako,da velja Ax ≤ b in c · x je maksimalno. Dolocite kolicine A, b in c pri problemumaksimalnega pretoka.

Page 138: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

130 POGLAVJE 5. PRETOKI IN LINEARNO PROGRAMIRANJE

Page 139: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 6

DINAMICNOPROGRAMIRANJE INNAJCENEJSE POTI

6.1 Uvod

Dinamicno programiranje je pristop k resevanju problemov, ki je soroden z metodorekurzivnega razcepa, uporablja pa se predvsem za resevanje dolocene vrste optimiza-cijskih problemov. Podobno kot pri rekurzivnem razcepu, tudi v tem primeru nalogorazbijemo na podnaloge, vendar v nasprotju z rekurzivnim razcepom, kjer so podna-loge neodvisne, so lahko pri dinamicnem programiranju medsebojno odvisne. Zaraditega je potrebno v tem primeru resitve vseh podnalog hraniti, ker se neka podnalogamed resitvijo celotnega problema lahko pojavi veckrat.

6.1 Primer Pri urejanju s porazdelitvami kot tipicni nalogi, ki jo resujemo z re-kurzivnim razcepom, razdelimo prvotno nalogo na dva dela, nato dva dela resujemoloceno, ker resevanje ene podnaloge ni povezano z resevanjem druge. 2

6.2 Primer Kot bomo pa videli kasneje, je tipicna naloga, ki jo resujemo z di-namicnim programiranjem, iskanje najcenejsih poti v grafih med dvema izbranimatockama. Na sliki 6.1 je prikazan graf, kjer je vsaki povezavi prirejena cena. Nalogaje poiskati najcenejso pot med vozliscema 1 in 6. Ce ceno najcenejse poti med i in joznacimo z uij , lahko zapisemo

u16 = MIN(u14 + c46, u15 + c56).

Torej je celotna naloga odvisna od cene najcenejsih poti med 1 in 4 ter med 1 in 5.Vendar obe podnalogi vsebujeta nadaljnji podnalogi iskanja cen najcenejsih poti med

131

Page 140: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

132 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

1

2

3

4

5

6

c12

c13

c24

c35

c25 c34

c46

c56

Slika 6.1: Graf z utezenimi povezavami

1 in 2 ter med 1 in 3. Zato izracuna u14 in u15 nista neodvisna. 2

6.2 Problem 0-1 nahrbtnika

Prvi problem, ki ga bomo resevali z metodo dinamicnega programiranja, je 0-1 nahrb-tnik: podano je n predmetov, pri cemer ima i-ti predmet prostornino vi in vrednostci. Ce imamo nahrbtnik s prostornino V , se postavlja problem izbire take pod-mnozice predmetov, ki ima najvecjo skupno vrednost (vsota vrednosti predmetov vpodmnozici), obenem pa po skupni prostornini ne presega V . Torej,∑n

i=1 xivi ≤ V,∑ni=1 xici maksimalno,

xi ∈ 0, 1.

Problem bomo resili tako, da ga bomo najprej razcepili na podprobleme, nato paslednje resevali po velikosti (zaceli bomo z najmanjsim). S ki(W ) bomo oznacili vre-dnost optimalnega nahrbtnika, ki ima skupno prostornino W , ce upostevamo le prvihi predmetov. Bodimo pozorni, da je ki funkcija enega argumenta, katere vrednost jeizrazena v istih enotah kot vrednosti predmetov, ci. Ocitno v tem primeru velja

ki(W ) = MAX(ki−1(W ), ki−1(W − vi) + ci), 1 ≤ i ≤ n, (6.1)

pri cemer definiramo,

k0(W ) =

−∞ pri W < 00 sicer.

(6.2)

Razlaga enacbe (6.1), ki ji pravimo Bellmanova enacba, je, da moramo pri odlocitvi,ali predmet i pripada optimalni podmnozici predmetov, primerjati optimalno vrednostnahrbtnika z upostevanjem i− 1 predmetov, kar ustreza primeru, ko i-ti predmet NIvkljucen v optimalno podmnozico, z optimalno vrednostjo, ko je i-ti predmet vkljucen.Slednjo vrednost dobimo kot vsoto optimalne vrednosti z upostevanjem i − 1 pred-metov in prostornino, ki je zmanjsana za prostornino i-tega predmeta, in vrednostii-tega predmeta. Resitev prvotne naloge je kn(V ).

Page 141: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.2. PROBLEM 0-1 NAHRBTNIKA 133

W

k0(W )

Slika 6.2: Stopnica

Funkcije ki(W ) racunamo po narascajoci vrednosti i, definicija (6.2) pa je posledicaenacbe (6.1). Namrec potrebno je zagotoviti, da je nemogoce dobiti pozitivno vrednostdrugega argumenta desne strani (6.1) v primeru W − vi < 0, ne glede na velikost ci.Funkciji (6.2) pravimo stopnica (gl. sliko 6.2). Ce pri izracunu k1(W ) stopnico k0(W )vstavimo v enacbo (6.1) namesto ki−1(W ), ustreza desni parameter stopnici, ki jezamaknjena v desno za vi in navzgor za ci (gl. sliko 6.3). Na ta nacin dobimo dvestopnici, oziroma po veckratni uporabi enacbe (6.1) “vzpenjajoce se stopnice” ali, ceuporabimo nekoliko bolj ucen izraz, odsekoma konstantno, nepadajoco funkcijo (OKNfunkcijo).

Zaradi preproste zgradbe OKN funkcij je tudi racunanje z njimi razmeroma pre-prosto. OKN funkcijo predstavljamo z zaporedjem parov, ki predstavljajo zamike,pri cemer prvi element para predstavlja zamik po abscisni osi, drugi element pa poordinatni osi.

6.3 Primer Podani so naslednji podatki

n = 4, V = 9v = (4, 2, 3, 7)c = (5, 2, 3, 9).

Iz podatkov izracunamo vrednost optimalnega nahrbtnika in optimalno mnozico.Vrednost racunamo na podlagi enacbe (6.1), pri cemer desni argument funkcije kioznacujemo z li = ki(W − vi+1) + ci+1. Rezultat izracuna je prikazan v tabeli na sliki6.4. Na vsakem koraku iz ki−1 ter li−1 izracunamo ki tako, da pare v ki−1 in li−1uredimo po narascajoci vrednosti prve komponente para in pri doloceni vrednosti uizberemo par z najvecjo vrednostjo v. Drugace povedano: ce imamo para (u1, v1) in(u2, v2) in ce velja

(u2 ≥ u1) ∧ (v2 ≤ v1), (6.3)

lahko (u2, v2) izlocimo. Na primer pri izracunu k4 na sliki 6.4 sta izpadla para (7,8)in (9,10). Poleg tega je mozno izlociti vse pare s prvo komponento vecjo od celotneprostornine V .

Iz funkcij ki in li je mozno tudi sestaviti optimalno podmnozico. V funkciji k4poiscemo par, ki doloca vrednost pri celotni prostornini (v nasem primeru V = 9).

Page 142: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

134 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

W

k0(W )

W

l0(W )

(a) Stopnica (b) Zamaknjena stopnica

k1(W )

(c) Vzpenjajoce se stopnice

Slika 6.3: Odsekoma konstantne nepadajoce funkcije

i k/l ki oziroma li0 k (0, 0)

l (4, 5)1 k (0, 0)(4, 5)

l (2, 2)(6, 7)2 k (0, 0)(2, 2)(4, 5)(6, 7)

l (3, 3)(5, 5)(7, 8)(9, 10)3 k (0, 0)(2, 2)(3, 3)(4, 5)(6, 7)(7, 8)(9, 10)

l (7, 9)(9, 11)4 k (0, 0)(2, 2)(3, 3)(4, 5)(6, 7)(7, 9)(9, 11)

Slika 6.4: Izracun optimalnega nahrbtnika

Page 143: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.2. PROBLEM 0-1 NAHRBTNIKA 135

To je (9,11). Nato ta par poiscemo v k3, oziroma l3. Ker se ta par nahaja v definicijil3, sklepamo, da je predmet 4 prisoten v optimalni podmnozici. Ker je par (9,11)nastal iz (2,2), sedaj poiscemo (2,2) v k2, oziroma l2. Najdemo ga v k2, kar pomeni,da predmet 3 ni prisoten v optimalni podmnozici. Na podoben nacin ugotovimo, daje predmet 2 v optimalni podmnozici, predmet 1 pa ni.

Algoritem za resitev problema 0-1 nahrbtnika je prikazan kot popoln program 6.1.Program uporablja tudi zunanji modul Qs, ki realizira dinamicne sezname in ki jeprikazan kot program 6.2.

Program 6.1: Izracun optimalnega 0-1 nahrbtnika

1 MODULE Knapsack ;33 IMPORT In,Qs,Out ;56 TYPE6 ObjRec = RECORD v ,c:LONGINT7 END; (∗ podatki o predmetih ∗)8 PAObjRec = POINTER TO AObjRec ;9 AObjRec = ARRAY OF ObjRec ;

10 PICNfunc = POINTER TO ICNfunc;11 ICNfunc = RECORD(Qs.Lifo) vStep,cStep: LONGINT12 END ; (∗ OKN funkcija ∗)13 ICNfuncPair = RECORD k ,l :Qs.Lifo14 END;(∗ k => OKN funkcija; l => zamaknjena OKN funkcija ∗)15 PAICNfuncPair = POINTER TO AICNfuncPair ;16 AICNfuncPair = ARRAY OF ICNfuncPair ;17 PABOOLEAN = POINTER TO ARRAY OF BOOLEAN ;18 ABOOLEAN = ARRAY OF BOOLEAN ;2021 VAR21 i ,n,V ,optV : LONGINT ;22 pObjects: PAObjRec; (∗ opisi predmetov ∗)23 pRes : PAICNfuncPair ;24 pOptSet : PABOOLEAN ;(∗ optimalna mnozica ∗)2626 PROCEDURE Init ;27 VAR i :LONGINT ;p:PICNfunc;28 BEGIN In.Open;29 (∗ preberemo stevilo predmetov in prostorsko omejitev ∗)30 In.LongInt(n);In.LongInt(V );31 NEW (pObjects,n);32 FOR i :=0 TO n−1 DO33 In.LongInt(pObjects[i ].v);34 In.LongInt(pObjects[i ].c)

se nadaljuje

Page 144: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

136 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

Izracun optimalnega 0-1 nahrbtnika (nadaljevanje)

35 END;36 NEW (pRes,n+1);37 FOR i :=0 TO n DO38 pRes[i ].k .Init ;pRes[i ].l .Init39 END;40 NEW (pOptSet ,n);41 NEW (p);42 p.vStep:=0;43 p.cStep:=0;44 pRes[0].k .Insert(p)45 END Init ;4747 PROCEDURE MkTranslPar(i :LONGINT );48 (∗ Izracun zamaknjene OKN funkcije ∗)49 VAR p:Qs.Lifo;50 r :Qs.Fifo;51 q :PICNfunc;53 BEGIN53 r .Init ;54 p:=pRes[i ].k ;55 WHILE (p.next # NIL)56 & (p.next(PICNfunc).vStep+pObjects[i ].v<=V )58 DO58 NEW (q);59 q .vStep:=p.next(PICNfunc).vStep+pObjects[i ].v ;60 q .cStep:=p.next(PICNfunc).cStep+pObjects[i ].c;61 r .Insert(q);62 p.Step63 END;64 pRes[i ].l :=r .first (∗ kazalec na seznam parov ∗)65 END MkTranslPar ;6767 PROCEDURE Merge(i :LONGINT );68 (∗ zlivanje OKN funkcije in iste funkcije z zamikom ∗)69 VAR p,q :Qs.Lifo;70 plast :PICNfunc;71 s:Qs.Fifo;72 r :PICNfunc;7474 PROCEDURE Insert ;76 BEGIN76 NEW (r);77 IF p.next(PICNfunc).vStep<q .next(PICNfunc).vStep THEN78 r↑:=p.next(PICNfunc)↑;p.Step79 ELSIF p.next(PICNfunc).vStep>q .next(PICNfunc).vStep THEN

se nadaljuje

Page 145: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.2. PROBLEM 0-1 NAHRBTNIKA 137

Izracun optimalnega 0-1 nahrbtnika (nadaljevanje)

80 r↑:=q .next(PICNfunc)↑;q .Step81 ELSIF p.next(PICNfunc).cStep<=q .next(PICNfunc).cStep THEN82 r↑:=q .next(PICNfunc)↑;83 q .Step;84 p.Step85 ELSE86 r↑:=p.next(PICNfunc)↑;87 q .Step;88 p.Step89 END ;90 plast :=r ;91 s.Insert(r)92 END Insert ;9494 PROCEDURE Skip(p:Qs.Lifo);95 (∗ zanemarjanje odvecnih parov ∗)97 BEGIN97 WHILE (p.next#NIL)98 &(p.next(PICNfunc).vStep>=plast .vStep)99 &(p.next(PICNfunc).cStep<=plast .cStep)

101 DO101 p.Step102 END;103 END Skip;105106 BEGIN106 s.Init ;107 p:=pRes[i−1].k ;q :=pRes[i−1].l ;108 WHILE (p.next # NIL) & (q .next # NIL) DO109 Insert ;110 Skip(p);111 Skip(q)112 END;113 WHILE p.next # NIL DO114 NEW (r);115 r↑:=p.next(PICNfunc)↑;116 p.Step;117 s.Insert(r)118 END;119 WHILE q .next # NIL DO120 NEW (r);121 r↑:=q .next(PICNfunc)↑;122 q .Step;123 s.Insert(r)124 END;

se nadaljuje

Page 146: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

138 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

Izracun optimalnega 0-1 nahrbtnika (nadaljevanje)

125 pRes[i ].k :=s.first126 END Merge;128128 PROCEDURE OptSet ;129 VAR i :LONGINT ;130 p:Qs.Lifo;131 q :PICNfunc;132 optR:ICNfunc;133 BEGIN134 IF n>0 THEN135 p:=pRes[n].k ;136 REPEAT q :=p.next(PICNfunc); p.Step137 UNTIL (p.next = NIL) OR (p.next(PICNfunc).vStep > V );138 optV :=q .cStep;139 optR:=q↑;140 FOR i :=n−1 TO 0 BY −1 DO141 p:=pRes[i ].k ;142 WHILE (p.next # NIL)143 & (144 (p.next(PICNfunc).vStep # optR.vStep)145 OR (p.next(PICNfunc).cStep # optR.cStep)146 )147 DO p.Step148 END ;149 pOptSet [i ]:= p.next = NIL ;150 IF pOptSet [i ] THEN151 optR.vStep:=optR.vStep−pObjects[i ].v ;152 optR.cStep:=optR.cStep−pObjects[i ].c154 END154 END;155 Out .Ln;Out .String(“Optimalna vrednost: ”);156 Out .Int(optV ,10);157 Out .Ln;Out .String(“Optimalna mnozica:”);158 FOR i :=0 TO n−1 DO159 Out .Ln;Out .Int(i+1,2);160 IF pOptSet [i ] THEN Out .String(“: +”)161 ELSE Out .String(“: −”)163 END164 END165 END165 END OptSet ;167168 BEGIN168 Init ;169 FOR i :=1 TO n DO

se nadaljuje

Page 147: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.2. PROBLEM 0-1 NAHRBTNIKA 139

Izracun optimalnega 0-1 nahrbtnika (nadaljevanje)

170 MkTranslPar(i−1);171 Merge(i)172 END ;174 OptSet174 END Knapsack .

Izracun optimalnega 0-1 nahrbtnika (konec)

Program 6.2: Dinamicni seznami

1 MODULE Qs;2 (∗3 Dinamicni seznami5 ∗)67 TYPE7 PEmpty∗ = POINTER TO Empty ;99 Empty∗ = RECORD

10 END;1212 PLifo∗ = POINTER TO Lifo;1414 PFifo∗ = POINTER TO Fifo;1616 Lifo∗ = RECORD(Empty) next∗: PLifo17 END ; (∗ sklad − “zadnji noter, prvi ven”∗)1919 Fifo∗ = RECORD(Empty)20 first∗,last∗: Lifo21 END; (∗ navadni seznam − “prvi noter, prvi ven” ∗)2323 (∗ algoritmi ∗)24 PROCEDURE (VAR p:Lifo)Init∗;25 (∗ Zacetne nastavitve ∗)26 BEGIN p.next :=NIL27 END Init ;2929 PROCEDURE (VAR p:Lifo)Insert∗(q :PLifo);30 (∗ q↑ na zacetek p ∗)31 BEGIN q .next :=p.next ; p.next :=q32 END Insert ;3434 PROCEDURE (VAR p:Lifo)Step∗;

se nadaljuje

Page 148: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

140 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

Dinamicni seznami (nadaljevanje)

35 (∗ pomikanje po seznamu ali brisanje elementov ∗)36 BEGIN p.next :=p.next .next37 END Step;3939 PROCEDURE (VAR p:Fifo)Init∗;40 (∗ Zacetne nastavitve ∗)41 BEGIN p.first .Init42 END Init ;4444 PROCEDURE (VAR p:Fifo)Insert∗(q :PLifo);45 (∗ Seznam podaljsamo s q↑ ∗)47 BEGIN47 IF p.first .next=NIL THEN p.first .Insert(q)48 ELSE p.last .next .Insert(q)49 END;50 p.last .next :=q51 END Insert ;5353 PROCEDURE (VAR f :Fifo)Join∗(VAR g :Fifo);54 (∗ Zdruzimo seznama f in g ∗)56 BEGIN56 IF f .first .next=NIL THEN57 f :=g58 ELSE f .last .next .next :=g .first .next ;59 f .last .next :=g .last .next61 END61 END Join;62 END Qs.

Dinamicni seznami (konec)

6.3 Problem najcenejsih poti

Problem iskanja najcenejsih poti v grafu je tipicen problem, ki se resuje z metododinamicnega programiranja (v posebnih primerih pa tudi z drugimi metodami). Vtem razdelku bomo opisali vec razlicic problema in metod resevanja.

Podan je usmerjen graf G = 〈V,E〉, pri cemer je V mnozica vozlisc, E pa mnozicapovezav. Na primer na sliki 6.1 je mnozica vozlisc 1, 2, 3, 4, 5, 6, mnozica povezavpa (1, 2), (1, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 6)(5, 6). Poleg tega imamo se funkcijoc : E −→ IR (namesto IR lahko uporabljamo katerokoli popolnoma urejeno mnozico,na kateri je definirano sestevanje). Kolicini c(e) pri e ∈ E pravimo cena povezave e.Na primer, na sliki 6.1 je cena povezave 〈i, j〉 oznacena s cij . Graf, ki mu je prirejenacenilna funkcija c, poimenujemo graf z utezenimi povezavami . Pot med vozliscema iZ

Page 149: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.3. PROBLEM NAJCENEJSIH POTI 141

in iK je zaporedje vozlisciZ = i1, i2, . . . , in = iK ,

tako da je 〈ij , ij+1〉 ∈ E, 1 ≤ j < n, njena cena pa je

uiZ ,iK =

n−1∑j=1

c(ij , ij+1).

V kolikor pri neki poti velja iZ = iK , ji pravimo cikel . Naloga iskanja najcenejsihpoti ima stevilne razlicice, od katerih bomo obravnavali najpomembnejse. Najprejrazlikujemo med iskanjem najcenejsih poti

• med zacetnim vozliscem in vsemi ostalimi ter

• med vsemi pari vozlisc.

Lahko bi pomislili, da bi bilo potrebno k dvema zapisanima nalogama dodati se na-logo iskanja najcenejse poti med zacetnim vozliscem ter nekim posameznim koncnimvozliscem, kajti gotovo je taka naloga lazja kot iskanje poti med zacetnim vozliscemin vsemi ostalimi. Napaka! Empiricne izkusnje namrec kazejo, da sta ti dve nalogi potezavnosti enakovredni.

6.3.1 Najcenejse poti med zacetnim vozliscem in vsemi osta-limi

Za to, da v nekem grafu z utezenimi povezavami, G = 〈V,E, c〉, obstaja pot z enolicnodoloceno najnizjo ceno od zacetnega vozlisca, 1, do vseh ostalih vozlisc in da imakoncno vrednost, morata biti izpolnjena dva pogoja: prvic, zacetno vozlisce mora bitipovezano z vsemi ostalimi in drugic, graf ne sme imeti negativnih ciklov (ciklov, prikaterih je vsota cen povezav negativna). Oba pogoja sta ocitna, na primer, ce drugini izpolnjen, od vsake poti do kateregakoli vozlisca, do katerega vodi pot skozi nekovozlisce na negativnem ciklu, obstaja cenejsa pot, ki jo dobimo tako, da se sprehodimopo ciklu veckrat.

Najcenejse poti imajo neko pomembno lastnost, ki nam omogoca, da jih racunamoz dinamicnim programiranjem:

6.4 Trditev Naj bo dan graf z utezenimi povezavami G = 〈V,E, c〉 in neka najcenejsapot med vozliscema iZ in iK . Naj bo i1, i2, . . . , in neka pot, ki je del poti med iZ iniK . V tem primeru je i1, i2, . . . , in najcenejsa pot med i1 in in.

Dokaz. Ce i1, i2, . . . , in ni najcenejsa pot med i1 in in, jo zamenjamo z najcenejsopotjo in dobimo cenejso pot med iZ in iK kot je prvotna, kar nasprotuje privzetku,da je prvotna pot med iZ in iK najcenejsa. 2

Pri izpolnjenih dveh osnovnih pogojih (vozlisce 1 je povezano z vsemi ostalimi inodsotnost negativnih ciklov) je resitev naloge mozno opisati z nekim naborom enacb,ki jim pravimo Bellmanove enacbe.

Page 150: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

142 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

Bellmanove enacbe. Naj bo 1 zacetno vozlisce in ui, pri 1 ≤ i ≤ n, cena najcenejsepoti med 1 in i. V tem primeru lahko zapisemo

ui =

0 pri i = 1;mink 6=iuk + cki sicer.

(6.4)

Z besedami: najcenejsa pot do zacetnega vozlisca ima ceno 0, do ostalih vozlisc pa jenajcenejsa pot podaljsek neke druge najcenejse poti.

Pri zapisanih pogojih je resitev Bellmanovih enacb natanko resitev problema naj-cenejsih poti, kar dokazemo z dvema izrekoma:

6.5 Izrek Naj bo G = 〈V,E〉 graf z utezenimi povezavami, ki nima negativnih ciklov.Naj bo vozlisce 1 povezano z vsemi ostalimi in naj bo u1, u2, . . . , un resitev problemanajcenejsih poti od vozlisca 1 do vseh ostalih. V tem primeru zadoscajo kolicine uipri 1 ≤ i ≤ n Bellmanovim enacbam (6.4).

Dokaz. Dejstvo, da za vsak ui velja ui = uk + cki pri nekem k, sledi iz trditve 6.4.Sedaj pa denimo, da trditev iz izreka ni resnicna. V tem primeru obstaja i, tako da

ui = mink 6=iuk + cki

ni resnicno. Ce nato spremenimo predhodno vozlisce k tako, da pravkar zapisanaenacba postane resnicna, dobimo cenejso pot do i, kar je v protislovju s privzetkom,da predstavlja nabor u1, u2, . . . , un resitev problema najcenejsih poti od vozlisca 1 dovsehostalih. 2

1

2

4

6

5

3

2 2

3 5

2

Slika 6.5: Drevo najce-nejsih poti za graf na sliki6.1, ce so cene povezavc12 = 2, c13 = 2, c24 =3, c25 = 5, c34 = 4, c35 =6, c46 = 2 in c56 = 2

V primeru, ko so kolicine u1, u2, . . . , un resitevBellmanovih enacb (6.4), se izkaze, da je vozlisca grafamozno urediti v drevesno strukturo. Relacija “vo-zlisce i je neposredno podrejeno vozliscu j” oziromav simbolicnem zapisu, i ≺ j, je definirana kot j jevrednost k, pri kateri uk + cki doseze minimum. Kermora biti j doloceno enolicno, se domenimo, da v pri-meru uk′ + ck′j = uk′′ + ck′′j izberemo manjsega oddveh indeksov, k′ in k′′.

Ce za vsak i zapisemo zaporedje indeksov i ≺ i1 ≺i2 . . ., ugotovimo , da ima vsak element enega predho-dnika (na podlagi definicije), zaporedje pa se koncuje zvozliscem 1 (ker je to edino vozlisce brez predhodnika,gl. sliko 6.5). Stevilu povezav na poti od vozlisca i dokorena, ce uporabljamo povezave, na podlagi katerih

je definirana relacija ≺, pravimo globina vozlisca i.

6.6 Izrek Podan je graf G = 〈V,E〉 z utezenimi povezavami brez negativnih ciklov.V tem primeru je resitev Bellmanovih enacb (6.4) enolicna in predstavlja resitev pro-blema najcenejsih poti od vozlisca 1 do vseh ostalih.

Page 151: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.3. PROBLEM NAJCENEJSIH POTI 143

Dokaz. Najprej za poljubno resitev Bellmanovih enacb (6.4)

u1, u2, . . . , un

dokazemo, da predstavlja ui ceno neke poti od vozlisca 1 do i. Dokaz izpeljemo zindukcijo po globini vozlisca v drevesu vozlisc, ki je bilo pravkar opisano. Za globino0 (vozlisce 1 oziroma koren drevesa) je trditev ocitna, kajti u1 = 0 je cena praznepoti. Sedaj dokazimo trditev za vozlisce i s privzetkom, da smo trditev za vozlisca naglobini, ki je manjsa od i, ze dokazali. Ce velja i ≺ j, je globina j manjsa od globinei in smo za uj ze dokazali, da je cena neke poti. Na podlagi definicije je potemtakemui cena poti do j, ki je podaljsana s povezavo 〈j, i〉.

Naj bo sedaj u1, u2, . . . , un resitev problema najcenejsih poti, ki na podlagi izreka6.5 zadosca Bellmanovim enacbam (6.4) in naj bo u1, u2, . . . , un neka druga resitevBellmanovih enacb, ki se razlikuje od u1, u2, . . . , un. Za resitev u1, u2, . . . , un sesta-vimo drevo vozlisc in izberemo neko vozlisce i na najmanjsi globini, pri katerem veljaui 6= ui. V tem primeru ocitno velja ui > ui. Vendar, ker velja pri vseh vozliscihj, uj ≥ uj , pri tistih na manjsi globini, kot je globina i pa uj = uj , sklepamo, daui = mink 6=iuk + cki ne velja, kar nasprotuje trditvi, da je u1, u2, . . . , un resitevBellmanovih enacb (6.4), s cimer smo trditev izreka dokazali. 2

Vendar z dokazom predhodnih dveh izrekov naloga izracuna najcenejsih poti sezdalec ni zakljucena. Namrec, kot smo v uvodu poglavja zapisali, se izracun primetodi dinamicnega programiranja izvaja tako, da postopno racunamo podnaloge pr-votne naloge, zacensi z najmanjsimi. Pri resevanju 0-1 nahrbtnika smo z enacbo (6.1)ze odkrili hierarhijo velikosti podproblemov, saj je racunanje funkcije ki−1 “manjsanaloga” od racunanja ki(

1). Pri sedanji nalogi pa enacbe (6.4) narekujejo, da privsaki kolicini ui uporabljamo vse ostale uk, kar pomeni, da brez dodatne informacijene poznamo vrstnega reda izracunov.

V nadaljevanju poglavja bomo opisali nekaj primernih hierarhij podnalog priresevanju problema najcenejsih poti.

Najcenejse poti v aciklicnih grafih. Eden od moznih nacinov za urejanje pod-nalog iskanja najcenejsih poti je na podlagi dejstva, da takrat, ko velja u

∗−→/ v (medu in v ni poti), naloga iskanja najcenejsih poti do v ne more biti odvisna od iskanjanajcenejsih poti do u (ker ni mozno za iskanje “dobre” poti do v izkoristiti neko potdo u). V takem primeru lahko resujemo nalogo iskanja najcenejsih poti do v prednalogo iskanja najcenejsih poti do u.

V primeru, ko graf nima ciklov, ima u∗−→ v (med u in v obstaja pot) za posledico

v∗−→/ u (med v in u ni poti) in zato pri veljavnem prvem pogoju ter na podlagi

zgoraj zapisane misli naloga iskanja najcenejsih poti do u ne potrebuje rezultatanaloge iskanja najcenejsih poti do v. V splosnem lahko iz tega nacela izpeljemo

1Primerna in natancna definicija pojma “manjsa naloga” je, da je P1 manjsa naloga kot P2, vkolikor pri iskanju resitve za P1 ne potrebujemo rezultatov P2.

Page 152: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

144 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

5

3

4

1

2

0

Slika 6.6: Stopnje vozlisc nekega aciklicnega grafa

neko urejenost vozlisc grafa ≺, na podlagi katere pridobijo Bellmanove enacbe (6.4)naslednji videz:

ui =

0 pri i = 1mink≺iuk + cki sicer

(6.5)

in lahko racunanje podnalog ui uredimo na podlagi urejenosti ≺ (torej “manjse”kolicine ui racunamo pred “vecjimi”). To, kar smo pravkar zapisali, lahko povzamemoz naslednjo trditvijo:

6.7 Trditev Graf G = 〈V,E〉 je aciklicen natanko tedaj, ko obstaja popolna urejenostV z lastnostjo,

u v =⇒ u∗−→/ v. (6.6)

Dokaz. Trditev je sestavljena iz dveh delov. Prvi pravi, da, v kolikor opisana popolnaurejenost obstaja, je graf aciklicen; drugi pa nasprotno, ce je graf aciklicen, takaurejenost zagotovo obstaja.

Dokaz prvega dela je ociten, saj lahko na podlagi urejenosti ≺ vozlisca razvrstimov ravno crto, pogoj (6.6) pa pomeni, da povezave gredo le od leve proti desni, karseveda pomeni, da ni ciklov. Pri dokazu drugega pa iz privzetka aciklicnosti definiramourejenost, ki ima zeleno lastnost. Najprej definiramo pojem stopnje vozlisca v kotnajvecje stevilo povezav na neki poti, ki izhaja iz v. Pojem je dobro definiran, kajtikadar je graf aciklicen, iz vsakega vozlisca vodi koncno mnogo poti in je potemtakemtudi najvecje stevilo povezav na neki poti natancno definirano. Kot primer prikazujeslika 6.6 aciklicni graf, kjer so vozlisca oznacena s stopnjami. Ker ocitno velja

u∗−→ v =⇒ stopnja(u) > stopnja(v),

oziroma,stopnja(u) ≤ stopnja(v) =⇒ u

∗−→/ v,

lahko relaciji u v ustrezajo padajoce stopnje. Bolj natancno, v primeru stopnja(u) <stopnja(v) definiramo u v, v primeru stopnja(u) = stopnja(v) pa bodisi u v aliu ≺ v. 2

Urejenosti pravimo topoloska urejenost (vozlisc grafa), postopek za njen izracunpa je prikazan na sliki 6.7. Postopek izhaja iz tega, da ima zagotovo najvisjo stopnjo(in s tem najmanjsi polozaj v urejenosti ) neko vozlisce, do katerega ne vodi nobenapovezava. Zato najprej poiscemo neko tako vozlisce in ga zapisemo kot naslednje

Page 153: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.3. PROBLEM NAJCENEJSIH POTI 145

Vhod:Seznam povezav E grafa G = 〈V,E〉.

Izhod:Topolosko urejeno zaporedje vozlisc, V .

Postopek:

1. Preberemo seznam parov 〈i, j〉 in na podlagi seznama zgradimo podatkovnostrukturo, ki predstavlja graf. Vsakemu vozliscu v priredimo kolicino inv , kipredstavlja stevilo povezav, ki so usmerjene v vozlisce;

2. r = ∅;3. poiscemo vsa vozlisca v, pri katerih je inv = 0, ter jih dodamo seznamu r;

ce takega vozlisca ni in je mnozica vozlisc neprazna, je to znak, da G vsebujecikel. V tem primeru se ustavimo;

4. spremenljivki u priredimo prvi element seznama r ter ga obenem odstranimos seznama;

5. vse povezave, ki so usmerjene iz u, odstranimo in vsakic, ko odstranimo nekopovezavo, zmanjsamo za 1 kolicino inv , ce je v vozlisce, kamor je bila povezavausmerjena;

6. u damo na konec izhodnega zaporedja;

7. ce je seznam r prazen, se ustavimo, sicer nadaljujemo pri 3.

Slika 6.7: Topolosko urejanje

(oziroma zacetno) vozlisce v vrstnem redu . Nato vse povezave, ki izhajajo iz tegavozlisca, izbrisemo in postopek ponovimo2. Cas, ki ga porabi postopek za topoloskourejanje ni tezko oceniti: naj bo stevilo vozlisc n, stevilo povezav pam. Za sestavljanjepodatkovne strukture, ki predstavlja vozlisca, in za obiskovanje vozlisc, ki nimajovhodnih povezav, potrebujemo cas Θ(n), cas za izracun vhodne stopnje vozlisc ter zaazuriranje slednje kolicine pa je Θ(m), torej je skupen cas Θ(m+ n).

6.8 Primer Sled algoritma na sliki 6.7 na primeru s slike 6.1 je prikazana v tabelina sliki 6.8. 2

Dijkstrov algoritem. V kolikor imajo vse povezave v grafu pozitivne cene, senam ponuja neka druga moznost urejanja izracunov kolicin ui v enacbah 6.4. V temprimeru jih lahko racunamo na podlagi narascajoce vrednosti (ui). To je mozno zato,ker v primeru ui > uj najcenejsa pot do i ne pride v postev kot gradnik za najcenejso

pot do j (cetudi velja i∗−→ j) zato, ker bi povezave od i do j (ki so pozitivne) le

se povecale vrednost te kolicine. Posledica tega je da, lahko izracunamo ui kasneje

2V nasem primeru, ko iscemo najcenejse poti med zacetnim vozliscem in vsemi ostalimi, je nazacetku zacetno vozlisce edino, ki izpolnjuje pogoj, da nima k sebi usmerjenih povezav (zaradiprivzetka o povezanosti zacetnega vozlisca z vsemi ostalimi).

Page 154: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

146 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

r = 1u = 1 (odstranimo povezavi 1-2 ter 1-3)r = 2,3u = 2 (odstranimo povezavi 2-4 ter 2-5)r = 3u = 3 (odstranimo povezavi 3-4 ter 3-5)r = 4,5u = 4 (odstranimo povezavo 4-6)r = 5u = 5 (odstranimo povezavo 5-6)r = 6u = 6

Slika 6.8: Sled algoritma za topolosko urejanje (slika 6.7) za graf na sliki 6.1. Izpis rse nanasa na trenutek, ko se izvrsi tocka 3, izpis u pa se nanasa na trenutek, ko seizvrsi tocka 5

kot uj . Torej izracune uredimo tako, da na vsakem koraku izracunamo naslednjovecjo kolicino ui. Algoritmu, ki deluje na ta nacin, pravimo Dijkstrov algoritem, poizumitelju E. W. Dijkstri in je prikazan na sliki 6.9.

Za razumevanje algoritma je bistvena invarianta zanke, ki obsega tocke 2-5 nasliki 6.9. Le-ta se glasi: “Kolicine ui za elemente mnozice P so dokoncne in pravilnevrednosti cen najcenejsih poti, kolicine ui za elemente T pa predstavljajo le zgornjomejo dokoncne vrednosti. ui za nek element i ∈ T predstavlja najmanjso ceno medtakimi potmi do i, v katerih le vozlisce i pripada T , ostala pa pripadajo P .”

Zapisana invarianta ocitno velja pred tocko 2, njeno splosno veljavnost pa dokazemoz indukcijo. Pred prvim izvajanjem zanke je njena veljavnost ocitna, na podlagizacetnih prirejanj (P vsebuje le vozlisce 1, cena poti do njega pa je 0). Sedaj je po-trebno dokazati, da invarianta ostane v veljavi tudi po izvajanju jedra zanke. Denimo,da smo v neki iteraciji na 3. koraku (slika 6.9) nasli element k. Moramo se prepricati,da je uk dejansko pravilna vrednost najcenejse poti med 1 in k. Naj to ne drzi. V temprimeru obstaja neka druga, cenejsa pot do k. Pri cenejsi poti se ne more zgoditi, davse povezave, razen zadnje, povezujejo elemente P , kajti med takimi je pot s ceno ukze najcenejsa. Torej gre domnevno najcenejsa pot do nekega vozlisca h′, nato preskociv mnozico T pri elementu k′, od koder nadaljuje pot do k (gl. sliko 6.10). Vendar,ker je uk′ ≥ uk, bi morala pot med k′ in k imeti skupno negativno ceno, ce bi hotelidoseci manjso vrednosti od uk. To pa ni mozno zaradi izhodiscnega privzetka, da socene povezav pozitivne. Torej je uk najcenejsa pot do k. Pravzaprav ni nujno, da potk′ −→ k poteka le po vozliscih T . Lahko tudi enkrat ali veckrat preskoci nazaj v P .Vendar to ne spremeni zapisanega premisleka in zakljucek ostane isti.

Nadalje moramo preveriti, ali se po popravku vrednosti ui, pri i ∈ T ohranjalastnost, da je ui cena najcenejse med potmi, pri katerih le koncno vozlisce ne pripada

Page 155: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.3. PROBLEM NAJCENEJSIH POTI 147

Vhod:Seznam cen povezav, cij , grafa G = 〈V,E〉, pri cemer je V = 1, 2, . . . , n.

Izhod:Vrednosti najcenejsih poti, ui.

Postopek:

1. Kolicinam ui priredimo zacetne vrednosti c1i, ce povezava 〈1, i〉 obstaja, sicerdobi ui vrednost ∞; nato razdelimo V na dve medsebojno tuji podmnozici:P = 1 in T = 2, . . . , n.

2. ce je T prazno, se ustavimo, sicer nadaljujemo;

3. poiscemo minimalno vrednost uk v mnozici T ter k prestavimo v mnozico P ;ce ima vec kolicin ui isto minimalno vrednost, izberemo najmanjsi indeks;

4. popravimo kolicine ui za i ∈ T po pravilu ui := min(ui, uk + cki);

5. vrnemo se na korak 2.

Slika 6.9: Dijkstrov algoritem

1

kh

h′

k′

chk

ch′k′

P

T

Slika 6.10: Dijkstov algoritem: izbira naslednjega elementa k, do katerega poznamonajcenejso pot

P (gl. sliko 6.9, tocka 4). To pa ocitno drzi, saj potem, ko smo dodali k mnozici P ,je edina nova moznost za povezave med P in i, pot, ki pelje preko k. In to moznostsmo ravno preverili pri popravljanju vrednosti ui.

6.9 Primer Delovanje Dijkstrovega algoritma na grafu s slike 6.11 je prikazano natabeli na sliki 6.12. 2

Tudi cas Dijkstrovega algoritma ni tezko oceniti: cas za zacetni izracun kolicinui, 2 ≤ i ≤ n, pri cemer je n stevilo vozlisc, je Θ(n). Nato pri i-tem izvajanju jedrazanke 2-5 potrebujemo cas Θ(n−i) za izbiro najmanjse vrednosti ui ter za spremembokolicin ui. Celotni cas je torej enak Θ(n2).

Page 156: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

148 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

1

2

3

4

5

6

2

7

3 1

7

1

7 7

2

2

Slika 6.11: Primer grafa

1 2 3 4 5 6u 0∗ 2 7 ∞ ∞ ∞u 0∗ 2∗ 5 9 9 ∞u 0∗ 2∗ 5∗ 9 6 ∞u 0∗ 2∗ 5∗ 7 6∗ 8u 0∗ 2∗ 5∗ 7∗ 6∗ 8u 0∗ 2∗ 5∗ 7∗ 6∗ 8∗

Slika 6.12: Potek Dijkstrovega algoritma za graf na sliki 6.11 (elementi mnozice P sooznaceni z zvezdicami). Odsotnost povezave med P in i je nakazana z znakom ∞.

Tako zasnovan algoritem za najcenejse poti v grafih spada med pozresne algoritme(ker izbiramo k na podlagi najmanjse vrednosti ui, i ∈ T ), kljub temu, da se odalgoritmov iz poglavja 4 razlikuje po tem, da se ocene preostalih predmetov (ui prii ∈ T ) spreminjajo med racunanjem. Trditev je upravicena zato, ker je najboljznacilna lastnost pozresnih algoritmov, da predmete izbiramo enega za drugim napodlagi njihove vrednosti in nobena izbira predmeta ne more postaviti pod vprasajneke predhodne izbire.

Bellman-Fordov algoritem. Pri zadnjem nacinu urejanja podnalog naloge iskanjanajcenejsih poti uporabljamo priblizke kolicin ui, ki se razlikujejo po stevilu povezavna neki poti. Pri tem z uhi oznacimo najcenejso pot do i med vsemi potmi, ki vsebujejoh ali manj povezav. Ocitno je, da pot s h povezavami lahko uporablja kot gradnikele poti, ki imajo manj kot h povezav. Zato lahko izracun uredimo tako, da racunamokolicine uhi po narascajocem h. Dokoncne vrednosti kolicin ui dobimo kot vrednostiun−1i , kjer je n stevilo vozlisc v grafu.

V tem primeru imajo Bellmanove enacbe (6.4) obliko

uhi =

0 pri i = 1;c1i pri h = 1;

minuh−1i ,mink 6=iuh−1k + cki sicer.(6.7)

Page 157: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.3. PROBLEM NAJCENEJSIH POTI 149

OBICAJNO MATRICNO MNOZENJE

Cij =

n∑k=1

Aik ·Bkj .

SPREMENJENO MATRICNO MNOZENJE

Cij =n

mink=1Aik +Bkj.

Slika 6.13: Dve vrsti matricnega mnozenja

Ce privzamemo, da je cii = 0, lahko zadnjo vrstico zapisemo v enostavnejsi obliki,

uhi =n

mink=1uh−1k + cki. (6.8)

Za ta algoritem se ni tezko prepricati, da porabi cas Θ(n3).

6.3.2 Najcenejse poti med vsemi pari vozlisc

Naceloma je mozno poiskati najcenejse poti med vsemi pari vozlisc tako, da algoritemza najcenejse poti med zacetnim vozliscem in vsemi ostalimi sprozimo pri vsakemvozliscu. Ce je stevilo vozlisc n, dobimo potemtakem algoritem s casovno zahtevnostjonT (n), kjer je T (n) casovna zahtevnost algoritma za najcenejse poti med zacetnimvozliscem in vsemi ostalimi.

Zanimiva pa je naloga poiskati algoritem za najcenejse poti med vsemi pari vozlisc,ki bi imel manjso zahtevnost od zapisane vrednosti. V nadaljevanju bomo predstavilidva taksna algoritma.

Posploseni Bellman-Fordov algoritem. V tem primeru izhajamo iz Bellman-Fordovega algoritma. Kolicino ui iz (6.8) poimenujemo u1i, oziroma po zamenjavi iz j, u1j , nato pa dobimo kot vrednost najcenejse poti, ki vsebuje najvec h povezav,od i do j izraz

uhij =

0 pri i = jcij pri h = 1

minnk=1uh−1ik + ckj pri 2 ≤ h ≤ n− 1.(6.9)

Ce kolicine uhij uredimo v matriko velikosti n×n in jo poimenujemo Ch, pri cemer je

C1 matrika cen cij , lahko opazimo, da je izraz (6.9) dobro znano pravilo za element〈i, j〉 matricnega produkta Ch−1 · C1 potem, ko smo operacijo mnozenja zamenjali ssestevanjem in vsoto nadomestili z minimalizacijo (gl. sliko 6.13).

Page 158: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

150 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

i

j

h

uh−1ij

uh−1ihuh−1hj

vozlisca 1, . . . , h− 1

Slika 6.14: Osnovna operacija pri Floyd-Warshallovem algoritmu

Na prvi pogled s tako spremembo zapisa nismo pridobili nic. Na podlagi prvegaodstavka tega razdelka ugotavljamo, da porabi posploseni Bellman-Fordov algoritemcas nT (n) = Θ(n4). Ocena se ne spremeni, ce uporabljamo matricni zapis, kajtimatrika najcenejsih poti je

U = C1 · C1 · . . . · C1︸ ︷︷ ︸n−1 faktorjev

, (6.10)

in ce privzamemo, da eno matricno mnozenje porabi Θ(n3) operacij, vsega skupaj paimamo n− 2 matricnih mnozenj, dobimo tudi na ta nacin oceno Θ(n4) operacij.

Vendar nas matricni zapis napelje na idejo, da (6.10) racunamo po shemi,

(C1)

2 · 2 · . . . · 2︸ ︷︷ ︸dlog2(n−1)e (6.11)

(torej z iteriranim kvadriranjem), kar pri nespremenjeni oceni za stevilo operacijposameznega matricnega mnozenja pripelje do koncne ocene

Θ(n3 log2 n). (6.12)

Bodimo pozorni na to, da je stevilo kvadriranj k = dlog2(n − 1)e, kar pomeni, da je2k najmanjsi eksponent 2, ki je vecji od n− 1.

Floyd-Warshallov algoritem. Pri Bellman-Fordovem algoritmu smo podnalogeuredili na podlagi najvecjega stevila povezav na poti med dvema vozliscema. Izkazese, da obstaja se en nacin za njihovo urejanje, ki pripelje do hitrejsega algoritma. Vtem primeru uredimo podnaloge naloge iskanja najcenejse poti med i in j na podlaginajvecjega indeksa nekega vmesnega vozlisca na poti med i in j (v primeru, ko je potsestavljena iz ene same povezave, definiramo najvecji indeks vmesnega vozlisca kot0). Na primer, na sliki 6.11 imamo med vozliscema 1 in 4 poti 1-2-4, 1-3-4 in 1-3-5-4.Najvecji indeksi vmesnih vozlisc so 2, 3 in 5, po vrsti. V tem primeru so Bellmanove

Page 159: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.4. PREVEDBA 0-1 NAHRBTNIKA NA NAJCENEJSE POTI 151

Tin

Tout

MB

inA

outA(inA)

inB(inA)

outB(inB(inA))

Slika 6.15: Prevedba problema A na problem B

enacbe

uhij =

cij pri h = 0;

minuh−1ij , uh−1ih + uh−1hj sicer(6.13)

in dokoncne vrednosti najcenejsih poti, uij , dobimo kot unij .Porabo casa ocenimo tako, da prestejemo stevilo operacij minimalizacije. Pri vsaki

vrednosti 0 < h ≤ n izracunamo n2 vrednosti uhij , za katere porabimo konstanten cas.

Torej je celotni cas Θ(n3).

6.4 Prevedba 0-1 nahrbtnika na najcenejse poti

Lahko pokazemo, da je problem najcenejsih poti v nekem smislu najtezji v svojemrazredu. To utemeljimo tako, da pokazemo, da si lahko pri resitvi drugih problemovpomagamo z algoritmom, ki resuje problem najcenejsih poti. Namrec, tezko si jepredstavljati, da bi bil problem B lazji od problema A, obenem pa bi lahko A resili,ce poznamo nacin resevanja problema B. Zaenkrat je pojem “pomagamo” se nekolikonenatancen, zato ga bomo dolocili nekoliko natancneje.

Podana sta problema A in B, ki sta opisana s svojimi vhodnimi podatki inA ininB (gl. sliko 6.15). Za vsak problem je moznih neskoncno vhodnih podatkov, kotnpr. v primeru najcenejsih poti, ko je problem mozno postaviti za najrazlicnejse grafein cene povezav. Problema A in B imata resitvi outA(inA) in outB(inB) (na ta nacinnakazemo, da je resitev odvisna od vhodnih podatkov). Pravimo, da A prevedemona B (ali, da si pri resitvi A pomagamo z B), ce obstajata transformaciji Tin inTout, tako da Tin spremeni inA v inB(inA) (zopet smo nakazali, da so podatki, ki jihtransformacija sestavi, odvisni od podatkov inA), Tout pa spremeni outB(inB(inA)) voutA. Dodaten pogoj je, da sta transformaciji Tin in Tout razmeroma preprosti, takoda je skoraj celotno delo pri resevanju A odvisno od racunskega napora pri resevanjuB. V vecje podrobnosti se ne bomo spuscali.

Najpreprostejsi primer opisanega postopka je prevedba problema najdrazje potiskozi graf na problem najcenejse poti. Torej zelimo poiskati najdrazjo pot od zacetnegavozlisca v grafu do vseh ostalih (problem A), imamo pa na razpolago algoritem, ki znapoiskati najcenejso pot (problem B). Kako lahko uporabimo algoritem za problem B

Page 160: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

152 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

...

. . .

. . .

. . .

...

......

......

...

xv11

0 0 0 0

0 0 0

0

0

0 0 0

c1

xs x01

x11

xW1

x02

xv22...

xW2

x0n

xvn

xWn

xt0

c2

c2

c3

c3

0

0

c2

xv1+v2,2

xv1 xv2

c2xv+v2,2

Slika 6.16: Graf, ki ustreza splosnemu problemu 0-1 nahrbtnika.

za resevanje problema A? V tem primeru so podatki inA ter inB , podatki o grafihin cenah povezav. Za resitev problema A z algoritmom za B zadostuje, da Tin vsecene povezav negira, Tout pa vse vrednosti ui ponovno negira. V tem primeru bonajcenejsa pot problema B ustrezala najdrazji poti problema A. Ta preprosti primertudi nekoliko daje obcutek, kaj smo mislili s pogojem, da morata Tin in Tout bitienostavni operaciji.

Netrivialen primer istega postopka predstavlja prevedba problema 0-1 nahrbtnikana problem najdrazje poti. Ce je podan problem nahrbtnika s stevilom predmetov n,vektorjema v (prostornin predmetov) in c (cen predmetov) ter prostorsko omejitvijoW , bomo opisali transformacijo Tin, ki spremeni opis nahrbtnika v opis grafa G =〈V,E〉 s cenami povezav cij , pri i, j ∈ V tako, da bo najdrazja pot od zacetnegavozlisca vG do nekega posebnega koncnega vozlisca enolicno dolocala resitev problemanahrbtnika. Privzetek, iz katerega izhajamo, je, da so vse prostornine celostevilcne.Ocitno se tudi primer poljubnih racionalnih prostornin da prevesti na to obliko tako,da vse prostornine pomnozimo z najmanjsim skupnim mnogokratnikom imenovalcevstevil, ki predstavljajo vrednosti prostornin. Graf G definiramo tako, da je V =

Page 161: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.5. POVZETEK OSNOVNIH POJMOV 153

0 0

0

0

0

0

0

0

xs x01

x11

x21

x02

x12

x22

x05

x15

x25

xt0

0

0

x03

x13

x23

0

0

0

x04

x14

x24

0

0

0

0

0

x31

x41

x32

x42

x35

x45

0

0

x33

x43

0

0

x34

x44

0

0

3

2

2

2

4

4

4

1

1

1

1

6

6

Slika 6.17: Primer prevedbe za konkretni problem 0-1 nahrbtnika (6.14)

xs, xt ∪ xij | 0 ≤ i ≤W, 1 ≤ j ≤ n, E pa vsebuje, prvic, dve povezavi, ki izviratapri xs; ena s ceno 0 do vozlisca x01 in druga s ceno c1 do vozlisca xv1,1, drugic V + 1povezav s ceno 0, ki izvirajo pri vozliscih xin, 0 ≤ i ≤ W in vodijo do xt in koncnopovezave, ki vodijo iz vozlisc xij , 0 ≤ i ≤W, 1 ≤ j ≤ n−1, in sicer tako, da iz vsakegaizhajata dve povezavi, ena do vozlisca xi,j+1 s ceno 0 in druga do vozlisca xi+vj+1,j+1

s ceno cj . Graf G je shematicno prikazan na sliki 6.16.Ce kot konkreten zgled vzamemo naslednji problem 0-1 nahrbtnika:

W = 4,v1 = 1, v2 = 2, v3 = 2, v4 = 1, v5 = 3,c1 = 3, c2 = 2, c3 = 4, c4 = 1, c5 = 6,

(6.14)

dobimo kot rezultat opisane transformacije graf, ki je prikazana na sliki 6.17.

6.5 Povzetek osnovnih pojmov

1. Razlika med dinamicnim programiranje in rekurzivnim razcepom

2. Tipicne naloge, ki jih resujemo z dinamicnim programiranjem

3. 0-1 nahrbtnik. Bellmanova enacba. OKN funkcija

4. Najcenejse poti v grafih. Razlicne vrste nalog najcenejsih poti

5. Bellmanove enacbe pri problemu najcenejsih poti. Osnovni privzetek za uporabnostBellmanovih enacb. Zakaj ni mozno iz Bellmanovih enacb neposredno pridobiti algo-ritma za resevanje problema

Page 162: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

154 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

1

2

3

4

5

6

1

3

3

2

9

−41

2

5

−6

6

(a) Graf brez ciklov

1

2

3

4

5

6

3

26 8

1

10

9

4

3

1

3

42

(b) Graf s pozitivnimi poveza-vami

Slika 6.18: Dva grafa

6. Najcenejsa pot od zacetnega vozlisca do vseh ostalih v aciklicnem grafu

7. Dijkstrov algoritem

8. Bellman-Fordov algoritem in posploseni Bellman-Fordov algoritem. Ucinkovita iz-vedba slednjega algoritma

9. Floyd-Warshallov algoritem

10. Prevedba 0-1 nahrbtnika na najcenejse poti.

6.6 Naloge

1. Naj bodo povezave nekega grafa podane z matriko

A =

0 −1 3 ∞ 6∞ 0 5 6 8∞ ∞ 0 ∞ 10∞ 0 −1 0 ∞∞ 0 0 −1 0

in naj bodo najcenejse poti od zacetnega vozlisca, u1 = 0, u2 = −1, u3 = 3, u4 = 5 inu6 = 6. Sestavite drevo najcenejsih poti.

2. Poiscite resitev problema najcenejsih poti od vozlisca 1 do vseh ostalih za aciklicengraf na sliki 6.18a.

3. Uporabite Dijsktrov algoritem na grafu na sliki 6.18b.

4. Naj bodo povezave nekega grafa podane z matriko

A =

0 ∞ 4 10 3 ∞ ∞∞ 0 −1 −3 2 11 0∞ 9 0 8 3 2 1∞ 4 0 0 8 6 3∞ 0 1 2 0 3 −1∞ −1 −1 3 2 0 0∞ 4 3 ∞ ∞ 2 0

.

Poiscite najcenejse poti od vozlisca 1 do vseh ostalih z Bellman-Fordovo metodo.

Page 163: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

6.6. NALOGE 155

5. Uporabite “matricno mnozenje” (posploseno Bellman-Fordovo metodo) na grafu nasliki 6.18b.

6. Uporabite Floyd-Warshallov algoritem na grafu na sliki 6.18b.

Page 164: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

156 POGLAVJE 6. DINAMICNO PROGRAMIRANJE

Page 165: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 7

SESTOPANJE

7.1 Uvod

Sestopanje je primerno, ko v neki mnozici moznih resitev iscemo eno ali vec resitev, zakatere je znacilno, da jih je mozno sestaviti z zaporednimi koraki, pri cemer na vsakemkoraku lahko ugotovimo, ali smo na pravi poti (ali je delna resitev “dopustna”). Kona nekem koraku izcrpamo vsa mozna nadaljevanja, ne da bi dosegli zeleni cilj, zadnjikorak trenutne resitve podremo (“sestopimo”) in nadaljujemo od prejsnjega koraka vdrugi smeri.

Slika 7.1: Plezanje po drevesuin sestopanje

Izraz “sestopanje” izvira iz prispodobe drevesa:resitve si predstavljamo, kot da so urejene v drevesnostrukturo, pri cemer nasledniki nekega vozlisca pred-stavljajo mozne alternative na nekem koraku. Torej“sestopimo”, ko pri nekem vozliscu ugotovimo, da nemoremo nadaljevati s “plezanjem” do koncne resitvein se spustimo po isti poti do predhodnega vozlisca(gl. sliko 7.1).

Glede na to, da je metoda sestopanja najmanjucinkovita (beri: najpocasnejsa) med vsemi meto-dami sestavljanja algoritmov, ki smo jih obravna-vali, se k njej zatekamo le takrat, ko nobena drugani uporabna in ko moramo preprosto preizkusiti vsemoznosti. Njena prednost pa je v tem, da je raz-meroma enostavna za realizacijo in ne potrebuje po-globljenega poznavanja problema, ki ga resujemo. Izpravkar zapisane pripombe sledi, da jo lahko upora-bljamo na zacetku raziskav nekega problema, kasneje, ko problem bolje spoznamo, pamorebiti odkrijemo kaksno ucinkovitejso resitev.

Metodo bomo prikazali na nekaj znacilnih in dobro znanih problemih.

157

Page 166: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

158 POGLAVJE 7. SESTOPANJE

1 PROCEDURE poskus(i : INTEGER);2 BEGIN izbira prvega koraka na seznamu moznih;4 REPEAT4 IF korak dopusten THEN5 zapi si ga ;6 IF ni se konec THEN7 poskus(i+1) ;8 IF izid neuspe sen THEN sestop END9 ELSE zapi si “izid uspe sen”

11 END11 END;12 izbira naslednjega koraka13 UNTIL izid uspe sen14 OR (konec seznama moznih korakov)15 END poskus ;

Slika 7.2: Vzorec za osnovno proceduro sestopanja

7.2 Problem skakacevega obhoda

Problem opisemo takole: podana je sahovska deska velikosti n×n (obicajno je n = 8,vendar ima lahko n tudi drugacno vrednost) in skakac, ki se premika na obicajennacin. Na primer, mozne poteze skakaca, ki je postavljen na polje, ki je oznaceno z“∗”, so na sliki 7.3 prikazane s stevilkami 0-7. Ce skakaca postavimo na polje 〈i, j〉,je naloga poiskati zaporedje n2 − 1 skakacevih potez, s katerimi le-ta obisce vsa poljain seveda vsako polje le enkrat (gl. tudi nalogo 2).

00

1234567

1 2 3 4 5 6 7

0

1

2

34

5

6

7

Slika 7.3: Sahovnica velikosti 8×8in mozne poteze skakaca

Pri sestavljanju algoritma, ki realizira me-todo sestopanja, moramo najprej izbrati pri-merne podatkovne strukture za problem, ki garesujemo. Ko je ta del naloge opravljen, se lotimosamega algoritma. Algoritem obicajno vsebujeneko osrednjo proceduro, ki izvaja “poskuse”,pridobimo pa jo iz osnovnega vzorca, ki je pri-kazan na sliki 7.2, tako da ga prilagodimo trenu-tnemu problemu.

V primeru skakacevega obhoda izberemo kotprimerno podatkovno strukturo za predstavitevsahovnice tabelo

a: ARRAY n,n OF INTEGER. (7.1)

Njeni elementi predstavljajo obiskanost polj sahovnice, in sicer tako, da z -1oznacujemo neobiskana polja, z 0 zacetno polje in z i, 0 < i ≤ n2 − 1 polje, ki jebilo obiskano na i-ti potezi.

Page 167: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.2. PROBLEM SKAKACEVEGA OBHODA 159

Naslednja podatkovna struktura, ki jo potrebujemo, je predstavitev moznih skaka-cevih potez. Kot najprimernejsa se izkaze uporaba dveh tabel, dx in dy velikosti 8, kipodajata odmik ciljnega polja od izvornega polja po x in y oseh (gl. tudi sliko 7.3):

00

1234567

1 2 3 4 5 6 7

Slika 7.4: Sahovnica velikosti 8×8in mozne poteze dame

i 0 1 2 3 4 5 6 7dx 1 2 2 1 -1 -2 -2 -1dy 2 1 -1 -2 -2 -1 1 2

Sedaj bomo vse splosne opise na sliki 7.2 na-domestili z elementi, ki se nanasajo na problemskakacevega obhoda. Prvi na vrsti je stavek iz-bira prvega koraka na seznamu moznih. Za ure-snicitev stavka je potrebno v proceduri poskusdeklarirati celostevilcno spremenljivko j, ki stejestevilo opravljenih poskusov, in ji na zacetku pri-rediti vrednost 0. Za realizacijo stavka korak do-pusten je najprej potrebno definirati pojem do-pustnosti. Korak je dopusten, ko ciljno polje

1. ni zunaj mej sahovnice in

2. se ni zasedeno.

Torej lahko ta stavek v primeru, ko sta koordinati izvornega polja podani z globalnimaspremenljivkama x in y, realiziramo kot

(x+dx [j ]≥0)&(x+dx [j ]<n)&(y+dy [j ]≥0)&(y+dy [j ]<n)&(a[x+dx [j ],y+dy [j ]]<0).

Stavek zapisi ga realiziramo preprosto kot,

x :=x+dx [j ] ; y :=y+dy [j ] ; a[x ,y ]:=i ,

ni se konec pa kot i < n2− 1. Za izid neuspesen potrebujemo globalno spremenljivkouspeh, ki ji na zacetku priredimo vrednost FALSE. V tem primeru se izid neuspesenprevede preprosto na ∼uspeh. sestop se prevede na zaporedje,

a[x ,y ]:=−1 ; x :=x−dx [j ] ; y :=y−dy [j ],

zapisi “izid uspesen” na uspeh := TRUE, stavek izid uspesen na uspeh in konec se-znama moznih korakov na j = 8.

Popoln program za skakacev obhod, ki smo ga pravkar razvili in ki vsebuje tudizacetna prirejanja ter izpis rezultata, je prikazan kot program 7.1.

Page 168: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

160 POGLAVJE 7. SESTOPANJE

Program 7.1: Skakacev obhod

1 MODULE Skakac;33 CONST4 n=8;5 x0=1;6 y0=1;88 VAR9 a: ARRAY n,n OF INTEGER;

10 dx ,dy : ARRAY 8 OF INTEGER;11 x ,y : INTEGER;12 uspeh: BOOLEAN ;1414 PROCEDURE Inita;15 VAR i ,j :INTEGER;17 BEGIN17 FOR i :=0 TO n−1 DO18 FOR j :=0 TO n−1 DO19 a[i ,j ]:=−121 END22 END22 END Inita;2424 PROCEDURE poskus(i : INTEGER);25 VAR j : INTEGER;26 BEGIN j :=0;28 REPEAT28 IF (x+dx [j ]>=0)&(x+dx [j ]<n)29 &(y+dy [j ]>=0)&(y+dy [j ]<n)30 &(a[x+dx [j ],y+dy [j ]]<0)32 THEN32 x :=x+dx [j ] ; y :=y+dy [j ] ; a[x ,y ]:=i ;33 IF i < n∗n−1 THEN34 poskus(i+1) ;35 IF ∼uspeh THEN36 a[x ,y ]:=−1 ; x :=x−dx [j ] ; y :=y−dy [j ]38 END38 ELSE uspeh:=TRUE40 END40 END;41 INC (j )42 UNTIL uspeh OR (j =8)43 END poskus ;45

se nadaljuje

Page 169: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.3. PROBLEM OSMIH DAM 161

Skakacev obhod (nadaljevanje)

45 PROCEDURE Izpis;47 BEGIN47 Out .String(“PROBLEM SKAKACEVEGA OBHODA”);48 Out .WrLn;49 Out .String(“Zacetna x−koordinata: ”);50 Out .Int(x0 );51 Out .String(“Zacetna y−koordinata: ”);52 Out .Int(y0 );53 Out .WrLn;54 IF ∼uspeh THEN Out .String(“Ni resitve”)56 ELSE56 FOR i :=7 STEP −1 TO 0 DO57 FOR j :=0 TO 7 DO58 Out .Int(a[i ,j ]);Out .String(“;”)59 END;60 Out .WrLn62 END63 END63 END Izpis;6566 BEGIN66 dx [0]:=1; dx [1]:=2; dx [2]:=2; dx [3]:=1;67 dx [4]:=−1; dx [5]:=−2; dx [6]:=−2; dx [7]:=−1;68 dy [6]:=1; dy [7]:=2; dy [0]:=2; dy [1]:=1;69 dy [2]:=−1; dy [3]:=−2; dy [4]:=−2; dy [5]:=−1;70 x :=x0 ; y :=y0 ; uspeh:=FALSE ; Inita;71 a[x ,y ]:=0;72 poskus(1);74 Izpis74 END Skakac.

Skakacev obhod (konec)

7.3 Problem osmih dam

Problem osmih dam se prav tako kot predhodni problem nanasa na podrocje saha,lahko pa ga uporabimo za to, da poudarimo nek pomemben vidik tehnike sestopanja.Kot smo ze omenili, je metoda sestopanja casovno potratna in pogosto se izkaze, daza doseganje prakticno uporabnih rezultatov razpolozljiv racunalnik komaj zadostuje.Zaradi tega je potrebno pri tej metodi biti se posebno pozoren na ucinkovitost operacij,ki se najpogosteje izvajajo, saj je od tega lahko odvisno, ali bomo dosegli prakticnouporaben rezultat.

Zopet imamo sahovnico velikosti n × n, na katero je sedaj potrebno postaviti nsahovskih dam tako, da nobena ne napada druge. Spomnimo se, da se v sahu dama

Page 170: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

162 POGLAVJE 7. SESTOPANJE

PROCEDURE dopustno(x ,y :INTEGER): BOOLEAN ;(∗ Preverjanje dopustnosti postavitve dame na polje (x ,y) ∗)VAR i : INTEGER;BEGIN(∗ Preverjamo le polja z absciso, i < x ∗)(∗ preizkus, ali je vrstica dopustna ∗)i :=0; WHILE (i < x ) & (a[i ,y ] = 0) DO INC (i) END;IF i < x THEN RETURN FALSE END;(∗ dopustnosti stolpca ni potrebno preverjati, ker damo vedno postavimov prazen stolpec ∗)

(∗ preizkus, ali je diagonala, ki se spusca od leve proti desni, dopustna ∗)i :=0; WHILE (i < x ) & (a[x−i−1,y+i+1] = 0) DO INC (i) END;IF i < x THEN RETURN FALSE END;(∗ preizkus, ali je diagonala, ki se dviga od leve proti desni, dopustna ∗)i :=0; WHILE (i < x ) & (a[x−i−1,y−i−1] = 0) DO INC (i) END;RETURN i = x

END dopustno;

Slika 7.5: Predikat dopustno pri problemu osmih dam in predstavitvi sahovnice stabelo (7.1)

premika, oziroma napada po vrsticah, stolpcih in dveh vrstah diagonal (gl. sliko 7.4).

Problem bomo zopet resevali s sestopanjem. V proceduri poskus na sliki 7.2 sesedaj parameter i nanasa na postavitev dame v i-ti stolpec. Torej bomo na prvemkoraku damo postavili v 1. stolpec, na drugem v 2. stolpec itn. do n-tega koraka.

Pri tem problemu je zanimiva izbira podatkovne strukture za sahovnico. Na pod-lagi izkusenj s problemom skakacevega obhoda bi bila prva misel ponovno uporabitipodatkovno strukturo (7.1). V takem primeru bi lahko prisotnost dame na polju 〈x, y〉oznacili z 1, nezasedenost polja pa z 0. Predikat dopustno(x, y) (ko je dama na poljuz absciso x in ordinato y) je pri tej predstavitvi prikazan na sliki 7.5. Izkaze pa se, dapredikat dopustno lahko mnogo ucinkoviteje realiziramo, ce uporabljamo podatkovnestrukture, ki neposredno vsebujejo informacijo o prostih vrsticah in diagonalah. Cev ta namen uporabljamo naslednje podatkovne strukture:

prVrst : ARRAY n OF BOOLEAN ; (∗ nezasedenost vrstic ∗)prDgRzlXY :ARRAY 2∗n−1 OF BOOLEAN ; (∗ nezasedenost diagonal s konstantnorazliko komponent; indeks diagonale je x− y + n− 1 ∗)

prDgVstXY :ARRAY 2∗n−1 OF BOOLEAN ; (∗ nezasedenost diagonal s konstantnovsoto komponent; indeks diagonale je x+ y ∗)

in jim priredimo vrednost vsakic, ko postavimo neko damo, porabi predikat dopustnomnogo manj casa:

Page 171: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.4. PROBLEM TRDNIH ZAKONOV 163

izbira prvegakoraka

j := 0

korak dopusten prVrst [j]& prDgRzlXY [i− j + n− 1]& prDgVstXY [i+ j]

zapisi ga polozajDame[i] := j;prVrst [j] := FALSE ;prDgRzlXY [i− j + n− 1] := FALSE ;prDgVstXY [i+ j] := FALSE ;

ni se konec i < nizid neuspesen ∼uspehsestop prVrst [j] := TRUE ;

prDgRzlXY [i− j + n− 1] := TRUE ;prDgVstXY [i+ j] := TRUE ;

zapisi“izid uspesen”

uspeh := TRUE

izbira naslednjegakoraka

INC (j)

konec seznamamoznih korakov

j = n

Slika 7.6: Zamenjave v vzorcu na sliki 7.2 pri problemu osmih dam

m

w

m′ w′

Slika 7.7: Zakon med m in w ni trden

PROCEDURE dopustno(x ,y);BEGINRETURN prVrst [y ] & prDgRzlXY [x−y+n−1] & prDgVstXY [x+y ]

END dopustno;

(x in y, koordinati dame, ki jo nameravamo postaviti na sahovnico, sta pravzapravenaki vrednostim spremenjlivk i in j v proceduri poskus).

Za konec obravnave problema osmih dam je na sliki 7.6 prikazana tabela zamenjavv vzorcu procedure poskus s slike 7.2, s katerimi ga priredimo za problem osmih dam.

Page 172: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

164 POGLAVJE 7. SESTOPANJE

7.4 Problem trdnih zakonov

Na koncu bomo opisali se en problem, ki ga resujemo s sestopanjem, pripada padruzini problemov, ki ima precejsen prakticen pomen. Gre za probleme prirejanja(angl. matching), katerih tipicen (ceprav ne dobesedno prakticno pomemben) pred-stavnik je problem trdnih zakonov: je n zensk in prav toliko moskih, ki imajo pred-stavnike nasprotnega spola razvrscene po naklonjenosti (do prve(ga) cuti najvecjonaklonjenost). Naloga je poiskati n “trdnih zakonov”, pri cemer je zakon med zenskow in moskim m netrden takrat, ko bodisi obstaja moski m′, ki je porocen z w′, in imaw raje kot svojo zeno w′, obenem pa ima tudi w raje m′ kot svojega moza m, ali paobstaja zenska w′′, ki je porocena z m′′, in ima raje m kot svojega moza m′′, obenempa ima tudi m raje w′′ kot svojo zeno w (gl. sliko 7.7).

7.1 Primer Ce so vrstni redi pripadnikov nasprotnega spola po naklonjenosti taki,kot jih kaze naslednja tabela:

NAKLONJENOSTZENSK DO MOSKIH

NAKLONJENOSTMOSKIH DO ZENSK

w1 1 2 3w2 2 3 1w3 3 2 1

m1 2 3 1m2 1 2 3m3 3 1 2

seznam zakonov〈w1,m3〉, 〈w2,m2〉, 〈w3,m1〉

ni trden, ker pri zakonu 〈w1,m3〉 obstaja moski m2, ki ima w1 raje kot svojo zenow2, obenem pa ima w1 raje m2 kot svojega moza m3. 2

Problem lahko ponovno resimo z ustreznimi zamenjavami v vzorcu na sliki 7.2.Zacetni podatki so podani z dvema tabelama, nklMpriZ in nklZpriM tako, da jenklMpriZ [i, j] indeks moskega, ki je na i-tem mestu na seznamu naklonjenosti zenskej (in z nasprotnima vlogama moskih in zensk pri drugi tabeli). Podobno kot pri pro-blemu osmih dam je kljuc do ucinkovite resitve izbira primernih podatkovnih struktur,ki zmanjsujejo obseg racunanja znotraj osnovne procedure poskus. Najprej se lotimoosnovne zgradbe problema. Resujemo ga tako, da izberemo bodisi zenske ali moske inpri vsakem klicu procedure poskus poskusamo porociti naslednjega pripadnika izbraneskupine z nekim predstavnikom nasprotnega spola. Prva (se ne dokoncna) razlicicaprocedure poskus je prikazana na sliki 7.8. V tej razlicici predstavlja i i-to zensko (ibi prav tako lahko predstavljal moskega), tabela logicnih vrednosti jeSamski pa vodievidenco o neporocenih moskih (v primeru, ko bi i predstavljalo moske, bi uporabljalitabelo jeSamska). Tabela moz rabi za izpis koncne resitve (moz[i] predstavlja mozazenske i). Predikat Trden pa je zaenkrat se nedolocen. Na podlagi prej zapisanedefinicije lahko zapisemo njegovo prvo razlicico v obliki, ki je prikazana na sliki 7.9.Ocitno je ucinkovitost procedure na sliki 7.9 odvisna od hitrosti racunanja predikatovm je porocen in ima raje i kot svojo zeno in z je porocena in ima raje j kot svojega

Page 173: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.4. PROBLEM TRDNIH ZAKONOV 165

izbira prvegakoraka

j := 0

korak dopusten jeSamski [j]& Trden(i, j)

zapisi ga jeSamski [j] := FALSE;moz [i] := j

ni se konec i < nizid neuspesen ∼uspehsestop jeSamski [j] := TRUE;zapisi“izid uspesen”

uspeh := TRUE

izbira naslednjegakoraka

INC (j)

konec seznamamoznih korakov

j = n

Slika 7.8: Zamenjave v vzorcu na sliki 7.2 za problem trdnih zakonov

PROCEDURE Trden(i ,j :INTEGER):BOOLEAN ;VAR x ,m,z :INTEGER;BEGIN x :=0;

m:=nklMpriZ [x ,i ];WHILE m # j DOIF m je porocen in ima raje i kot svojo zenoTHEN RETURN FALSE

END;INC (x ) ;m:=nklMpriZ [x ,i ]

END;x :=0;z :=nklZpriM [x ,j ];WHILE z # i DOIF z je porocena in ima raje j kot svojega mozaTHEN RETURN FALSE

END;INC (x ) ;z :=nklZpriM [x ,j ]

END ;RETURN TRUE

END Trden;

Slika 7.9: Preverjanje trdnosti zakona

Page 174: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

166 POGLAVJE 7. SESTOPANJE

moza. Ce uporabljamo tabeli idxZpriM [i, j] (indeks zenske i na seznamu moskega j)ter idxMpriZ [i, j] (indeks moskega i na seznamu zenske j), ki ju lahko izracunamopred prvim klicem procedure poskus, imata zapisana predikata vrednost

∼ jeSamski [m]&(idxZpriM [i,m] >idxZpriM [zena[m],m])

inz < i&(idxMpriZ [j, z] >idxMpriZ [moz [z], z])

7.5 Nacini za omejevanje pretiranega razrascanjaiskalnega drevesa

Omenili smo ze, da je sestopanje ponavadi casovno izredno potratno, zato je za dose-ganje prakticno uporabnih rezultatov potrebno poskrbeti za cim ucinkovitejso reali-zacjio posameznih operacij, oziroma za odpravljanje nepotrebnih. Na zacetku smo zeomenili, da si lahko predstavljamo delovanje procedure poskus z drevesno strukturo,ki predstavlja zgodovino njenih klicev. Ocitno lahko prihranimo cas, ce odkrijemomoznost za izpuscanje dolocenih poddreves med postopkom iskanja. Ceprav so takipostopki zelo odvisni od posameznega problema, bomo na tem mestu opisali nekajukrepov, ki imajo sirsi pomen.

Preurejanje iskalnih korakov. V kolikor iscemo neko posamezno resitev, je moznoznotraj procedure poskus izbiro korakov preurediti tako, da na zacetek zaporedja po-stavimo alternative, za katere je mozno utemeljiti, da z vecjo verjetnostjo pripeljejodo resitve. Takrat, ko so koraki, ki vodijo do resitve, neodvisni, je mozno preurejanjeuporabiti tudi na celotnem zaporedju korakov.

7.2 Primer Vzemimo za primer problem 0-1 nahrbtnika, ki ga spremenimo v toliko,da iscemo prvo resitev z vrednostjo, ki je vecja od V . Seveda je ta primer s prakticnegastalisca nezanimiv, ker zanj obstajajo ucinkovitejse metode od sestopanja, vendar jele primeren za ilustracijo pojmov, ki nas tu zanimajo. Problem resimo s prilagojenoobliko procedure poskus, ki je prikazana na sliki 7.10. Podatke o predmetih hranimov tabeli a z elementi, ki jim pripadata dve komponenti: .p predstavlja prostorninopredmeta, .v pa njegovo vrednost. Pri vsakem klicu procedure preverimo, ali smodosegli zeleno vrednost in v primeru, ko nismo, ter ko vseh predmetov se nismoporabili, kakor tudi, ko je prostor se na voljo, ponovno poklicemo poskus z naslednjovrednostjo parametra ter s spremenjenima kolicinama p in v.

Proceduro smo preizkusili na primeru, ki je prikazan na sliki 7.11. Enkrat smozaporedje predmetov uredili na podlagi narascajoce vrednosti indeksov, drugic pa

Page 175: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.5 OMEJEVANJE RAZRASCANJA ISKALNEGA DREVESA 167

PROCEDURE poskus(i :index ;VAR a:AObj ; (∗ predmeti ∗)

p, (∗ trenutna prostornina ∗)v , (∗ trenutna vrednost ∗)V , (∗ iskana vrednost ∗)P , (∗ prostorninska omejitev ∗) :INTEGER;

VAR set (∗ trenutna mnozica ∗):SET ) :BOOLEAN ;(∗ Iscemo prvo resitev z vrednostjo ≥ cilj ∗)BEGIN INC (stKlicev);IF v ≥ V THEN RETURN TRUEELSIF i>n THEN RETURN FALSEELSE(∗ najprej predmet i poskusamo vkljuciti ∗)IF p+a[i ].p<=P THEN

INCL(s,i);IF poskus(i+1,a,p+a[i ].p,v+a[i ].v ,V ,P ,s)THEN RETURN TRUE

ELSE EXCL(s,i)END

END ;(∗ . . . nato izkljuciti ∗)RETURN poskus(i+1,a,p,v ,V ,P ,s)

ENDEND poskus ;

Slika 7.10: Procedura poskus za spremenjeni problem 0-1 nahrbtnika

na podlagi padajoce vrednosti predmetov (in v primeru iste vrednosti na podlagipadajoce prostornine). Elementi tabele na sliki 7.11, ki se nanasajo na prvo urejenost,imajo znak ∗, tisti, ki se nanasajo na drugo urejenost, pa znak +. V tabeli je prihitrosti jasno razvidna rahla prednost druge urejenosti.

Glede na to, da postopek sestopanja isce primerno resitev problema s pregledovanjemneke drevesne strukture, lahko cas postopka skrajsamo, ce pred obiskom nekega pod-drevesa ugotovimo, ali je neobetavno in se v takem primeru obisku izognemo. Metodeza odkrivanje neobetavnih poddreves so mocno odvisne od posameznega problema,zato je tezko podati neka splosno veljavna navodila, vendar lahko nekatere znacilnostitega pristopa prikazemo na primeru skakacevega obhoda.

Na zacetku poglavja smo razvili popoln program za skakacev obhod (gl. program7.1). Program deluje tako, da sistematicno preizkusa vse mozne poteze skakaca,dokler ne obisce vseh polj sahovnice (ali pa dokler ne izcrpa vseh moznosti). Ceprogram dopolnimo tako, da isce resitve za vse mozne zacetne polozaje skakaca inza vse velikosti sahovnice do neke zgornje meje, dobimo pri vrednosti zgornje meje 6rezultat, ki je prikazan na sliki 7.12. Iz slike je razvidno, da najvecje stevilo klicevprocedure poskus (in z njim tudi cas) strmo narasca tako, da je za prakticno zanimiv

Page 176: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

168 POGLAVJE 7. SESTOPANJE

predmet st. 1 2 3 4 5 6 7 8 9 10vrednost 7 6 4 6 8 10 9 6 8 9prostornina 4 5 3 4 6 5 6 7 7 5

PORABA CASA PRI DVEH UREJENOSTIH ISKALNIH KORAKOV

N V P st.:1 2 3 4 5 6 7 8 9 10∗ + pripadnost iskani mnozici3 4 11 10 + + * *5 4 22 20 + + + + * * *7 5 33 30 + + + + + +* * * *8 6 44 40 + + + + +* +* +* * *9 8 55 50 +* + + + +* +* +* +* * *11 10 66 60 +* +* + +* +* +* +* +* +* +*

N : stevilo klicev procedure poskus;V : minimalna iskana vrednost nahrbtnika;P : prostorninska omejitev;+ se nanasa na urejenost 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;∗ pa na urejenost 6, 7, 10, 9, 5, 1, 8, 2, 4, 3

Slika 7.11: Rezultat delovanja procedure poskus na sliki 7.10

n 3 4 5 6m 0 0 13 36Nmax 15 2,223 1,829,421 5,224,517,158Nmin 1 1,501 40 2,253Navg 13 1,873 814,653 243,235,490

n, velikost sahovnicem, stevilo zacetnih polozajev, pri katerih obstajaresitevstevilo klicev procedure poskus pri nekem zacetnempolozaju:Nmax, najvecjeNmin, najmanjseNavg, povprecno

Slika 7.12: Podatki o delovanju programa za problem skakacevega obhoda pri velikostisahovnice med 3 in 6

Page 177: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.5 OMEJEVANJE RAZRASCANJA ISKALNEGA DREVESA 169

1 PROCEDURE poskus(i : INTEGER);2 VAR j : INTEGER; ch:CHAR;3 BEGIN INC (stKlicev); j :=0;4 REPEAT INC (j );5 IF stKlicev=preveri THEN stKlicev :=0; slpUl(n,slMeja) END;6 IF (x+dx [j−1]≤n)&(x+dx [j−1]≥1)7 &(y+dy [j−1]≤n)&(y+dy [j−1]≥1)8 &(a[x+dx [j−1]−1,y+dy [j−1]−1]<0)9 &(slMeja≥i−1)

10 THEN INC (x ,dx [j−1]); INC (y ,dy [j−1]); a[x−1,y−1]:=i ;11 IF i < n∗n−1 THEN poskus(i+1) ;12 IF ∼uspeh THEN13 a[x−1,y−1]:=−1; DEC (x ,dx [j−1]); DEC (y ,dy [j−1])15 END15 ELSE uspeh:=TRUE17 END18 END18 UNTIL uspeh OR (j =8);19 IF slMeja=i−1 THEN slMeja:=MAX (INTEGER) END20 END poskus ;

Slika 7.13: Procedura poskus, ki uporablja ugotavljanje slepih ulic

primer n = 8 ze zunaj dosega osebnega racunalnika (danes, leta 1997).

-1

11

1721

35

47

23

42

37

Slika 7.14: Skakacev obhod:sestopimo lahko vsaj do po-teze 47

Odkrivanje neobetavnih poddreves. Odkriva-nja neobetavnih poddreves se lotimo tako, da raz-mislimo, kdaj v neki smeri ni mozno napredovati doresitve. En primer nastopi takrat, ko obstaja neza-sedeno polje, iz katerega ni mozno priti s skakacemdo drugega nezasedenega polja, razen ko je v doseguskakaca neko polje, ki ima oznako n2−2, kar pomeni,da je opazovano nezasedeno polje cilj zadnje poteze.V kolikor na ta nacin ugotovimo, da je trenutna smernapredovanja neobetavna, lahko resitev podremo (se-stopimo) vsaj do poteze z indeksom, ki je enak najvisjioznaki nekega polja v dosegu skakaca iz opazovanegapolja (gl. sliko 7.14). Ce opisano analizo opravimo zavsa nezasedena polja, lahko trenutno resitev podremo do minimalnega indeksa, ki gadobimo s tem izracunom.

Procedura poskus, ki je sestavljena po tem receptu, je prikazana na sliki 7.13.Deluje tako, da na vsak preveri klic poklice proceduro za ugotavljanje “slepe ulice”(poddrevo je neobetavno). Ce je postopek v slepi ulici v opisanem pomenu, priredimospremenljivki slMeja vrednost indeksa poteze, do katere je mozno trenutno resitev

Page 178: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

170 POGLAVJE 7. SESTOPANJE

1 PROCEDURE slpUl(n:INTEGER;VAR mm:INTEGER) ;2 VAR h,i ,j ,k ,m:INTEGER;3 BEGIN mm:=MAX (INTEGER);4 FOR i :=1 TO n DO5 FOR j :=1 TO n DO6 IF a[i−1,j−1]=−1 THEN h:=0; m:=−1;7 FOR k :=1 TO 8 DO8 IF (i+dx [k−1]≥1)&(i+dx [k−1]≤n)9 &(j +dy [k−1]≥1)&(j +dy [k−1]≤n)

11 THEN11 IF a[i+dx [k−1]−1,j +dy [k−1]−1]=−1 THEN INC (h)12 ELSIF a[i+dx [k−1]−1,j +dy [k−1]−1]>m THEN13 m:=a[i+dx [k−1]−1,j +dy [k−1]−1]15 END16 END17 END17 END;18 IF (h=0)&(m # n∗n−2)&(mm > m) THEN mm:=m END20 END21 END22 END23 END23 END slpUl ;

Slika 7.15: Procedura za ugotavljanje slepih ulic

n 3 4 5 6Nmax 15 2,223 1,815,772 2,815,100,202Nmin 1 1,501 40 2,253Navg 13 1,873 797,527 131,451,996NB 0 0 123 217,674

n, velikost sahovnicem, stevilo zacetnih polozajev, pri katerih obstajaresitevstevilo klicev procedure poskus pri nekem zacetnempolozaju:Nmax, najvecjeNmin, najmanjseNavg, povprecnoNB , najvecje stevilo ugotovljenih slepih ulic

Slika 7.16: Rezultati poskusa z resevanjem skakacevega obhoda z ugotavljanjem slepihulic. Vrednost konstante preveri je 50,000

Page 179: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.5 OMEJEVANJE RAZRASCANJA ISKALNEGA DREVESA 171

podreti. Na zacetku je vrednost slMeja enaka MAX(INTEGER). To ima za posledico,da se zaradi vrstice 9 na sliki 7.13 iskanje v globino ustavi in se opravi sestop do potezeslMeja. Ko algoritem sestopi do poteze slMeja, se v vrstici 19 vrednost slMeja vrnena MAX(INTEGER) in se postopek nadaljuje normalno. Procedura slpUl, ki odkrivaslepe ulice, je prikazana na sliki 7.15.

Kot se vidi iz primerjave tabel na slikah 7.12 in 7.16, rezultat, ki smo ga dosegli, nizanemarljiv, vendar vseh moznosti se nismo izcrpali! Ce nam je cilj poiskati eno samoresitev in ce so resitve med vsemi primeri razmeroma “gosto posejane”, lahko z za-nemarjanjem nekaterih resitev hitrost postopka znatno izboljsamo. Do zanemarjanjapride, ce proceduro slpUl sestavimo tako, da je nekoliko “prestroga” pri ocenjeva-nju poddreves in nekatera poddrevesa, ki vsebujejo resitve, kljub temu razglasi zaslepe ulice. V primeru, ko je taksnih napacno ocenjenih poddreves razmeroma malo,njihova velikost (in s tem prihranek na hitrosti) pa velika, se to izplaca.

-1

11

17

35

47

23

42

3748

Slika 7.17: Skakacev obhod:sestopimo lahko vsaj do po-teze 48

Opisano idejo bomo realizirali tako, da bomo raz-glasili za slepe ulice ne le polozaje, ki vsebujejo ne-zasedena polja z nic sosednjimi nezasedenimi polji,temvec tudi polozaje, ki vsebujejo nezasedena poljas samo enim nezasedenim sosedom. Na ta nacin si-cer lahko napravimo napako, kajti mozno je, da vkoncni resitvi do opazovanega polja pridemo z zadnjopotezo, do sosednjega (trenutno nezasedenega) poljapa s predzadnjo, vendar je verjetnost tega majhna ince do tega pojava pride, se zanasamo na eksistencodrugih resitev, pri katerih se s tem ne srecujemo. To-rej bomo sedaj v proceduri slpUl zamenjali vrstico 18z

IF (h=0)&(m#n∗n−2) THENIF mm > m THEN mm:=m END

ELSIF h=1 THENIF mm > m+1 THEN mm:=m+1 END

END

(7.2)

Pri stevilu nezasedenih sosedov h = 1 razmisljamo takole: iscemo resitev, ki zagotavljaobisk opazovanega polja in nato nadaljevanje do nezasedenega polja. Ce preklicemokorake, oziroma sestopimo do koraka z indeksom, ki je za ena vecji od najvecjegaindeksa nekega soseda opazovanega polja, pospesimo na ta nacin preizkus alternative,ki jo predstavlja poteza od najvecjega sosednjega indeksa do opazovanega polja (gl.sliko 7.17). Torej je to vrednost, ki jo priredimo spremenljivki mm (v klicu procedureslpUl je to spremenljivka slMeja).

Zapisali smo, da pri iskanju skakacevega obhoda z uporabo strozjega ugotavljanjaslepih ulic lahko pride do zanemarjanja dolocenih resitev. Zaradi tega algoritma brezugotavljanja slepih ulic (program 7.1) ter z natancnim ugotavljanjem slepih ulic (slika7.13) v splosnem poisceta drugacno resitev od algoritma s strozjim ugotavljanjem sle-pih ulic (slika 7.13 s spremembo (7.2)). Na primer, pri n = 6 in zacetnih koordinatah

Page 180: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

172 POGLAVJE 7. SESTOPANJE

n 3 4 5 6Nmax 15 2,223 1,782,486 1,687,607Nmin 1 1,501 40 2,253Navg 13 1,873 706,281 492,011NB 0 0 229 238

n, velikost sahovnicem, stevilo zacetnih polozajev, pri katerih obstajaresitevstevilo klicev procedure poskus pri nekem zacetnempolozaju:Nmax, najvecjeNmin, najmanjseNavg, povprecnoNB , najvecje stevilo ugotovljenih slepih ulic

Slika 7.18: Rezultati poskusa z resevanjem skakacevega obhoda s strozjim preverja-njem slepih ulic. Vrednost konstante preveri je 50,000

35 30 21 18 3 2822 17 2 29 8 1931 34 23 20 27 416 1 32 7 12 933 24 11 14 5 260 15 6 25 10 13

3 16 5 8 27 146 35 2 15 22 9

17 4 7 26 13 2834 1 32 21 10 2331 18 25 12 29 200 33 30 19 24 11

Slika 7.19: Dve razlicni resitvi istega problema skakacevega obhoda

〈0, 0〉 poisceta prva dva algoritma levo resitev na sliki 7.19, medtem ko tretji algoritemresitvi najde desno resitev.

Algoritmi z razvejitvijo in omejitvijo1. Ta tehnika je primerna, ko s sestopa-njem iscemo optimalno mnozico na podlagi neke numericne kolicine (torej najvecjo alinajmanjso vrednost kolicine) in imamo pred vsakim klicem procedure poskus moznostizracunati neko zgornjo mejo za iskano kolicino po korakih, ki jih se nismo opravili.V kolikor je tako izracunana zgornja meja manjsa od najvecje vrednosti, ki smo jo zedosegli, lahko nacrtovani klic procedure poskus opustimo.

7.3 Primer Kot primer bomo ponovno obravnavali 0-1 nahrbtnik, ki ga bomo resevalis sestopanjem, ceprav za to obstaja ucinkovitejsa metoda, ki smo jo razvili v poglavju6. Problem bomo resevali na dva nacina: prvic brez upostevanja omejitve za najvecjo

1Anglesko: Branch and bound algorithms

Page 181: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.6. POVZETEK OSNOVNIH POJMOV 173

PROCEDURE poskus(i :index ;VAR a: AObj ;

p, (∗ trenutna prostornina ∗)v , (∗ trenutna vrednost ∗)P , (∗ prostorninska omejitev ∗)zgM (∗ zgornja meja dodane vrednosti v bodocih korakih ∗) :INTEGER);

VAR s, (∗ trenutna mnozica predmetov ∗)S , (∗ optimalna mnozica predmetov ∗): SET ;

VAR V (∗ optimalna vrednost ∗) :INTEGER;BEGIN

INC (stKlicev);(∗ i poskusamo vkljuciti v mnozico s ∗)IF p+a[i ].p <= P THEN INCL(s,i);IF (i < n) & (V<v+zgM ) THEN

poskus(i+1,a,p+a[i ].p,v+a[i ].v ,P ,zgM−a[i ].v ,s,S ,V )ELSIF v > V THEN V :=v ; S :=sEND; EXCL(s,i)

END;(∗ . . . nato izkljuciti ∗)IF (i < n) & (V<v+zgM−a[i ].v) THEN

poskus(i+1,a,p,v ,P ,zgM−a[i ].v ,s,S ,V )ELSIF v > V THEN V :=v ; S :=sEND

END poskus ;

Slika 7.20: Resitev 0-1 nahrbtnika s sestopanjem

dosegljivo vrednost in drugic z njenim upostevanjem. Prvi program prepuscamobralcu za vajo, procedura poskus za drugega pa je prikazanana sliki 7.20. Proce-dura je seveda v glavnih obrisih podobna proceduri poskus na sliki 7.10: a vsebujepodatke o predmetih, p in v sta po vrsti, trenutni prostornina ter vrednost, P pa jeprostorninska omejitev. zgM je preprosto vsota vrednosti vseh predmetov z inde-ksi i . . . n, ki je ocitno zgornja meja za dodano vrednost v korakih od trenutnega dokonca. s je trenutno izbrana mnozica predmetov, S je najboljsa mnozica do danegatrenutka, medtem ko je V optimalna vrednost nahrbtnika.

Rezultati poskusa so prikazani na sliki 7.21

7.6 Povzetek osnovnih pojmov

1. Metoda sestopanja in iskalno drevo

2. Osnovna oblika procedure poskus

3. Prirejanje procedure poskus resevanju problema skakacevega obhoda

4. Prirejanje procedure poskus resevanju problema osmih dam

Page 182: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

174 POGLAVJE 7. SESTOPANJE

predmet st. 1 2 3 4 5 6 7 8 9 10vrednost 7 6 4 6 8 10 9 6 8 9prostornina 4 5 3 4 6 5 6 7 7 5

PRIMERJAVA PORABE CASA ZA 0-1 NAHRBTNIK BREZIN Z UPORABO ZGORNJE MEJE ZA DOSEGLJIVO VRE-DNOST NAHRBTNIKA

N P st.:1 2 3 4 5 6 7 8 9 101 2 pripadnost optimalni mnozici

138 129 10 * *532 379 20 * * * *899 328 30 * * * * * *1015 123 40 * * * * * * * *1023 48 50 * * * * * * * * *1023 48 60 * * * * * * * * * *

N : stevilo klicev procedure poskus;1: uporaba procedure brez upostevanja zgornje meje;2: z upostevanjem zgornje meje;P : prostorninska omejitev.

Slika 7.21: Rezultat delovanja procedure poskus na sliki 7.20

5. Prirejanje procedure poskus resevanju problema trdnih zakonov

6. Nacini za omejevanje rasti iskalnega drevesa:

(a) s spremembo vrstnega reda poskusov in

(b) z ocenjevanjem obetavnosti poddreves

7. Algoritmi z razvejitvijo in omejitvijo.

7.7 Naloge

1. Spremenite programa za problema skakacevega obhoda in osmih dam tako, dase izpisejo vse resitve.

2. Problem skakacevega obhoda je soroden tim. problemu Hamiltonovega cikla:podan je usmerjen graf G = 〈V,E〉, pri cemer je V = v1, v2, . . . , vn mnozicavozlisc, E pa mnozica povezav in je potrebno najti tako permutacijo zaporedjavozlisc, vi1 , vi2 , . . . , vin , da sta vij in vij+1

pri 1 ≤ j ≤ n − 1 povezana in prav

tako vin ter vi1 . Ce je podan primer problema skakacevega obhoda (z vrednostjon in zacetnim poljem skakaca), definirajte graf, ki ima Hamiltonov cikel natankotedaj, ko obstaja resitev problema skakacevega obhoda.

Page 183: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

7.7. NALOGE 175

3. V poglavju o maksimalnem pretoku in linearnem programiranju smo opisalialgoritem za iskanje maksimalnega pretoka skozi omrezje od izvora do ponora(algoritem 5.3). Osnovni korak algoritma je iskanje nezasicene poti od izvorado ponora. Uresnicite ta postopek s sestopanjem.

4. Spremenite program 7.1 po navodilih iz odstavka “Odkrivanje neobetavnih pod-dreves” in poskusajte ponoviti rezultate na slikah 7.12, 7.16 in 7.18.

Page 184: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

176 POGLAVJE 7. SESTOPANJE

Page 185: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 8

ISKANJE PO ZNAKOVNIHZAPOREDJIH

V tem poglavju gre podobno kot pri urejanju za enega izmed najbolj mnozicno upo-rabljenih algoritmov (ali druzin algoritmov). Problem opisemo takole: podani sta dveznakovni zaporedji, T [1 . . . n] in P [1 . . .m] in je potrebno poiskati vsa mesta, kjer sezaporedje P pojavlja kot podzaporedje v T . Z drugimi besedami, zanima nas, aliobstaja k > 0 in zaporedje indeksov si, pri i = 1, . . . , k, tako da je T [si + j] = P [j]pri j = 1, . . . ,m. Vcasih nas zanima le s1.

Najprej bomo predstavili terminologijo. Σ∗ oznacuje mnozico vseh znakovnihzaporedij koncne dolzine, ki vsebujejo znake neke izbrane abecede Σ. Med taka zapo-redja uvrscamo tudi zaporedje nicelne dolzine (prazno zaporedje), ki ga oznacujemoz ε. Dolzino zaporedja x oznacujemo z |x|. Stik zaporedij x in y (x podaljsano z y)oznacujemo z xy. Ce je u zacetek zaporedja x (x = uy pri nekem y ∈ Σ∗), zapisemoto kot u < x, ce pa u predstavlja konec zaporedja x (x = yu pri nekem y ∈ Σ∗),zapisemo to kot u = x. Bodimo pozorni, da za poljubno zaporedje x velja ε < x inobenem ε = x.

8.1 Navadni algoritem za iskanje po znakovnih za-poredjih

Podobno kot pri urejanju izhajamo iz nekega zacetnega, “navadnega” algoritma, kiga bomo nato izboljsali na dva nacina. Navadni algoritem za iskanje po znakovnihzaporedjih je prikazan na sliki 8.1, deluje pa tako, da pri vsakem odmiku s preverienakost P [1 . . .m] = T [s + 1 . . . s + m] in v primeru enakosti izpise resultat. Ceprivzamemo, da je pricakovani cas operacije P [1 . . .m] = T [s + 1 . . . s + m] enakΘ(m) (gl. nalogo 1), se ni tezko prepricati, da je poraba casa algoritma 8.1 enakaΘ((n−m+ 1) ·m). V nadaljnjih razdelkih bomo pravkar zapisani rezultat izboljsali.

177

Page 186: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

178 POGLAVJE 8. ISKANJE PO ZNAKOVNIH ZAPOREDJIH

Vhod Znakovni zaporedji T [1 . . . n] in P [1 . . .m]

Izhod Seznam odmikov s, pri katerih se P pojavljav T .

Postopekn:=|T |; m:=|P |; s := 0;WHILE s ≤ n−m DO

j := 1 ;WHILE (j ≤ m) & (P [j ] = T [s + j ]) DO

INC (j )END ;IF j > m THEN

“P se pojavlja v T z odmikom s”END;INC (s)

END

Slika 8.1: Navadni algoritem za iskanje po znakovnih zaporedjih.

T : b a c b a b a b a b a c b a b6=

P : a b a b a b a b

Slika 8.2: Primer iskanja podzaporedja v zaporedju.

8.2 Knuth-Morris-Prattov algoritem

Najprej se bomo seznanili z algoritmom, ki v povprecju porabi cas Θ(n + m), kotuvod pa bo rabil primer na sliki 8.2. Denimo, da uporabljamo algoritem na sliki 8.1in preizkusamo odmik s = 4. Pri tem smo odkrili neenakost znakov na nakazanemmestu. Postavlja se vprasanje, kateri je naslednji mozni kandidat za odmik? Vrednosts+ 1 zagotovo ne pride v postev. Se vec: to, da ne pride v postev, je mozno ugotoviti

s s′︸ ︷︷ ︸

︷ ︸︸ ︷k

k′

Slika 8.3: Iskanje kandidata s′ za naslednji odmik.

Page 187: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

8.2. KNUTH-MORRIS-PRATTOV ALGORITEM 179

s s′ s′′︸ ︷︷ ︸

︷ ︸︸ ︷︷ ︸︸ ︷k

k′

k′′

Slika 8.4: Trije zaporedni kandidati za naslednji odmik.

z analizo zaporedja P , ker prvi znak P ni enak drugemu znaku. V nasem primerulahko kvecjemu upamo na uspeh pri novem odmiku s + 2 (ki pa se tudi izkaze zaneprimernega). V splosnem denimo, da smo ugotovili, da velja P [1 . . . k] = T [s +1 . . . s + k] in P [k + 1] 6= T [s + k + 1]. s + k + 1 naj bo tekoci indeks, k pa dolzinavzorca P , na kateri smo ugotovili enakost med vzorcem in osnovnim zaporedjem.Zanima nas naslednji kandidat za odmik. To je najmanjsa vrednost s′ > s, pri katerivelja P [1 . . . k′] = T [s′ + 1 . . . s′ + k′] in s + k = s′ + k′ (gl. sl. 8.3). V skrajnemprimeru se izkaze, da je s′ = s + k in k′ = 0. Ta primer je seveda najugodnejsi sstalisca porabe casa, ker pri iskanju zagotavlja najvecji pomik naprej. Ocitno veljaP [1 . . . k′] = P [1 . . . k], torej iscemo najdaljsi zacetek zaporedja P [1 . . . k] (dolzine < k),ki je obenem konec istega zaporedja. Namrec, v kolikor je pri novem odmiku k′ > 0,mora biti zacetek zamaknjenega zaporedja P enak koncu zaporedja T [s+ 1 . . . s+ k],oziroma P [1 . . . k]. (Potrebno je izbrati najdaljsi zacetek, ki je obenem konec, kernam taka izbira zagotavlja prvi naslednji odmik s′.)

Tisto, kar je pomembno pri postopku iskanja, je, da je velikost naslednjega moznegaodmika odvisna le od podzaporedja P in jo je potemtakem mozno izracunati predzacetkom postopka iskanja z nekaksnim “predprocesiranjem”. Odmik je odvisen od“preskakovalne funkcije” π, ki jo na podlagi pravkar povedanega definiramo kot

π[q] = maxk | k < q&P [1 . . . k] = P [1 . . . q]. (8.1)

V tem primeru q predstavlja poljuben polozaj znotraj podzaporedja P , do koder smougotovili enakost med P in zaporedjem T , medtem ko se je pri indeksu q+ 1 pojavilaneenakost. Razlika med trenutnim odmikom P in naslednjim moznim odmikom jetedaj q − π[q]. Na primer potem ko smo pri odmiku s = 4 na sliki 8.2 ugotovilineenakost pri indeksu q + 1 = 8, je naslednji mozen odmik dva znaka naprej, ker jeπ[7] = 5.

Sedaj se bomo lotili naloge sestavljanja algoritma za izracun π[q]. Izpeljali bomorekurzivno relacijo za π[q], ki jo bomo neposredno prevedli v algoritem. π[q] je najvecjielement v mnozici

U [q] = k | k < q & P [1 . . . k] = P [1 . . . q], (8.2)

Page 188: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

180 POGLAVJE 8. ISKANJE PO ZNAKOVNIH ZAPOREDJIH

Vhod Znakovno zaporedje P [1 . . .m]

Izhod Vrednosti preskakovalne funkcijeπ[1], π[2], . . . , π[m].

Postopekm:=|P | ;π[1]:=0 ;k :=0 ;FOR q:=2 TO m DO

(∗ zacetna vrednost k je π[q − 1];zanka, ki sledi, pregleduje elementeU [q − 1] po padajoci vrednosti in sezakljuci, ko je izpolnjen pogoj (8.4) ∗)

WHILE (k > 0) & (P [k+1] # P [q]) DOk :=π[k]

END ;IF P [k+1] = P [q] THEN INC (k) END;π[q]:=k

END

Slika 8.5: Izracun preskakovalne funkcije π.

torej π[q] = maxU [q]. Vsem mnozicam U [q] bomo dodali se element 0, ki je dolzinapraznega zaporedja. Na primer v primeru na sliki 8.2 je mnozica U [7] = 0, 1, 3, 5.Ce elemente U [q] uredimo po padajoci vrednosti, U [q]1, U [q]2, . . ., lahko ugotovimona podlagi slike 8.4, da velja

U [q]j+1 = π[U [q]j ]. (8.3)

Z besedami: naslednji element v U [q] dobimo tako, da uporabimo funkcijo π natrenutnem elementu U [q]. Ugotovimo lahko, da je element 0 edini element mnoziceU [1].

Kaksna pa je zveza med U [q] in U [q − 1]? Ocitno velja

U [q] = k | k − 1 ∈ U [q − 1], P [k] = P [q]. (8.4)

Z besedami: element U [q] je dolzina j nekega zacetka P , cigar zadnji znak je enakP [q], zacetek do tega znaka pa ima dolzino, ki je element U [q − 1].

Algoritem za izracun preskakovalne funkcije je prikazan na sl. 8.5. Po zacetnemprirejanju vrednosti π[1] algoritem vstopi v zanko, ki racuna π[q]. Notranja zankapregleduje elemente U [q] in preverja pogoj P [k + 1] = P [q]. V primeru enakosti seznotraj pogojnega stavka, pred koncem zunanje zanke, vrednost k poveca.

Zanimiv je tudi nacin izracuna casa, ki ga porabi algoritem na sliki 8.5. Iz ana-lize zunanje zanke FOR na sliki ugotovimo, da stavka zunaj notranje zanke WHILEporabita konstanten cas; torej je osnovni problem ugotoviti, kolikokrat se ponovi je-dro notranje zanke. Pri vsakem njegovem izvajanju se vrednost k zmanjsa, ker velja

Page 189: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

8.3. BOYER IN MOOREOV ALGORITEM 181

Vhod Znakovni zaporedji P [1 . . .m] in T [1 . . . n].

Izhod Seznam odmikov, s katerimi se P pojavljaznotraj T .

Postopekn:=|T | ;m:=|P | ;izracun π ;q:=0FOR i :=1 TO n DO

WHILE (q > 0) & (P [q+1] # T [i ]) DOq:=π[q]

END ;IF P [q+1] = T [i ] THEN INC (q) END;IF q = m THEN

“P se pojavlja z odmikom i−m”q:=π[q]

ENDEND

Slika 8.6: KMP algoritem.

π(k) < k. Torej je stevilo ponavljanj jedra notranje zanke odvisno od vsote prirast-kov vrednosti k. In ker se k med celotnim delovanjem algoritma lahko poveca najvecm − 1 krat, se tudi jedro notranje zanke med celotnim delovanjem algoritma ponovinajvec m−1 krat. Torej je cas, ki ga porabi algoritem na sl. 8.5 O(m). Zelo podobnaanaliza velja za algoritem iskanja podzaporedja P v T na sl. 8.6, tako da je skupnaporaba obeh algoritmov O(m + n). Pri opisani analizi si lahko predstavljamo, kotda pogojni stavek znotraj zanke FOR v algoritmu na sliki 8.1 ustvarja nek “kapital”(vrednost k), ki ga lahko zanka WHILE porabi in torej, ce nas zanima, koliko kapi-tala porabi WHILE, je to mozno izracunati tako, da ugotovimo, kolikokrat se izvajapogojni stavek znotraj zanke FOR.

8.3 Boyer in Mooreov algoritem

Drugi algoritem, ki ga bomo opisali, uporablja za pospesevanje iskanja dvoje hevri-sticnih pravil in je posebno primeren, kadar je vzorec P razmeroma dolg in abeceda Σrazmeroma velika. V takem primeru se pogosto izkaze, da je ta algoritem najhitrejsi.

Algoritem je prikazan na sliki 8.7 in pri njem predvsem opazimo precejsno podob-nost z navadnim algoritmom na sliki 8.1. Ce odstranimo vrstici 2 in 3 ter zamenjamo9–11 z

INC (s)END,

Page 190: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

182 POGLAVJE 8. ISKANJE PO ZNAKOVNIH ZAPOREDJIH

1 n := |T | ; m := |P | ; s := 0 ;2 λ := Zadnji indeks znaka(P ,m,Σ) ;3 γ := Zadnji indeks konca podzaporedja(P ,m) ;4 WHILE s ≤ n − m DO5 j := m ;6 WHILE (j > 0) & (P [j ] = T [s + j ]) DO DEC (j ) END ;7 IF j = 0 THEN8 “Vzorec se pojavlja z odmikom s”9 INC (s,γ[0])

10 ELSE INC (s,MAX (γ[j ],j−λ[T [s+j ]]))12 END13 END

Slika 8.7: Boyer in Mooreov algoritem

T : t n a v a d e n s t e r e6=

P : a p r o s t o s t(a) Prva neenaka znaka (od zadaj) v besedilu in vzorcu sta presledek in o

T : t n a v a d e n s t e r e6=

P : a p r o s t o s t(b) Hevristicno pravilo “slabih znakov” predlaga pomik naprej za 6 mest

T : t n a v a d e n s t e r e6=

P : a p r o s t o s t(c) Hevristicno pravilo “dobrih koncev podzaporedij” predlaga pomik naprej za 3 mest

Slika 8.8: Iskanje vzorca a prostost v besedilu t navaden stere z Boyer in Mooreovimalgoritmom

dobimo enak algoritem le, da se preizkus enakosti izvaja od zadaj. Ocitno sta funkcijiλ in γ bistveni za delovanje algoritma, zato se bomo lotili njune razlage. Prva realizirahevristicno pravilo “slabih znakov”, druga pa pravilo “dobrih koncev podzaporedij”.Obe pravili sta zasnovani “varno” v pomenu, da Boyer in Mooreov algoritem nikoline spregleda kakega moznega odmika vzorca v zaporedju, ki ga preiskujemo. Bistvoalgoritma je, da v primeru neuspele primerjave med vzorcem in besedilom pride do po-mika vzorca naprej. Ker pa vcasih algoritem realizira pomik, ki v danih okoliscinah nioptimalen, pravimo, da sta pravili, na podlagi katerih se racuna pomik, “hevristicni”.

Delovanje algoritma na konkretnem primeru je prikazano na sliki 8.8. V vsakempolozaju primerjamo vzorec z ustreznim kosom zaporedja od desnega konca vzorcaproti zacetku in se ustavimo na prvem mestu, kjer ugotovimo neenakost znakov ali palevo od zacetka vzorca v primeru enakosti [gl. sliko 8.8(a)]. Nato vsako od omenjenih

Page 191: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

8.3. BOYER IN MOOREOV ALGORITEM 183

jk

(a) Primer j ≤ m− k

(b) Primer j > m− k

mm− k

m− k mjk

pomik

pomik

Slika 8.9: Delovanje pravila “dobrih koncev podzaporedij”

FOR a ∈ Σ DO λ[a] := 0 END ;FOR j := 1 TO m DOλ[P [j ]] := j

END ;RETURN λ(P ,m,Σ)

Slika 8.10: Izracun funkcije λ (zadnji indeks nekega znaka v vzorcu P )

pravil predlaga neko vrednost za dolzino pomika vzorca naprej, izbere pa se vecja.Na primer, pravilo “slabih znakov” na sliki 8.8(b) predlaga pomik naprej za 6 mest,oziroma za razdaljo do prvega znaka, ki je enak “slabemu znaku” v besedilu, ki gapreiskujemo. To pravilo pravzaprav realiziramo v nekoliko spremenjeni obliki, kiprispeva k ucinkovitosti: predlog za pomik naprej je j − λ(T [j]), ce je j mesto, kjersmo ugotovili neenakost, vrednost funkcije λ(a) pa je enaka zadnjemu indeksu znakaa v vzorcu P . Na ta nacin se lahko zgodi, da pravilo predlaga negativen pomik naprej(v primeru, ko velja λ(T [j]) > j). Vendar, ker drugo pravilo vedno predlaga pozitivenpomik, je dejanski pomik pozitiven. Pravilo “dobrih koncev podzaporedij” predlagapomik naprej za dolzino, ki zagotavlja, da so vsi znaki “dobrega konca podzaporedja”P [j + 1], . . . , P [m] enaki istoleznim znakom zamaknjenega vzorca. To pa je,

najmanjsa vrednost m−k, kjer je k dolzina nekega zacetka Pk, takoda je bodisi j ≤ m − k in velja Pk = P [j + 1], . . . , P [m] ali paj > m− k in velja P [j + 1], . . . , P [m] = Pk;

(8.5)

(gl. sliko 8.9, v obeh primerih sta enaka dela vzorca zasencena). V konkretnem pri-meru na sliki 8.8(c) je predlog za pomik naprej 3, na podlagi zapisanega pa je dejanskipomik MAX(6, 3) = 6.

Sedaj se najprej lotimo izracuna funkcije λ. Algoritem je prikazan na sliki 8.10 inne potrebuje dodatnih pojasnil.

Page 192: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

184 POGLAVJE 8. ISKANJE PO ZNAKOVNIH ZAPOREDJIH

m− k

k

k

P :

PR :

(a) k je konec najdaljsega zacetka P , ki se konca enako kot P

(b) Zrcalna slika P

m

mm− kl = m− j +m− km− j = πR(l)

j

Slika 8.11: Izracun γ(j) v primeru j > m− k

1 π := Preskakovalna funkcija(P ,m) ;2 P ′ := PR ; (∗ Zrcalna slika P ∗)3 πR := Preskakovalna funkcija(P ′,m) ;4 FOR j := 0 TO m DO5 γ[j ] := m − π[m]6 END ;7 FOR l := 1 TO m DO8 j := m − πR[l ] ;9 IF γ[j ] > l − πR[l ] THEN

10 γ[j ] := l − πR[l ]12 END12 END ;13 RETURN γ(P ,m)

Slika 8.12: Izracun funkcije γ (zadnji indeks konca podzaporedja)

Page 193: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

8.4. POVZETEK OSNOVNIH POJMOV 185

Algoritem za izracun funkcije γ pa zahteva nekoliko vec truda. Ce je j indeks, kjersmo ugotovili neenakost, je γ(j) definirano s pravilom (8.5). Kadar je j ≤ m − k, jeocitno k = π(m), kjer je π preskakovalna funkcija, ki jo poznamo iz algoritma KMP[gl. (8.1) in sliko 8.9(a)]. Za primer j > m− k pa podaja obrazlozitev izracuna γ(j)slika 8.11: ce vzorec P zrcalimo, ugotovimo, da velja m− j = πR(l), pri cemer je πR

preskakovalna funkcija zrcaljenega vzorca, za l pa velja l = m−j+m−k = 2m−j−k.Algoritem za γ(j) je prikazan na sliki 8.12. Glede na to, da vnaprej ne vemo, alipri nekem j velja primer (a) oziroma (b) na sliki 8.9, izracunamo obe vrednosti inizberemo manjso. Prva vrednost se racuna v vrsticah 4–6, druga pa v 7–12. Pridrugem izracunu pa prav tako vnaprej ne poznamo vrednosti l, ki ustreza nekemuindeksu j. Zato sprozimo izracun pri vseh vrednostih l v intervalu [1,m], pri vsakivrednosti izracunamo πR(l), nato iz slednje vrednosti dobimo j in na podlagi tegamorebiti popravimo vrednost γ(j).

Kot zadnjo pripombo, ki se nanasa na algoritem KMP ter Boyer in Mooreov algo-ritem, lahko zapisemo, da v primerjavi s svojo majhno velikostjo zahtevajo razmeromaveliko miselnega napora za to, da jih razumemo.

8.4 Povzetek osnovnih pojmov

1. Navadni algoritem in ocena njegove porabe casa

2. Algoritem Knutha, Morrisa in Pratta. Preskakovalna funkcija in njen izracun. Ocenaporabe casa

3. Boyer in Mooreov algoritem. Hevristicna pravila za isracun naslednjega odmika. Ute-meljitev pravilnosti algoritma. Opis funkcij λ in γ.

8.5 Naloge

1. Ocenite najvecjo porabo casa navadnega algoritma za iskanje po znakovnih zaporedjih(slika 8.1). Cas ocenite s stevilom primerjanj v izstopnem pogoju notranje zanke.

2. Naj bosta P [1 . . .m] in T [1 . . . n] niza, ki sta sestavljena iz nakljucno izbranih zna-kov nekega znakovnega nabora, ki vsebuje d znakov. Dokazite, da je povprecno(pricakovano) stevilo operacij primerjanja znakov v izstopnem pogoju notranje zankenavadnega algoritma na sliki 8.1 enako

(n−m+ 1)1− d−m

1− d−1≤ 2(n−m+ 1).

3. Izracunajte preskakovalno funkcijo π KMP algoritma za vzorec

ababbabbababbababbabb.

4. Izracunajte funkciji λ in γ za vzorec P = 0101101201 in znakovni nabor Σ = 0, 1, 2.

Page 194: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

186 POGLAVJE 8. ISKANJE PO ZNAKOVNIH ZAPOREDJIH

Page 195: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Poglavje 9

VZPOREDNI ALGORITMI

9.1 Uvod

Glede na hiter razvoj racunalniske tehnologije, ki se med ostalim kaze v zmanjsevanjuizmer racunalniskih sestavnih delov, postaja kot cedalje zanimivejsa moznost za resevanjenekaterih nalog, uporaba vec sodelujocih procesorjev, ki istocasno obdelujejo vsak svojdel naloge. Zato bomo v tem poglavju na kratko predstavili osnovne ideje vzporednegaracunanja, kot pravimo taki uporabi racunalniskih procesorjev. Vendar, preden lahkosmiselno govorimo o vzporednem racunanju, se je potrebno dogovoriti o osnovnihpojmih.

Pp−1

P2

P1

P0

...

Skupenpom-nilnik

Slika 9.1: Racunal-niski model PRAM

Predvsem je treba takoj poudariti, da “vzporedniracunalniki” ne predstavljajo enotnega, homogenega razreda,temvec se razlicni modeli in prakticne realizacije precej razliku-jejo po svojih lastnostih in parametrih, kakor tudi, da so le pod-druzina sirse druzine vecprocesorskih racunalniskih sistemov , kitemelji na uporabi vec sodelujocih procesorjev. Prva razlika senanasa na naravo povezave med procesorji. Imamo lahko pro-cesorje, od katerih vsak izvaja svoj program in ki si le obcasnoposiljajo sporocila. Takim vecprocesorskim sistemom pravimosibko povezani vecprocesorski sistemi in pri zasnovi algoritmovzanje naletimo na nekatere nove probleme, vendar se postopekne razlikuje bistveno od zasnove algoritmov za navadne eno-procesorske racunalnike. Ta druzina vecprocesorskih sistemovnas na tem mestu ne bo zanimala. Po drugi strani pa imamovecprocesorske sisteme, kjer so izracuni na razlicnih procesorjih tesno povezani medseboj in takim pravimo krepko povezani vecprocesorski sistemi . To druzino bomoenacili s pojmom vzporednega racunalnika, ki smo jo omenili na zacetku.

Opisano druzino vzporednih racunalnikov bomo enacili z racunalniskim modelomPRAM, ki je shematicno prikazan na sliki 9.1. Ime je angleska kratica za Parallel

187

Page 196: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

188 POGLAVJE 9. VZPOREDNI ALGORITMI

Random Access Machine, oziroma stroj z vzporednim enakopravnim dostopom do po-mnilnika, sestavljen pa je iz dolocenega stevila procesorjev in osrednjega pomnilnika,ki je povezan z vsemi procesorji. Vsak procesor lahko opravlja obicajne operacijedanasnjih racunalnikov (aritmeticne operacije, operacije nad biti, operacije, ki pre-usmerjajo izracun) in ima enakopraven dostop do vseh celic pomnilnika. Osnovniprivzetek, ki ga bomo na tem mestu upostevali, je, da so procesorji med seboj sin-hronizirani, kar pomeni, da se ukazi na njih izvajajo istocasno v taktu neke zunanjeure.

Danes obstaja ze vec realizacij vzporednih racunalnikov, ki priblizno ustrezajotakemu opisu, vendar se v podrobnostih precej razlikujejo. Elementi, v katerih serazlicni stvarni vzporedni racunalniki med seboj razlikujejo, so npr. stevilo proce-sorjev (do nekaj tisoc), zmogljivost procesorjev (npr. ali ima lokalni pomnilnik) ipd.Precejsna raznolikost na podrocju vzporednih racunalnikov se tudi zrcali v teoreticnihmodelih. Ze pri opisanem modelu PRAM zasledimo najmanj stiri podrazrede gledena nacin branja iz pomnilnika in zapisovanja vanj: branje lahko poteka zaporedno,ko iz neke celice lahko naenkrat bere le en procesor, in vzporedno, ko naenkrat lahkobere vec procesorjev. Na podoben nacin razlikujemo med zaporednim in vzporednimzapisom. Tako imamo naslednje stiri razrede vzporednih racunalnikov

zbzz zaporedno branje, zaporeden zapis;

zbvz zaporedno branje, vzporeden zapis;

vbzz vzporedno branje, zaporeden zapis;

vbvz vzporedno branje, vzporeden zapis.

Od teh razredov imamo najveckrat opravka z razredoma zbzz in vbvz. Ocitnoje glede prakticne realizacije najenostavnejsi razred zbzz, s stalisca programiranja pavbvz. Pri vzporednem zapisu ni vnaprej ocitno, katera vrednost ostane zapisana vcelici, potem ko vsi procesorji operacijo zakljucijo. Moznih je vec dogovorov: ope-racija je smiselna le takrat, ko so zapisane vrednosti enake; obvelja vrednost, ki jozapise procesor z najmanjsim (najvecjim) indeksom ipd. V nasih primerih pa bomouporabljali le razred zbzz in nas opisane dileme ne bodo zanimale.

Naslednje pomembno vprasanje pri vzporednih racunalnikih je, kako jih programi-ramo. Z drugimi besedami, katere programske gradnike je potrebno dodati obicajnimprogramskim jezikom, da jih lahko uporabljamo na vzporednih racunalnikih. Pritem so mozne razlicne resitve, uporabili pa bomo najenostavnejso, ki zadosca nasimpotrebam. Obicajnim programskim jezikom dodamo stavek

PARALLEL DO(i) S1;S2; . . . ;Sn END,

katerega ucinek je, da se zaporedje stavkov S1;S2; . . . ;Sn izvaja vzporedno (istocasno)na vseh procesorjih, identiteta trenutnega procesorja pa je i. Nadalje potrebujemostavek, s katerim preverjamo nek globalni pogoj, ki je odvisen od vec celic pomnilnikain ki ga je mozno izracunati kot en ukaz:

PARALLEL WHILE P DO S1;S2; . . . ;Sn END,

Page 197: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

9.2. METODA PRESTAVLJANJA KAZALCEV 189

/ / / / / /

/ / /

/

/

/

/1 1 1 1 1 0

2 2 2 2 1 0

4 4 3 2 1 0

5 4 3 2 1 0

(a)

(b)

(c)

(d)

Slika 9.2: Prestavljanje kazalcev

1 PROCEDURE ListRank(p:PNode);2 VAR q :PNode; n,i :INTEGER;4 BEGIN4 q :=p; i :=0;5 WHILE q # NIL DO6 q .d := i ; INC (i); q := q .next7 END;8 n := i ;9 q := p;

10 WHILE q # NIL DO11 q .d := n − q .d ; q := q .next13 END13 END ListRank ;

Slika 9.3: Zaporedni algoritem za problem razdalje do konca seznama

kjer je P opisane vrste pogoj. V kolikor nek stavek ni v obmocju stavka PARALLELDO, privzamemo, da se izvaja na enem samem procesorju, ki ga (nakljucno) izbereoperacijski sistem.

9.2 Metoda prestavljanja kazalcev

Kot prvi primer naloge, ki jo je primerno resevati na vzporednem racunalniku, bomoopisali problem razdalje do konca seznama. Podan je seznam in pri vsakem elementuzelimo zapisati razdaljo do konca seznama [gl. sliko 9.2(a)]. Tako bo zadnji elementimel vsebino 0, predzadnji 1 itn. Obicajen, zaporedni algoritem za to nalogo je pri-kazan na sliki 9.3 in se ni tezko prepricati, da porabi cas Θ(n). Algoritem uporabljanek podatkovni tip Node, ki ima zgradbo,

Page 198: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

190 POGLAVJE 9. VZPOREDNI ALGORITMI

1 PROCEDURE ParListRank ;2 PARALLEL DO(i)3 IF next [i ] = NIL THEN d [i ] :=04 ELSE d [i ] :=16 END6 END ;7 PARALLEL WHILE ∃i next [i ] 6= NIL DO8 PARALLEL DO(i)9 IF next [i ] 6= NIL THEN

10 INC (d [i ],d [next [i ]]) ; next [i ] := next [next [i ]]12 END13 END14 END14 END ParListRank ;

Slika 9.4: Vzporedni algoritem za izracun razdalje do konca seznama

korak opis izracuna1 branje next[i]2 branje d[i]3 branje d[next[i]]4 zapis d[i] + d[next[i]] v d[i]5 branje next[next[i]]6 zapis next[next[i]] v next[i]

Slika 9.5: Podrobnosti izracuna v vrsticah 8–12 na sliki 9.4

PNode = POINTER TO Node ;Node = RECORD d : INTEGER ;next : PNode

END

Nalogo pa je mozno resiti tudi z mnogo ucinkovitejsim vzporednim algoritmom, ki jeprikazan na sliki 9.4. Za predstavitev seznama uporablja algoritem dve tabeli,

d , next : ARRAY n OF INTEGER;

Algoritem deluje tako, da na zacetku priredi vsakemu elementu seznama na sliki9.2(a) procesor in nato (istocasno) zapise v zadnji element seznama 0, v ostale pa1 [vrstice 2–6 na sliki 9.4]. Nato zanka v vrsticah 7–13 na vsakem koraku opravivzporedni izracun (vrstice 8–12), ki vsakemu elementu pristeje vsebino naslednjega inobenem kazalec prestavi tako, da kaze do naslednika naslednika (vrstica 10). Izracunse zakljuci, ko je seznam popolnoma “razvezan”.

Page 199: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

9.3. ASOCIATIVNI PRODUKT ZACETNIH ELEMENTOV SEZNAMA 191

Pri analizi algoritma naprej ugotovimo, da opisani algoritem pripada razredu zbzz.V to se je mozno prepricati na podlagi “smiselnega” prevoda slike 9.4 v nek nizji jezik,ki je prikazan na sliki 9.5. Osnovna ugotovitev je, da ceprav iz neke celice bere vecprocesorjev (procesor i in njegov predhodnik), se to dogaja v zaporednih casovnihtrenutkih (na primer koraka 2 in 3), tako da ne pride do vzporednega branja, oziromazapisa.

Nadaljnji koraki algoritma za primer na sliki 9.2(a) so prikazani na slikah (b)-(d).Kazalec iz prvega elementa, ki v sliki (a) kaze na drugega, se kot posledica stavkav vrstici 10 prestavi tako, da kaze na tretjega. Obenem se vsebina d[1] poveca zavsebino d[2]. Podobno pri drugih elementih. V koncnem koraku (d) so vrednostipri elementih enake razdalji do konca prvotnega seznama, seznam pa je popolnoma“razvezan”.

Sedaj se bomo prepricali v pravilnost algoritma. Uporabili bomo obicajno tehnikozancnih invariant. Invarianta zanke v vrsticah 7–13 je, da je vsota elementov seznama,ki se zacne pri elementu i, enaka razdalji do konca prvotnega seznama. To ocitno veljana zacetku, ker smo v vsak element, razen zadnjega, zapisali vrednost 1. Invariantase ohranja zato, ker na vsakem koraku sicer prestavimo kazalec, vendar elementu idodamo vrednost elementa, ki smo ga na ta nacin izpustili. 2

V naslednjem koraku se lotimo izracuna stevila korakov, ki jih porabi algoritemna sliki 9.4. Zanka v vrsticah 2–6 porabi en korak, oziroma dva, ce preizkus obravna-vamo kot locen korak, medtem ko zanka v vrsticah 7–13 porabi toliko korakov, kolikoje potrebno, da se prvotni seznam popolnoma “razveze” na posamezne elemente. Navsakem koraku se vsak obstojeci podseznam razdeli na dva podseznama: na podse-znam, ki povezuje sode elemente prvotnega podseznama in podseznam, ki povezujelihe elemente. Torej je stevilo korakov za to, da se seznam popolnoma razveze, enakoΘ(log2 n).

9.3 Asociativni produkt zacetnih elementov seznama

V naslednjem primeru bomo uporabili tehniko prestavljanja kazalcev pri nekem dru-gem izracunu. Podana sta asociativna operacija in seznam elementov1,

x1, x2, . . . , xn,

ki pripadajo mnozici, na kateri je operacija definirana. Naloga je sestaviti seznam

y1, y2, . . . , yn,

tako da velja yi = x1 x2 . . . xi. Za vrednost xi xi+1 . . . xj bomo odslejuporabljali nekoliko ucinkovitejsi zapis [i, j]. Ocitno velja [i, j − 1] [j, k] = [i, k].

1Spomnimo se, da je neka operacija asociativna v primeru, ko velja x (y z) = (x y) z privseh x, y, z. Z drugimi besedami, neka dvojiska operacija je asociativna, ko vrednost “produkta” vecelementov ni odvisna od postavitve oklepajev.

Page 200: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

192 POGLAVJE 9. VZPOREDNI ALGORITMI

1 PROCEDURE ParAssocPrefix ;2 PARALLEL DO(i)3 y [i ] :=x [i ]4 END ;5 PARALLEL WHILE ∃i next [i ] 6= NIL DO6 PARALLEL DO(i)7 IF next [i ] 6= NIL THEN8 y [next [i ]] := y [i ] y [next [i ]] ;9 next [i ] := next [next [i ]]

11 END12 END13 END13 END ParAssocPrefix ;

Slika 9.6: Vzporedni algoritem za asociativni produkt zacetnih elementov seznama

/ / / / / /

/ / /

/

/

/

/[1,1] [2,2] [3,3] [4,4] [5,5] [6,6]

[1,1] [1,2] [2,3] [3,4] [4,5] [5,6]

[1,1] [1,2] [1,3] [1,4] [2,5] [3,6]

[1,1] [1,2] [1,3] [1,4] [1,5] [1,6]

(a)

(b)

(c)

(d)

Slika 9.7: Asociativni produkt zacetnih elementov seznama

Page 201: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

9.4. IZRACUN GLOBINE VOZLISC DVOJISKEGA DREVESA 193

Nalogi pravimo asociativni produkt zacetnih elementov seznama. Vzporedni al-goritem zanjo je prikazan na sliki 9.6, medtem ko je primer njegovega delovanja nasliki 9.7. Algoritem je presenetljivo podoben algoritmu za razdaljo do konca seznamana sliki 9.4. Pravzaprav imata algoritma enaki zgradbi, razlikujeta se le po koncnihstavkih, ki se izvajajo znotraj zank. Elementi seznama imajo tri komponente: x, y innext, od katerih sta na sliki 9.7 prikazani le dve (y in next). Zopet privzemamo, daso komponente elementov zapisane v ustreznih tabelah. Tudi v tem primeru vsakemuelementu seznama priredimo nek procesor, nato pa algoritem deluje tako, da najprejzanka v vrsticah 2–4 priredi elementom y[i] vrednost x[i], za tem pa se zanka v vr-sticah 5–12 izvaja, dokler se seznam popolnoma ne “razveze”. Jedro notranje zankev vrsticah 8–9 se razlikuje od ustreznih stavkov v algoritmu na sliki 9.4 po tem, damedtem ko v prvem algoritmu vsak procesor prebere komponento d naslednika in jopristeje k svoji komponenti d, v drugem algoritmu procesor vrednost komponente ysvojega elementa primnozi k isti komponenti naslednika.

Podobno kot v primeru algoritma na sliki 9.4 poteka tudi dokaz pravilnosti inizpeljava stevila korakov. Dokaz pravilnosti sestavimo na podlagi zancne invariante,ki velja na zacetku zanke v vrsticah 5–12: y[i] pred nekim korakom je enako [h+ 1, i],kjer je h indeks predhodnika v seznamu, kateremu pripada i, oziroma [1, i] v primeru,ko i nima predhodnika. Na primer, na sliki 9.7(b) je indeks predhodnika elementai = 3, 1 in zato je y[3] = [2, 3].

Dokaz veljavnosti zancne invariante: pred prvim izvajanjem jedra zanke je inva-rianta ocitno veljavna. Sedaj pa denimo, da invarianta velja pred nekim izvajanjemjedra in bomo dokazali, da velja tudi potem, ko smo jedro izvrsili. Dokaz razpade natri primere: procesor i ima 0, 1, ali 2 (in vec) predhodnikov.

Ce i nima predhodnikov, se mu komponenta y ne spremeni in torej invariantaostane v veljavi.

Ce ima i enega predhodnika, h, ima y[h] na podlagi zancne invariante vrednost[1, h], medtem ko ima y[i] vrednost, [h+1, i]. V vrstici 8 torej procesor h priredi kom-ponenti y[i] vrednost [1, h] [h+ 1, i] = [1, i], v vrstici 9 pa i ostane brez predhodnika,kar pomeni, da invarianta ostane v veljavi.

Ce ima i dva ali vec predhodnikov, naj bo neposredni predhodnik h, predhodnikpredhodnika pa g. V vrstici 8 priredi procesor h komponenti y[i] vrednost [g+ 1, h] [h + 1, i] = [g + 1, i], medtem ko v vrstici 9 procesor g priredi komponenti next[g]vrednost i. Ker s tem postane g predhodnik i, ostane invarianta za i veljavna. 2

9.4 Izracun globine vozlisc dvojiskega drevesa

Na koncu poglavja o vzporednem racunanju bomo opisali resitev problema dolocanjaglobine vozlisc dvojiskega drevesa. Podano je dvojisko drevo in je potrebno pri vsakemvozliscu zapisati njegovo globino, ki jo v tem primeru definiramo kot stevilo vozliscna poti do korena (gl. sliko 9.8). Glede na to, da se pri resevanju naloge ne moremoizogniti obiskovanju vseh vozlisc, je najmanjsi cas za njeno resevanje z zaporednim al-

Page 202: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

194 POGLAVJE 9. VZPOREDNI ALGORITMI

1

2 2

3 3 3

4 4 4

5 5

Slika 9.8: Drevo z vpisanimi globinami vozlisc

A B

+1

−1

Slika 9.9: Dva procesorja, prirejena enemu vozliscu

goritmom Θ(n), kjer je n stevilo vozlisc. Kot prvo misel za vzporedni algoritem za istonalogo si lahko predstavljamo algoritem, ki deluje tako, da vsakemu vozliscu prirediprocesor, nato koren sebi priredi globino 1 ter poslje sporocilo o svoji globini svojimanaslednikoma. Ostali procesorji delujejo tako, da cakajo na sporocilo od predhodnika,nato vrednosti, ki jo dobijo, dodajo 1 in jo posredujejo naprej. Ce vsak procesor zasvojo operacijo potrebuje konstanten cas, je cas, ki ga porabi algoritem, velikostnegareda globine drevesa (dolzine najdaljse veje), kar pomeni v primeru uravnotezenegadrevesa Θ(log2 n), v najslabsem primeru (ko se drevo izrodi v eno samo vejo) pa Θ(n).

Izkaze pa se, da je mozno uporabiti algoritem za asociativni produkt zacetnihelementov seznama za izracun globine drevesa v najslabsem casu Θ(log2 n). Posto-pamo tako, da vsakemu vozliscu priredimo dva procesorja (slika 9.9). Procesor Aopravi izracun, ki ustreza vstopu v poddrevo, katerega koren je vozlisce, procesor Bpa opravi izstopni izracun. Vrednost, ki je prirejena procesorju A je +1, procesorjuB pa −1. Ce procesorje sklenemo v seznam, ki ustreza obisku vseh vozlisc drevesa odzgoraj navzdol in od leve proti desni (gl. npr. sliko 9.10) in ce kot asociativno opera-cijo, ki se pojavlja v asociativnem produktu zacetnih elementov seznama, dolocimosestevanje (+), je [1, iA] prav globina vozlisca, kateremu je prirejen procesor iA. Na-tancno pravilo, kako povezujemo procesorje, je naslednje:

Naj bo v neko vozlisce drevesa. Potem mu priredimo procesorja Av in Bv.

1. V primeru, ko ima v 0 naslednikov, je naslednik procesorja Av v

Page 203: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

9.5. POVZETEK OSNOVNIH POJMOV 195

Slika 9.10: Povezanost procesorjev za primer na sliki 9.8

seznamu procesorjev, procesor Bv. V primeru pa, ko je stevilo na-slednikov razlicno od nic in je w prvi naslednik v (gledano z leve), jenaslednik procesorja Av v seznamu procesorjev, procesor Aw.

2. V primeru, ko je v koren drevesa, Bv nima naslednikov v seznamuprocesorjev, sicer pa imamo dva primera: v je drugi naslednik ne-kega vozlisca w (gledano z leve), ali pa je prvi naslednik. V prvemprimeru (v je drugi naslednik) je naslednik procesorja Bv v seznamuprocesorjev, Bw. V drugem primeru, ko je v prvi naslednik w, najbo drugi naslednik w, vozlisce v′. Tedaj je naslednik procesorja Bvv seznamu procesorjev, Av′ .

9.5 Povzetek osnovnih pojmov

1. Vzporedno racunanje. Model racunalnika PRAM

2. Osnovni razredi vzporednih racunalnikov

3. Osnovni stavki vzporednega racunanja

4. Problem razdalje do konca seznama in tehnika prestavljanja kazalcev

5. Asociativni produkt zacetnih elementov seznama

6. Globina drevesa.

9.6 Naloge

1. Opisite algoritem vrste zbzz, ki porabi cas Θ(logn) in za vsak element nekega linear-nega seznama dolzine n ugotovi, ali je srednji element (ima indeks bn/2c).

2. Opisite algoritem vrste zbzz, ki porabi cas Θ(logn) in ki racuna asociativni produktzacetnih elementov neke tabele a[i] pri 1 ≤ i ≤ n. V tem primeru ne uporabljajtekazalcev, temvec izvajajte izracune neposredno nad indeksi.

Page 204: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

196 POGLAVJE 9. VZPOREDNI ALGORITMI

3. V nekem linearnem seznamu pripadajo elementi dvema razredoma, A in B. Sestaviteucinkovit algoritem vrste zbzz, ki seznam razdeli na dva seznama, od katerih vsakvsebuje elemente le ene vrste.

Page 205: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Dodatek A

KRATEK PRIROCNIKJEZIKA OBERON-21

A.1 Uvod

Oberon-2 je splosen programski jezik, ki nadaljuje tradicijo Pascala in Module-2. Njegovenajpomembnejse odlike so blocna zgradba, modularnost, moznost locenega prevajanja posa-meznih modulov, staticno dolocanje tipov, krepko preverjanje tipov (celo preko mej modu-lov), moznost razsirjanja tipov ter moznost deklaracije procedur, ki so pridruzene tipom.

Moznost razsirjanja tipov pomeni, da je Oberon-2 objektno usmerjen jezik. Objektje spremenljivka, ki pripada nekemu abstraktnemu podatkovnemu tipu, in ki ji pripadajo(katere vrednost se sestoji iz) doloceni podatki ter procedure, ki uporabljajo te podatke.Abstraktni podatkovni tipi so deklarirani kot razsirljivi zapisi. Posebnost Oberona-2 je, daje vecina pojmov, ki se pojavljajo v objektno usmerjenih jezikih, definirana z ustaljeno ter-minologijo imperativnih jezikov, kar ima za posledico manjse stevilo poimenovanj za sorodnepojme.

Razdelek A.12 definira nekatere pojme, ki so potrebni za pojasnilo pravil o preverjanjutipov v Oberonu-2. Na mestih, kjer te pojme uporabljamo, jih pisemo v posevnem tisku,zato da nakazemo njihov poseben pomen.

A.2 Sintaksa

Sintakso jezika Oberon-2 opisujemo s tim. razsirjenim Backus-Naurovim formalizmom(EBNF). Osnovne lastnosti tega zapisa so, da nakazujemo alternative z navpicno crto | ,dele zapisa, ki niso obvezni (so pa dovoljeni) s pravokotnima oklepajema [ ter ], ponavljajocese dele zapisa (pri cemer je stevilo ponavljanj lahko tudi 0) pa z zavitima oklepajema ter. Sintakticne zvrsti (oziroma nekoncne simbole) zapisujemo z velikimi zacetnicami (npr.

1Pricujoci sestavek je prevod dela Mosenbock in N. Wirth [13]. Delo ni namenjeno kot ucbenikjezika temvec le kot prirocnik. Torej je namenjeno bralcu, ki jezik ze pozna in si zeli le osveziti innatancno priklicati v spomin razlicne pojme.

197

Page 206: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

198 JEZIK OBERON-2

Statement), medtem ko simbole koncnega zapisa (oziroma koncne simbole) zapisujemo bo-disi z malimi zacetnicami, kadar gre za mnozice (npr. ident), bodisi z znakovnimi zaporedji,ki so sestavljena iz samih velikih crk (npr. BEGIN), bodisi jih zapisujemo v obliki poljubnihznakovnih zaporedij v navednicah (npr. “:=”)2.

A.3 Osnovni elementi jezika ter njihova predstavi-tev

Znakovna predstavitev koncnih simbolov jezika je definirana na podlagi znakovnega naboraASCII. Vrste koncnih simbolov so naslednje: imena, stevila, znakovna zaporedja, operatorjiter locila. Poleg teh elementov program sestavljajo tudi se komentarji. Vedno upostevamotudi naslednji pravopisni pravili: presledek ter konec vrstice se ne sme pojavljati znotrajsimbola (razen pri komentarjih ter znakovnih zaporedjih). Ta dva elementa upostevamo lekot locila med simboli. Drugo pravilo je, da razlikujemo med velikimi in malimi crkami.

1. Imena (angl. identifiers) so zaporedja crk in stevk, pri cemer mora biti prvi znak crka.

ident → letter letter | digit Primeri:

x Scan Oberon2 GetSymbol firstLetter

2. Stevila (angl. Numbers) so nenegativna cela stevila ali realne konstante. Tip celostevilcnekonstante je minimalen tip, ki mu konstanta pripada (gl. A.6.1). Ko je konstanta zapisanas koncnico H, je predstavitev sestnajstiska, sicer desetiska.

Realno stevilo je vedno zapisano z decimalno piko. Morebiti vsebuje tudi red velikost(angl. Scale Factor) v desetiskem zapisu. Crki E ali D pomenita “krat 10 na potenco”.Realno stevilo pripada tipu REAL, razen v primeru, ko red velikosti vsebuje crko D. V temprimeru pripada tipu LONGREAL.

number → integer | realinteger → digit digit | digit hexDigit “H”

real → digit digit “.” digit [ScaleFactor]

ScaleFactor → ( “E” | “D” ) [ “ + ” | “− ” ] digit digit hexDigit → digit | “A” | “B” | “C” | “D” | “E” | “F”

digit → | “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9”

Primeri:

1991 INTEGER 19910DH SHORTINT 1312.3 REAL 12.34.567E8 REAL 4567000000.57712566D − 6 LONGREAL 0.00000057712566

3. Znakovne konstante (angl. Character Constants) predstavljamo z zaporedno stevilkoznaka, ki ji sledi znak X.

character → digit hexDigit “X”

2Torej bodimo pozorni: koncni simboli so lahko sestavljeni iz vec crk.

Page 207: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.4. DEKLARACIJE TER PRAVILA O VELJAVNOSTI OBJEKTOV 199

4. Znakovna zaporedja (angl. strings) so zaporedja znakov v enojnih navednicah ’ ali dvojnihnavednicah ”. Zacetna navednica mora biti enaka zakljucni navednici in se ne sme pojavljatiznotraj zaporedja. Stevilu znakov v zaporedju pravimo tudi dolzina zaporedja. Znakovnozaporedje dolzine 1 lahko uporabljamo povsod, kjer je dovoljena znakovna konstanta (in tudinasprotno).

string → “”” char “”” | “’” char “’”Primeri:

”Oberon-2” ”Don’t worry!” ”x”

5. Operatorji in locila (angl. Operators and Delimiters) so posebni znaki, pari znakov alirezervirane besede, ki so nasteti spodaj. Rezervirane besede pisemo izkljucno z velikimicrkami in jih ne smemo uporabljati kot imena.

+ := ARRAY IMPORT RETURN− ∧ BEGIN IN THEN∗ = BY IS TO/ # CASE LOOP TYPE∼ < CONST MOD UNTIL& > DIV MODULE VAR. <= DO NIL WHILE, >= ELSE OF WITH; .. ELSIF OR| : END POINTER( ) EXIT PROCEDURE[ ] FOR RECORD IF REPEAT

5. Komentarji (angl. Comments) so poljubna znakovna zaporedja, ki se pricenjajo z uvodnimznakovnim parom (*, koncujejo pa z *) in ki jih lahko postavimo med poljubnima dvemasimboloma v programu. Komentarje lahko gnezdimo in ne vplivajo na pomen programa.

A.4 Deklaracije ter pravila o veljavnosti objektov

Vsako ime, ki se pojavlja v programu, moramo napovedati z ustrezno deklaracijo, razen, kogre za vnaprej deklarirana imena. Z deklaracijami prav tako dolocamo nekatere nespremen-ljive lastnosti objektov, kot so, ali je konstanta, tip, spremenljivka ali procedura. Nato imeuporabljamo zato, da se sklicujemo na imenovani objekt.

Objekt x je veljaven od mesta deklaracije do konca bloka (modula, procedure ali zapisa),ki mu deklaracija pripada. Pravimo, da je v tem bloku objekt x lokalen. Objekt x ni veljavenv vgnezdenih blokih, ki vsebujejo objekte z istim imenom. Pravila o veljavnosti so naslednja:

1. Na poljubnem mestu v programu eno in isto ime ne more oznacevati vec kot en objekt(z drugimi besedami: v bloku ne moremo deklarirati nekega imena veckrat).

2. Na objekt se lahko sklicujemo le znotraj njegovega podrocja veljavnosti.

3. Nek tip T , ki ima obliko POINTER TO T1 (gl. A.6.3) lahko deklariramo pred veljav-nostjo T1, vendar mora biti T1 deklarirano kasneje v istem bloku (znotraj katerega jeT lokalen).

Page 208: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

200 JEZIK OBERON-2

4. Ime, ki oznacuje komponento zapisa (gl. A.6.3) ali proceduro, ki je pridruzena tipu(gl. A.10.2), je veljavno le kot sestavni del oznacevalca (angl. designator) zapisa.

Imenu, ki je deklarirano v nekem modulu, lahko v deklaraciji dodamo oznako za izvoz(“∗” ali “−”), ki pove, da je ime izvozeno (na voljo v drugih modulih). Ime x, ki ga izvazamodulM lahko uporabljamo v drugih modulih, pod pogojem, da le-ti uvazajoM (gl. razdelekA.11). V modulih, ki uvazajo x, se nanj sklicujemo z M.x in v takem primeru pravimo, daje M.x kvalificirano ime. Spremenljivk z imeni, ki jim je v deklaraciji pripisano “−”, nemoremo spreminjati v modulih, ki taka imena uvazajo (take spremenljivke dovoljujejo lebranje).

Qualident → [ ident “.” ] identIdentDef → ident [ “ ∗ ” | “− ” ]Naslednja imena so vnaprej deklarirana, njihov pomen pa je opisan v oznacenih razdelkih:

ABS (A.10.3) ENTIER (A.10.3) LONG (A.10.3) REAL (A.6.1)ASH (A.10.3) EXCL (A.10.3) LONGINT (A.10.3) SET (A.6.1)BOOLEAN (A.6.1) FALSE (A.6.1) LONGREAL (A.6.1) SHORT (A.10.3)CAP (A.10.3) HALT (A.10.3) MAX (A.10.3) SHORTINT (A.6.1)CHAR (A.6.1) INC (A.10.3) MIN (A.10.3) SIZE (A.10.3)CHR (A.10.3) INCL (A.10.3) NEW (A.10.3) TRUE (A.6.1)COPY (A.10.3) INTEGER (A.6.1) ODD (A.10.3)DEC (A.10.3) LEN (A.10.3) ORD (A.10.3)

A.5 Deklaracije konstant

Deklaracija konstante pripise nekemu imenu konstantno vrednost.ConstantDeclaration → IdentDef “=” ConstExpressionConstExpression → ExpressionKonstanten izraz (ConstExpression) je nek izraz, ki ga lahko izracunamo le z branjem

programa, ne da bi programa bilo potrebno izvajati. Operandi izraza so lahko konstante(razdelek A.8) ali vnaprej deklarirane funkcije, ki jih je mozno izracunati v casu prevajanja.Sledijo primeri konstantnih izrazov:

N = 100limit = 2 ∗N − 1fullSet = MIN(SET )..MAX(SET )

A.6 Deklaracije tipov

Podatkovni tip doloca mnozico vrednosti, kateri lahko pripadajo vrednosti spremenljivk tegatipa, kakor tudi operatorje, ki so dovoljeni. Deklaracija tipa pripise tipu ime, v primerustrukturiranih tipov (tabel in zapisov) pa tudi doloca zgradbo spremenljivk.

TypeDeclaration → IdentDef “=” TypeType → Qualident | ArrayType | RecordType |

PointerType | ProcedureTypePrimeri:

Table = ARRAY N OF REALTree = POINTER TO Node

Page 209: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.6. DEKLARACIJE TIPOV 201

Node = RECORDkey : INTEGER;left ,right : Tree

ENDCenterTree = POINTER TO CenterNodeCenterNode = RECORD (Node)

width: INTEGER;subnode: Tree

ENDFunction = PROCEDURE(x : INTEGER):INTEGER

A.6.1 Osnovni tipi

Osnovne tipe oznacujemo z vnaprej deklariranimi imeni. Ustrezni operatorji so definiraniv razdelku A.8.2, ustrezne vnaprej deklarirane procedure oziroma funkcija pa v razdelkuA.10.3. Elementi (vrednosti) osnovnih tipov so definirane takole:

1. BOOLEAN logicni vrednosti TRUE (resnicno) in FALSE (neresnicno)2. CHAR znaki razsirjenega znakovnea nabora ASCII (0X..0FFX)3. SHORTINT cela stevila v mejah od MIN(SHORTINT) do

MAX(SHORTINT)4. INTEGER cela stevila v mejah od MIN(INTEGER) do

MAX(INTEGER)5. LONGINT cela stevila v mejah od MIN(LONGINT) do

MAX(LONGINT)6. REAL realna stevila v mejah od MIN(REAL) do MAX(REAL)7. LONGREAL realna stevila v mejah od MIN(LONGREAL) do

MAX(LONGREAL)8. SET podmnozice stevil v mejah od 0 do MAX(SET)

Tipi od 3 do 5 so celostevilcni tipi, tipa 6 in 7 sta realna tipa, skupaj pa predstavljajo stevilcnetipe. Slednji tipi tvorijo hierarhijo, v smislu, da manjsi tipi predstavljajo podmnozice vecjih:

LONGREAL ⊇ REAL ⊇ LONGINT ⊇ INTEGER ⊇ SHORTINT

A.6.2 Tabelaricni tipi

Tabela je struktura, ki je sestavljena iz elementov (komponent), ki pripadajo istemu tipu,ki mu pravimo tip elementa tabele. Stevilu elementov v tabeli pravimo tudi dolzina tabele.Elemente tabele oznacujemo z indeksi, ki so stevila od 0 do dolzina tabele minus 1.

ArrayType → “ARRAY” “[” Length “, ” Length “]” “OF” TypeLength → ConstExpressionZapis, ki ima obliko

ARRAY L0, L1, . . . , LnOF T

pravzaprav prestavlja okrajsavo za

ARRAY L0 OFARRAY L1 OF

Page 210: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

202 JEZIK OBERON-2

...ARRAY Ln OF T

Tabelam, ki so deklarirane brez dolzine, pravimo odprte tabele. Uporabljamo jih lahko le namestu osnovnega tipa kazalca (gl. A.6.4), tipa elementa odprte tabele (gl. A.10.1) ali kot tipformalnega parametra (gl. A.10.1). Primeri so naslednji:

ARRAY OF INTEGERARRAY OF CHAR

A.6.3 Tipi zapisov

Zapis3je struktura, ki se sestoji iz vnaprej dolocenega stevila elementov, ki jim pravimokomponente (angl. field), ki pa lahko pripadajo razlicnim tipom. Deklaracija tipa zapisadoloca ime in tip vsake komponente. Imena komponent so veljavna od mesta deklaracijedo konca deklaracije tipa zapisa, vendar jih je mozno uporabljati (“so vidna”) tudi kotsestavne dele oznacevalcev, ki oznacujejo komponente spremenljivk zapisnega tipa (gl. A.8).V primeru, ko se zapisni tip izvaza, se morajo komponente, ki naj bi bile vidne izven modula,ki vsebuje deklaracijo zapisnega tipa, oznaciti. Takim komponentam pravimo, da so javnodostopne, ostale so zasebne.

RecordType → “RECORD” [ “(”BaseType “)” ]FieldList “; ” FieldList “END”

BaseType → Qualident

FieldList → [IdentList “:” Type]

Zapisni tipi so razsirljivi. Z drugimi besedami, nek tip lahko deklariramo kot razsiritevoziroma podaljsek drugega tipa. V naslednjem primeru:

T0 = RECORD x : INTEGER ENDT1 = RECORD (T0 ) y : REAL END

je T1 (neposredna) razsiritev T0, T0 pa je (neposredni) osnovni tip za T1 (gl. razdelekA.12). Razsirjen tip T1 se sestoji iz vseh komponent svojega osnovnega tipa, kakor tudiiz komponent, ki so deklarirane v T1 (gl. razdelek A.6). Vsa imena, ki so deklariranav razsirjenem zapisu morajo biti razlicna od imen v zapisih osnovnega tipa (ali osnovnihtipov). Primeri deklaracij zapisnih tipov:

RECORDday , month, year : INTEGER

ENDRECORD

name, firstname: ARRAY 32 OF CHAR;age: INTEGER;salary : REAL

END

3Opozarjamo na nevarnost dvoumnosti v slovenscini, kjer uporabljamo besedo zapis tako zaprevod angleskega izraza record kot tudi za prevod angleskega izraza notation.

Page 211: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.7. DEKLARACIJE SPREMENLJIVK 203

A.6.4 Tipi kazalcev

Vrednosti spremenljvik kazalcnega tipa P so kazalci na spremenljivke nekega tipa T . TipuT pravimo osnovni tip kazalcnega tipa P , mora pa biti bodisi tabelaricen ali zapisni tip. Nakazalcne tipe se prenasa relacija razsirjenosti osnovnega tipa: v primeru, ko je T1 razsiritevtipa T , P1 pa je kazalec na T1, je tudi P1 razsiritev P .

PointerType → “POINTER” “TO” TypeCe je p spremenljivka tipa POINTER TO T , ima klic vnaprej deklarirane procedure

NEW(p) (gl. A.10.3) ucinek, da se nova spremenljivka tipa T generira v prostem delu pomnil-nika. V primeru, ko p pripada zapisnemu ali tabelaricnemu tipu, ima klic obliko NEW(p),ko pa p pripada tipu odprte tabele, ima klic obliko NEW(p, e0, . . . , en−1), kjer so dolzinegenerirane tabele po ustreznih dimenzijah enake vrednostim izrazov e0, . . . , en−1. V obehprimerih se kazalec na novo spremenljivko priredi spremenljivki p, ki pripada tipu P . Spre-menljivka p∧, na katero kaze p (izgovarja se kot “cilj kazalca p”), je tipa T . Spremenljivkanekega poljubnega kazalcnega tipa ima lahko tudi vrednost NIL, ki predstavlja odsotnostcilja (spremenljivka vsebuje prazen kazalec).

A.6.5 Tipi procedur

Vrednosti spremenljivk, ki pripadajo tipom procedur, so bodisi procedure, bodisi NIL. Cespremenljivki procedurnega tipa T priredimo proceduro P , morata biti seznama formalnihparametrov (gl. razdelek A.10.1) P in T skladna (gl. razdelek A.12). Za P velja tudi, da nemore biti vnaprej deklarirana procedura, niti je lahko procedura, ki je lokalno deklarirana vdrugi proceduri. Ce velja slednja lastnost pravimo, da je P globalna procedura.

ProcedureType → “PROCEDURE” [ FormalParameters ]

A.7 Deklaracije spremenljivk

Z deklaracijami spremenljivk izbiramo imena spremenljivk kakor tudi njihov podatkovni tip.VariableDeclaration → IdentList “:” TypeSpremenljivke zapisnega ali kazalcnega tipa imajo tako staticni tip (tip, ki se pojavlja v

deklaraciji – pravimo mu tudi kar spremenljivkin tip), kakor tudi dinamicni tip (tip kateremupripadajo v danem trenutku med izvajanjem). Pri spremenljivkah zapisnega ali kazalcnegatipa je lahko dinamicni tip razsiritev njihovega staticnega tipa. Staticni tip doloca, katerekomponente zapisa so dostopne. Dinamicni tip pa se uporablja za klice procedur, ki so pri-druzene tipom (gl. A.10.2). Sledijo primeri deklaracij spremenljivk (nanasajo se na primereiz razdelka A.6):

i , j , k : INTEGERx , y : REALp, q : BOOLEANs: SETF : Functiona: ARRAY 100 OF REALw : ARRAY 16 OF RECORD

name: ARRAY 32 OF CHAR;ccount : INTEGER

END

Page 212: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

204 JEZIK OBERON-2

t , c: Tree

A.8 Izrazi

Izrazi so jezikovne oblike, ki predstavljajo racunska navodila, na podlagi katerih se upora-bljajo operatorji ter funkcijske procedure s konstantami ter trenutnimi vrednostmi spremen-ljivk za izracun novih vrednosti. Izrazi so sestavljeni iz operandov in operatorjev, upora-bljamo pa lahko tudi oklepaja, da nakazemo, katerim operatorjem so operandi pridruzeni.

A.8.1 Operandi

Z izjemo konstruktorjev mnozic ter dobesednih konstant (stevil, znakovnih konstant ter zan-kovnih zaporedij) se na operande sklicujemo z oznacevalci (angl. designator). Oznacevalecima za osnovo ime neke konstante, spremenljivke ali procedure, ki je morebiti kvalificiranoz imenom nekega modula (gl. razdelke A.4 in A.11), dodamo pa mu lahko se selektorje vprimeru, ko je oznaceni objekt komponenta neke strukture.

Designator → Qualident “.” ident | “[”ExpressionList “]” |“∧” | “(”Qualident “)”

ExpressionList → Expression “, ” Expression V primeru, ko a oznacuje tabelo, oznacuje a[e] komponento tabele z indeksom, ki je

enak trenutni vrednosti izraza e. e mora pripadati celostevilcnemu tipu. Oznacevalec oblikea[e0, e1, . . . , en] predstavlja a[e0][e1] . . . [en]. V primeru, ko je r zapis, oznacuje r.f kompo-nento f zapisa r ali proceduro f , ki je pridruzena dinamicnemu tipu r (gl. A.10.2). V primeru,ko p oznacuje kazalec, oznacuje p∧ spremenljivko, na katero kaze p (cilj spremenljivke p).Oznacevalca p∧.f in p∧[e] lahko skrajsamo v p.f in p[e], z drugimi besedami pri zapisnemali tabelaricnem selektorju je operacija premika do cilja (angl. dereferencing) privzeta. Vprimeru, ko je a ali r dosegljivo le za branje, velja isto tudi za a[e] ter r.f .

Tipska zahteva v(T ) predstavlja zahtevo, naj bo dinamicni tip v enak T (ali razsiritviT ), v nasprotnem se izvajanje programa nasilno prekine (angl. abort). V oznacevalcu, kjerse pojavlja v(T ), pa je privzeto, da ima v staticni tip T . Tipsko zahtevo lahko uporabljamov primeru, ko je v

1. procedurni referencni parameter ali, ko je kazalec ter je

2. T razsiritev staticnega tipa v.

V primeru, ko je oznaceni objekt konstanta ali spremenljivka, se oznacevalec nanasana njeno trenutno vrednost. V primeru, ko je oznaceni objekt procedura, se oznacevalecnanasa na proceduro, razen, ko mu sledi (morebiti prazen) seznam parametrov, kar pomeniklic procedure in v takem primeru se oznacevalec nanasa na vrednost, ki je rezultat klicaprocedure. Stvarni parametri v klicu procedure morajo ustrezati formalnim parametrom,kot to velja pri klicih nefunkcijskih procedur (gl. A.10.1). Sledijo primeri oznacevalcev (gl.primere iz razdelka A.7):

i (INTEGER)a[i] (REAL)w[3].name[i] (CHAR)t.left.right (Tree)t(CenterNode).subnode (Tree)

Page 213: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.8. IZRAZI 205

A.8.2 Operatorji

V izrazih razlikujemo stiri skupine operatorjev na podlagi njihove prednosti (pri delovanjuna operande). Operator ∼ se izvaja prvi, nato sledijo operatorji podobni mnozenju, natooperatorji podobni sestevanju in koncno operatorji, ki predstavljajo relacije. Operatorji, kiso enako postavljeni na prednostni lestvici, se izvajajo od leve proti desni. Na primer x−y−zpredstavlja (x− y)− z.

Expression → SimpleExpression [Relation SimpleExpression ]SimpleExpression → [ “ + ” | “− ” ] Term AddOperator Term Term → Factor MulOperator Factor Factor → Designator [ActualParameters ] | number | character |

string | NIL | Set | “(” Expression “)” | “∼” FactorSet → “” [ Element “, ” Element] “”Element → Expression [ “..” Expression ]ActualParameters → “(” ExpressionList “)”Relation → ““=”” | “#” | “ < ” | “ <= ” | “ > ” | “ >= ” | “IN” | “IS”AddOperator → “ + ” | “− ” | “OR”MulOperator → “ ∗ ” | “/” | “DIV” | “MOD” | “&”

Razpolozljivi operatorji so nasteti v tabelah, ki sledijo. Nekateri operatorji se lahko upora-bljajo z vec tipi operandov, kar pomeni, da predstavljajo vec operacij. V takem primeru jeoperacija dolocena sele s tipom operanda. V vsakem primeru morajo biti operandi skladniz operatorji za uporabo v izrazih (angl. expression compatible). Gl. razdelek A.12.

Logicni operatorji

OR logicna disjunkcija pOR q “ce je p resnicno, je vrednost TRUE,sicer je vrednost enaka q”

& logicna konjunkcija p& q “ce je p resnicno, je vrednost q,sicer je vrednost enaka FALSE”

∼ logicna negacija ∼p “ce je p resnicno, je vrednost FALSE,sicer je vrednost TRUE

Nasteti operatorji se uporabljajo z logicnimi vrednostmi (tipa BOOLEAN) in dajejo tudivrednosti tipa BOOLEAN.

Aritmeticni operatorji

+ vsota− razlika∗ produkt/ realni kvocientDIV celostevilcni kvocientMOD ostanek po modulu

Operatorji +, −, ∗ in / delujejo na operande numericnih tipov. Tip rezultata je vecji(obseznejsi) od tipov operandov, razen pri /, kjer je tip rezultata najmanjsi realen tip, kivsebuje oba operanda. Ce − ali + uporabljamo kot eniski operator, prvi ucinkuje kot zame-njava predznaka, drugi pa kot identiteta. Operanda DIV in MOD delujeta le na celostevilcneoperande in sta povezana z naslednjima formulama, pri cemer je x poljubno, y pa pozitivno:

Page 214: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

206 JEZIK OBERON-2

x = (xDIV y) ∗ y + (xMOD y)0 ≤ (xMOD y) < y

Primeri:

x y xDIV y xMOD y5 3 1 2−5 3 −2 1

Operatorji na mnozicah

+ unija− razlika mnozic (x− y = x ∩ y)∗ presek/ simetricna razlika mnozic (x/y = (x− y) ∪ (y − x))

Operatorji na mnozicah uporabljajo operande, ki pripadajo tipu SET, istemu tipu pa pri-pada tudi rezultat. Eniski minus oznacuje komplement mnozice x, torej je −x podmnozicaelementov med 0 in MAX(SET), ki ne pripadajo mnozici x. Operatorji na mnozicah nisoasociativni ((a+ b)− c 6= a+ (b− c)).

Konstruktor mnozice definira mnozico tako, da nasteje njene elemente znotraj zavitihoklepajev. Elementi so lahko cela stevila v mejah med 0 in MAX(SET). Razpon a..bpredstavlja vsa cela stevila v intervalu [a, b].

Relacije

= enako# neenako< manjse od<= manjse ali enako kot> vecje od>= vecje ali enako kotIN pripadnost mnoziciIS preverjanje tipa

Rezultat uporabe relacije pripada tipu BOOLEAN. Relacije =, #, <, <=, > ter >= sosmiselne pri operandih, ki pripadajo numericnim tipom, tipu CHAR, ali tabelaricnim tipoms tipom elementov CHAR, pod pogojem, da je znakovno zaporedje zakljuceno z znakom 0X.Relaciji = ter # sta definirani tudi na tipih BOOLEAN ter SET, kakor tudi na kazalcnihter procedurnih tipih (ki vkljucuje vrednost NIL). x IN s predstavlja predikat “x pripadamnozici s”, pri cemer x pripada celostevilcnemu tipu, s pa tipu SET. v IS T predstavljapredikat “dinamicni tip v je T (ali razsiritev T )” in mu pravimo preizkus tipa (angl. typetest). Uporabiti ga je mozno

1. kadar je v spremenljivka zapisnega ali kazalcnega tipa in je

2. T razsiritev staticnega tipa v.

Primeri izrazov so naslednji (gl. primere iz razdelka 7):

Page 215: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.9. STAVKI 207

1991 INTEGERiDIV 3 INTEGER∼pOR q BOOLEAN(i+ j) ∗ (i− j) INTEGERs− 8, 9, 13 SETi+ x REALa[i+ j] ∗ a[i− j] REAL(0 <= i)&(i < 10) BOOLEANt.key = 0 BOOLEANk IN i..j − 1 BOOLEANw[i].name <= ”John” BOOLEANt IS CenterNode BOOLEAN

A.9 Stavki

Stavki oznacujejo dejanja. Razlikujemo med elementarnimi in sestavljenimi stavki. Ele-mentarni stavki ne vsebujejo delov, ki bi sami bili stavki, so pa naslednji: prirejanje (angl.assignment), klic procedure, vrnitev iz klica (angl. return) ter izhod iz bloka (angl. exit).Sestavljeni stavki vsebujejo dele, ki so tudi sami stavki, uporabljamo pa jih za oznacevanjezaporedja dejanj ter za pogojno, izbirno in ponavljajoce se izvajanje dejanj. Stavek je lahkotudi prazen, kar pomeni odsotnost dejanj. Prazen stavek se pojavlja za to, da dosezemovecjo enostavnost sintaksnih pravil za zaporedja stavkov.

Statement → [Assignment | ProcedureCall | IfStatement |CaseStatementWhileStatement | RepeatStatement |ForStatement | LoopStatementWithStatement |“EXIT” | “RETURN” [ Expression ] ]

A.9.1 Prirejanje

Prirejanje nadomesti trenutno vrednost spremenljivke z novo vrednostjo, ki jo doloca nekizraz. Izraz mora biti skladen s spremenljivko za uporabo v prirejanju (gl. razdelek A.12).Zapis za operator prirejanja je “:=”, izgovarjamo pa ga kot “postane”.

Assignment → Designator “ := ” ExpressionKo se izraz e, katerega vrednost pripada tipu Te, priredi spremenljivki v, ki pripada tipu

Tv, se zgodi naslednje:

1. v primeru, ko sta Tv in Te zapisna tipa, se priredijo le tiste komponente Te, ki pripadajotudi tipu Tv (projekcija). Dinamicni tip v mora biti isti kot staticni tip v in se nespremeni kot posledica prirejanja;

2. ko sta Tv in Te kazalcna tipa, postane dinamicni tip v enak dinamicnemu tipu e;

3. ko je Tv enak ARRAY n OF CHAR in je e znakovni niz dolzine m < n, postane v[i]enako e[i], pri 0 ≤ i ≤ m− 1, v[m] pa postane enako 0X.

Sledijo primeri prirejanj (gl. primere iz razdelka A.7):

i := 0p := i = jx := i+ 1k := log2(i+ j)

Page 216: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

208 JEZIK OBERON-2

F := log2s := 2, 3, 5, 7, 11, 13a[i] := (x+ y) ∗ (x− y)t.key := iw[i+ 1].name := ”John”t := c

A.9.2 Klici procedur

Klic procedure sprozi njeno delovanje. Klic procedure morebiti vsebuje tudi seznam stvarnihparametrov, ki nadomestijo ustrezne formalne parametre, ki jih doloca deklaracija procedure(gl. razdelek A.6.5). Sovpadanje med stvarnimi in formalnimi parametri se ugotavlja napodlagi njihovega polozaja na seznamu stvarnih oziroma formalnih parametrov. Obstajatadve vrsti parametrov: referencni in vrednostni.

Ce je nek formalni parameter referencni, mora biti ustrezni stvarni parameter oznacevalecneke spremenljivke. V primeru, ko se oznacevalec nanasa na neko strukturirano spremen-ljivko, se ustrezni selektorji izracunajo v trenutku, ko se opravi zamenjava formalnih parame-trov s stvarnimi, torej pred sprozitvijo procedure. Ce je nek formalni parameter vrednostni,mora biti ustrezni stvarni parameter nek izraz, ki se izracuna pred sprozitvijo procedure,vrednost izraza pa se priredi formalnemu parametru (gl. razdelek A.10.1).

ProcedureCall → Designator [ActualParameters ]Primeri:

WriteInt(i ∗ 2 + 1)INC(w[k].count)t.Insert(”John”)

A.9.3 Stavcna zaporedja

Stavcna zaporedja nakazujejo zaporedje dejanj, ki jih dolocajo stavki, ki tvorijo zaporedje.Meje med stavki nakazujemo s podpicji.

StatementSequence → Statement “; ” Statement

A.9.4 Pogojni stavki

IfStatement → “IF” Expression “THEN” StatementSequence “ELSIF” Expression “THEN” StatementSequence [ “ELSE” StatementSequence ]Pogojni stavki dolocajo pogojno izvajanje stavcnih zaporedij v primeru, ko je izpolnjen

ustrezni pogoj. Pogoju, ki stoji pred stavcnim zaporedjem, pravimo kar pogoj za izvajanjestavcnega zaporedja (angl. statement sequence guard). Pogoji stavcnih zaporedij se racunajopo vrsti, dokler ne pridemo do nekega z vrednostjo TRUE, po cemer se izvaja ustreznostavcno zaporedje. V primeru, ko noben pogoj nima vrednosti TRUE, se izvaja stavcnozaporedje, ki sledi locilu ELSE (v kolikor se navedeno locilo sploh pojavlja).Primer:

IF (ch >= “A” & (ch <= “Z”) THEN ReadIdentifierELSIF (ch >= “0”) & (ch <= “9”) THEN ReadNumberELSIF (ch = ′”′) OR (ch = “′”) THEN ReadString

Page 217: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.9. STAVKI 209

ELSE SpecialCharacterEND

A.9.5 Izbirni stavek

Izbirni stavek predpisuje izbiro ter izvajanje nekega stavcnega zaporedja na podlagi vrednostinekega izraza. Najprej se izracuna vrednost izraza, nato pa se izvaja stavcno zaporedje,katerega seznam oznak (angl. case label list) vsebuje vrednost izraza. Izbirni izraz pripadabodisi celostevilcnemu tipu, ki vsebuje vse vrednosti, ki se pojavljajo v seznamih oznak alipa morajo izbirni izraz in vrednosti v seznamih oznak pripadati tipu CHAR. Izbirne oznakeso konstante in vsaka se lahko pojavlja le enkrat v vseh seznamih oznak. V primeru, ko sevrednost izbirnega izraza ne pojavlja v seznamih oznak, se izvaja stavcno zaporedje, ki sledilocilu ELSE, ce pa tega locila ni, se program nasilno prekine.

CaseStatement → “CASE” Expression “OF” Case “ | ” Case [ “ELSE” StatementSequence ]“END”

Case → [ CaseLabelList “:” StatementSequence ]CaseLabelList → CaseLabels “, ” CaseLabels CaseLabels → ConstExpression [ “..” ConstExpression ]

Primer:

CASE ch OF“A” .. “Z”: ReadIdentifier| “0” .. “9”: ReadNumber| “′” , ′”′ : ReadStringELSE SpecialCharacterEND

A.9.6 Stavek While

Stavek While ali zanka s izstopnim pogojem na zacetku, predpisuje ponavljanje izvajanjanekega stavcnega zaporedja dokler ima nek pogoj v obliki logicnega izraza, ki mu pravimopogoj stavka While, vrednost TRUE. Vrednost pogoja se izracuna pred vsakim izvajanjemstavcnega zaporedja.

WhileStatement → “WHILE” Expression “DO” StatementSequence “END”Primeri:

WHILE i > 0 DO i :=i DIV 2 ; k :=k+1 ENDWHILE (t # NIL) & (t .key # i) DO t :=t .left END

A.9.7 Stavek Repeat

Stavek Repeat ali zanka z izstopnim pogojem na koncu predpisuje ponavljanje izvajanja ne-kega stavcnega zaporedja do trenutka, ko postane vrednost nekega pogoja v obliki logicnegaizraza, ki mu pravimo pogoj stavka Repeat, enaka TRUE. Stavcno zaporedje se izvaja naj-manj enkrat.

Page 218: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

210 JEZIK OBERON-2

RepeatStatement → “REPEAT” StatementSequence “UNTIL” Expression

A.9.8 Stavek For

Stavek For ali zanka s kontrolno spremenljivko predpisuje veckratno izvajanje nekega stavcnegazaporedja, pri cemer je stevilo izvajanj vnaprej doloceno, neki celostevilcni spremenljivki (kiji pravimo kontrolna spremenljivka stavka For) pa pri vsakem zvajanju priredimo novo vre-dnost, tako da se zaporedne vrednosti razlikujejo za enak prirastek.

ForStatement → “FOR” ident “ := ” Expression “TO” Expression[ “BY” ConstExpression ] “DO” StatementSequence“END”

Stavek

FOR v := beg TO end BY step DO statements END

ima isti ucinek kot

temp := end ; v := beg ;IF step > 0 THENWHILE v <= temp DO statements ; v := v+step END

ELSEWHILE v >= temp DO statements ; v := v+step END

END;

temp pripada istemu tipu kot v. step je nenicelen konstantni izraz. V primeru, ko je stepodsotno, je privzeta vrednost 1.

Primera:

FOR i := 0 TO 79 DO k := k + a[i ] ENDFOR i := 79 TO 1 BY −1 DO a[i ] := a[i−1] END

A.9.9 Stavek Loop

Stavek Loop ali enostavna zanka predpisuje ponavljanje nekega stavcnega zaporedja, ki seprekine po izvrsitvi nekega stavka Exit znotraj stavcnega zaporedja (gl. A.9.10).

LoopStatement → “LOOP” StatementSequence “END”

Primer:

LOOPReadInt(i);IF i < 0 THEN EXIT END;WriteInt(i)

END

Namen stavka For je zapis ponavljanj, ki vsebujejo vec izhodov ali pa je izhod postavljenv sredi ponavljanja.

Page 219: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.10. DEKLARACIJE PROCEDUR 211

A.9.10 Stavka Return ter Exit

Stavek Return ali izhod iz procedure nakazuje zakljucek neke procedure. Oznacuje ga simbolRETURN, ki mu sledi izraz v primeru, ko gre za funkcijsko proceduro. Izraz mora pripadatitipu, ki je skladen glede prirejanja (gl. razdelek A.12) s tipom rezultata funkcijske procedure,kot je zapisan v naslovu procedure (gl. razdelek A.10).

Funkcijske procedure morajo vsebovati stavek Return, ki doloca vrednost procedure.Pri nefunkcijskih procedurah je obicajni zakljucek procedure na koncu jedra procedure. Ceobstajajo dodatni stavki Return, le-ti nakazujejo dodatne (in verjetno izredne) zakljuckedelovanja procedure.

Stavek Exit ali izhod iz zanke zapisemo s simbolom EXIT, nakazuje pa prenehanje pona-vljanj, ki jih doloca stavek Loop, znotraj katerega je postavljen stavek Exit, in nadaljevanjeprograma s stavkom, ki sledi stavku Loop. Stavek Exit je povezan z vsebujocim stavkomLoop, ceprav slednji ne predpisuje kakega posebnega mesta, kjer naj se stavek Exit pojavlja.

A.9.11 Stavek With

Stavek With ali tipska kretnica predpisuje izracun nekega stavcnega zaporedja, ki je odvisnood rezultata nekega preizkusa tipa. Vsak primerek spremenljivke, katere tip reizkusamo, jeopremljen z ustrezno tipsko zahtevo.

WithStatement → “WITH”Guard “DO” StatementSequence “ | ” “DO” StatementSequence [ “ELSE” StatementSequence ]“END

Guard → Qualident “:”QualidentV primeru, ko je v spremenljivka zapisnega ali kazalcnega tipa in ce pripada staticnemu

tipu T0, ima stavek

WITH v : T1 DO S1 | v : T2 DO S2 ELSE S3 END

naslednji ucinek: ce je dinamicni tip v enak T1, se izvaja stavek S1, pri cemer se v obravnava,kot da pripada staticnemu tipu T1, ce pa je dinamicni tip v enak T2, se izvaja stavek S2, pricemer se v obravnava, kot da pripada staticnemu tipu T2. Ce nobeden od zapisanih pogojevni izpoljnjen, se izvaja S3. Ce nobeno preverjanje tipa ne da rezultata resnicno, se programnasilno prekine.Primer:

WITH t : CenterTree DO i :=t .width; c:=t .subnode END

A.10 Deklaracije procedur

Deklaracija procedure je sestavljena iz procedurinega naslova (angl. heading) in njenegajedra. Naslov doloca ime procedure ter njene formalne parametre, v primeru procedur, kiso pridruzene tipu, pa naslov doloca se glavni parameter (angl. receiver). Jedro procedurevsebuje deklaracije ter stavke, deklaracija procedure pa je zakljucena s svojim imenom.

Imamo dve vrsti procedur: nefunkcijske ali prave procedure ter funkcijske procedure.Slednje procedure sprozi funkcijski oznacevalec, ki je del nekega izraza, imajo pa rezultat,

Page 220: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

212 JEZIK OBERON-2

ki deluje kot operand izraza. Prave procedure pa se sprozijo s klicem procedure. Nekaprocedura je funkcijska v kolikor njeni formalni parametri dolocajo tip rezultata. Jedrofunkcijske procedure mora vsebovati stavek Return, ki doloca rezultat klica procedure.

Vse konstante, tipi, spremenljivke ter procedure, ki so deklarirani znotraj procedure solokalni v proceduri. Ker lahko tudi druge procedure deklariramo kot lokalne objekte, imamolahko opravka z gnezdenimi procedurami. Klic neke procedure v lastnem jedru, povzrocirekurzivno izvajanje.

Objekti, ki so deklarirani v procedurinem okolju, so veljavni v vseh delih procedure, kjernjihova veljavnost ni bila iznicena z deklaracijo lokalnega objekta z istim imenom.

ProcedureDeclaration → ProcedureHeading “; ” ProcedureBody ident

ProcedureHeading → “PROCEDURE” [Receiver ] IdentDef [ FormalParameters ]

ProcedureBody → DeclarationSequence [ “BEGIN” StatementSequence ] “END”

DeclarationSequence → “CONST” ConstantDeclaration “; ” |“TYPE” TypeDeclaration “; ” |“VAR” V ariableDeclaration “; ” | ProcedureDeclaration “; ” | ForwardDeclaration “; ”

ForwardDeclaractgion → “∧”“PROCEDURE”[Receiver]IdentDef [FormalParameters]

V kolikor ima procedura glavni parameter, se steje, da je pridruzena ustreznemu tipu(gl. A.10.2). Predhodna deklaracija procedure (angl. forward declaraction) omogoca upo-rabo procedure pred mestom njene deklaracije. Seznama formalnih parametrov predhodnedeklaracije in procedurine deklaracije morata biti skladna (gl. razdelek A.12).

A.10.1 Formalni paramteri

Formalni parametri so imena, ki so deklarirana v procedurinem seznamu formalnih para-metrov. Ti parametri ustrezajo stvarnim parametrom v procedurinem klicu. Povezava medstvarnimi in formalnimi parametri se ugotovi ob procedurinem klicu. Obstajata dve vrstiparametrov, vrednostni in referencni parametri, ki se razlikujeta po odsotnosti ali prisotno-sti locila VAR. Vrednostni parametri so pravzaprav lokalne spremenljivke, ki se jim priredizacetna vrednost enaka vrednosti stvarnega parametra. Referencni parametri pa predsta-vljajo stvarne parametri, ki so spremenljivke. Podrocje veljavnosti formalnih parametrovje do konca procedurinega bloka, v katerem je formalni parameter deklariran. Funkcijskaprocedura brez parametrov ima obvezno prazen seznam parametrov (samo predklepaj in za-klepaj), klice pa se prav tako s funkcijskim oznacevalcem, ki ima prazen seznam parametrov.Rezultat funkcijske procedure ne more biti niti zapis niti tabela.

FormalParameters → “(” [ FPSection “; ” FPSection ] “)” [ “:”Qualident ]

FPSection → “VAR” ident “, ” ident “:” Type

Naj bo Tf tip nekega formalnega parametra f (privzemamo, da Tf ni odprta tabela) innaj bo Ta tip ustreznega stvarnega parametra. Ce je f referencni parameter, mora biti Ta

isti tip kot Tf ali pa je Tf tip zapisa, Ta pa njegova razsiritev. Ce je f vrednostni parameter,mora biti a skladen z f glede prirejanja (gl. razdelek A.12). V primeru, ko pa je Tf odprtatabela, mora biti a skladen z f kot tabela (gl. razdelek A.12). Dolzine f so enake ustreznimdolzinam a.

Primeri deklaracij procedur:

PROCEDURE ReadInt(VAR x : INTEGER);VAR i : INTEGER; ch: CHAR;

Page 221: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.10. DEKLARACIJE PROCEDUR 213

BEGINi := 0;Read(ch);WHILE (“0” <= ch) & (ch <= “9”) DO

i := 10∗i + (ORD(ch)−ORD(“0”));Read(ch)

END;x := i ;

END ReadInt

PROCEDURE WriteInt(x : INTEGER);(∗ 0 <= x <= 100000 ∗)VAR i : INTEGER; buf : ARRAY 5 OF INTEGER;

BEGINi := 0;REPEAT

buf [i ] := x MOD 10;x := x DIV 10;INC (i)

UNTIL x = 0;REPEAT

DEC (i);Write(CHR(buf [i ] + ORD(“0”))

UNTIL i = 0;END WriteInt

PROCEDURE WriteString(s: ARRAY OF CHAR);VAR i : INTEGER;

BEGINi := 0;WHILE (i < LEN (s)) & (s[i ] # 0X) DO

Write(s[i ]);INC (i)

ENDEND WriteString

PROCEDURE log2 (x : INTEGER): INTEGER;VAR y : INTEGER; (∗ assume x>0 ∗)

BEGINy := 0;WHILE x > 1 DO x := x DIV 2; INC (y) END;RETURN y

END log2

Page 222: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

214 JEZIK OBERON-2

A.10.2 Procedure, ki so pridruzene tipom

Globalne procedure (torej take, ki niso deklarirane lokalno znotraj druge procedure) lahkopridruzimo nekemu tipu zapisa, ki je deklariran znotraj istega modula. Take procedure sopridruzene temu tipu. Povezavo s tipom nakazuje tip glavnega parametra v naslovu dekla-racije procedure. Glavni parameter (angl. receiver) je bodisi referencni parameter zapisnegatipa T ali vrednostni parameter, ki pripada tipu POINTER TO T , pri cemer je T zapisnegatipa. Procedura je pridruzena tipu T in se obravnava, kot da je lokalna temu tipu.

Receiver → “(” [ “VAR” ] ident “:” ident “)”(sintakticna kategorija Receiver se uporablja v definiciji kategorije ProcedureHeading, ki jezapisana na zacetku razdelka A.10.)

V kolikor je procedura P pridruzena tipu T0, je implicitno pridruzena tudi vsakemutipu T1, ki je razsiritev T0. Vendar lahko tipu T1 tudi izrecno pridruzimo proceduro P ′,ki ima isto ime kot P , in tako preklicema povezavo med P in T1. Na ta nacin posane P ′

spremenjena definicija P za T1. Formalni parametri P in P ′ morajo skladen (gl. razdelekA.12). V primeru, ko se P in T1 izvazata, se mora tudi P ′ izvazati.

Ce je v oznacevalec in je P procedura, ki je pridruzena tipu, oznacuje v.P tisto proceduroP , ki je pridruzena dinamicnemu tipu v (dinamicna vezava). Pozorni bodimo, da je to lahkorazlicna procedura od procedure, ki je pridruzena staticnemu tipu v. v se prenasa kot glavniparameter P po pravilih za prenos parametrov, ki so bili opisani v razdelku A.10.1.

Ce je r glavni parameter, ki pripada staticnemu tipu T , oznacuje r.P∧ (predefinirano)proceduro P , ki je pridruzena osnovnemu tipu tipa T .

Ce ima procedura, ki je pridruzena tipu, predhodno deklaracijo, mora biti glavni pa-rameter v predhodni deklaraciji istega tipa kot glavni parameter v deklaraciji. Seznamaformalnih parametrov obeh deklaracij morata biti skladna (gl. razdelek A.12)).Primeri:

PROCEDURE (t : Tree) Insert (node: Tree);VAR p, father : Tree;

BEGINp := t ;REPEAT father := p;IF node.key = p.key THEN RETURN END;IF node.key < p.key THEN p := p.leftELSE p := p.rightEND

UNTIL p = NIL;IF node.key < father .key THEN father .left := nodeELSE father .right := nodeENDnode.left := NIL;node.right := NIL

END Insert ;

PROCEDURE (t : CenterTree) Insert (node: Tree);(∗ redefinition ∗)

BEGINWriteInt(node(CenterTree).width);t .Insert↑(node)

Page 223: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.10. DEKLARACIJE PROCEDUR 215

(∗ calls the Insert procedure bound to Tree ∗)END Insert ;

A.10.3 Vnaprej deklarirane procedure

Naslednji tabeli nastevata vse vnaprej deklarirane procedure. Nekatere izmed njih so ge-nericne, z drugimi besedami uporabne so z operandi vec tipov. v pomeni spremenljivko, xin n izraz, T pa tip.

Funkcijske procedure

Ime tip argumenta tip rezultata ucinekABS(x) numericen tip isti kot x absolutna vrednostASH(x, n) x, n : celost. tip LONGINT aritmeticni pomik (x ∗ 2n)CAP(x) CHAR CHAR x je crka: ustrezna velika

crka; sicer je vrednost xCHR(x) celost. tip CHAR x-ti znak po vrstiENTIER(x) realni tip LONGINT najvecje celo stevilo, ki

ne presega xLEN(v, n) v: tabela; LONGINT dolzina v po dimenziji n

n: celost. konst. prva dimenzija = 0LEN(v) v: tabela LONGINT iskot kot LEN(v, 0)LONG(x) SHORTINT INTEGER identiteta

INTEGER LONGINTREAL LONGREAL

MAX(T ) T = osnovni tip T najvecja vrednost, ki pripadatipu T

T = SET INTEGER najvecji element mnoziceMIN(T ) T = osnovni tip T najmanjsa vrednost, ki pripada

tipu TT = SET INTEGER 0

ODD(x) celost. tip BOOLEAN xMOD 2 = 1ORD(x) CHAR INTEGER polozaj znaka xSHORT(x) LONGINT INTEGER identiteta (mozna je

INTEGER SHORTINT tudi izguba informacije)LONGREAL REAL

SIZE(T ) poljuben tip INTEGER stevilo bajtov zapredstavitev T

Page 224: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

216 JEZIK OBERON-2

Prave procedure

Ime tipi argumentov ucinekASSERT(x) x: izraz tipa BOOLEAN prekinitev programa,

ce x ni resnicnoASSERT(x, n) x: izraz tipa BOOLEAN prekinitev programa,

ce x ni resnicnoCOPY(x, v) x: znakovno zaporedje ali v := x

tabela ;v: znakovna tabelaDEC(v) v: celostevilcni tip v := v − 1DEC(v, n) v, n: celostevilcni tip v := v − nEXCL(v, x) v: SET; x: celost. tip v := v − xHALT(n) n: celost. tip program se koncaINC(v) v: celostevilcni tip v := v + 1INC(v, n) v, n: celostevilcni tip v := v + nINCL(v, x) v: SET; x: celost. tip v := v + xNEW(v) v: kazalec na zapis ali nova spremenljivka v∧

tabelo fiksne dolzineNEW(v, x0, . . . , xn) kazalec na odprto tabelo nova spremenljivka v∧

xi: celost. tip z dolzinami x0, . . . , xn

Procedura COPY omogoca prirejanje znakovnega zaporedja ali znakovne tabele, ki vse-buje zakljucni znak 0X neki drugi znakovni tabeli. Ce je potrebno, se prirejena vrednostskrajsa na dolzino, ki je enaka dolzini ciljne tabele minus 1. Ciljna tabela bo vedno vse-bovala zakljucni znak 0X. Pri procedurah ASSERT(x, n) ter HALT(n) je interpretacija nprepuscena konkretnemu prevajalniku.

A.11 Moduli

Modul je zbirka deklaracij konstant, tipov, spremenljivk in procedur, skupaj z zaporedjemstavkov, katerih namen je prirejanje zacetnih vrednosti spremenljivkam. Modul predstavljaneko besedilo (program), ki ga je mozno prevajati kot celoto, loceno od drugih programov.

Module → “MODULE” ident [ ImportList ]DeclarationSequence [ “BEGIN” StatementSequence ] “END”

ImportList → “IMPORT” Import “, ” Import “; ”Import → [ Ident “ := ” ] identSeznam uvozenih modulov (ImportList) nasteva module, ki jih deklarirani modul uvaza.

Ce modul M uvaza modul A in ce A izvaza ime x, se na x v M sklicujemo z A.x. Ce pa jenavedba uvozenega modula A v obliki B := A, ima oznacevalec obliko B.x. Slednje omogocauporabo okrajsav za uvozene module. Modul ne more uvazati samega sebe. Imena, ki sonamenjena izvozu, morajo biti v svoji deklaraciji opremljena z izvozno oznako (gl. razdelekA.4). Stavcno zaporedje, ki sledi simbolu BEGIN se izvaja v trenutku, ko je modul prikljucenk sistemu (ko se nalozi), kar se zgodi po tem, ko se prikljucijo uvozeni moduli. Iz tega sledi,da ciklicni uvoz ni dovoljen. Posamezne (brezparametrske in izvozene) procedure je moznosproziti iz operacijskega sistema, predstavljajo pa ukaze slednjega.Primer:

MODULE Trees;(∗ exports:

Page 225: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.11. MODULI 217

Tree, Node, Insert, Search, Write, NewTree∗)(∗ exports read−only: Node.name ∗)IMPORT Texts, Oberon;TYPE

Tree∗ = POINTER TO Node;Node∗ = RECORD

name−: POINTER TO ARRAY OF CHAR;left , right : Tree

END;

VAR w : Texts.Write;

PROCEDURE (t : Tree) Insert∗ (name: ARRAY OF CHAR);VAR p, father : Tree;

BEGINp := t ;REPEAT father := p;IF name = p.name↑ THEN RETURN END;IF name < p.name↑ THEN p := p.leftELSE p := p.rightEND

UNTIL p = NIL;NEW (p); p.left := NIL ; p.right := NIL;NEW (p.name,LEN (name)+1);COPY (name,p.name↑);IF name < father .name↑ THEN father .left := pELSE father .right := pEND;

END Insert ;

PROCEDURE (t : Tree) Search∗ (name: ARRAY OF CHAR): Tree;VAR p: Tree;

BEGINp := t ;WHILE (p # NIL) & (name # p.name↑) DOIF name < p.name↑ THEN p := p.leftELSE p := p.rightEND

END;RETURN p

END Search;

PROCEDURE (t : Tree) Write∗;BEGINIF t .left # NIL THEN t .left .Write END;Texts.WriteString(w , t .name↑);

Page 226: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

218 JEZIK OBERON-2

Texts.WriteLn(w);Texts.Append(Oberon.Log , w .buf );IF t .right # NIL THEN t .right .Write END

END Write;

PROCEDURE NewTree∗ (): Tree;VAR t : Tree;

BEGINNEW (t); NEW (t .name,1);t .name[0] := 0X;t .left := NIL; t .right := NILRETURN t

END NewTree;

BEGINTexts.OpenWriter(w)

END Trees.

A.12 Definicije pojmov

Celostevilcni tipi: SHORTINT, INTEGER, LONGINTRealni tipi: REAL, LONGREALStevilcni tipi: celostevilcni in realni tipi

Istovetnost tipov

Dve spremenljivki, a in b, ki pripadata tipoma Ta in Tb, sta istega tipa, v kolikor

1. Ta in Tb predstavlja isto ime ali

2. je Ta deklarirano kot enako Tb z deklaracijo oblike Ta = Tb ali

3. a in b se pojavljata na istem seznamu imen v deklaraciji spremenljivke, komponentezapisa ali formalnih parametrov, pri cemer smeta biti odprti tabeli.

Enakost tipov

Tipa Ta in Tb sta enaka, v kolikor sta

1. Ta in Tb ista tipa ali sta

2. Ta in Tb tipa odprtih tabel in sta tipa njunih elementov enaka ali sta

3. Ta in Tb procedurna tipa, katerih formalni parametri si ustrezajo.

Vsebovanost tipov

Stevilcni tipi vsebujejo (vrednosti) manjsih stevilcnih tipv na podlagi naslednje hierarhije:

LONGREAL ⊇ REAL ⊇ LONGINT ⊇ INTEGER ⊇ SHORTINT

Page 227: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.12. DEFINICIJE POJMOV 219

Razsiritev tipov (osnovni tip)

Pri deklaraciji tipa Tb = RECORD(Ta) . . .END pravimo, da je Tb neposredna razsiritev tipaTa, Tb pa je neposredni osnovni tip tipa Tb. Nek tip Tb je razsiritev tipa Ta (Ta je osnovnitip tipa Tb), v kolikor

1. sta Ta in Tb ista tipa ali pa

2. je Tb neposredna razsiritev neke razsiritve Ta.

Ce je Pa = POINTER TO Ta in Pb = POINTER TO Tb pravimo, da je Pb razsiritev Pa

(Pa je osnovni tip za Pb), v primeru, ko je Tb razsiritev Ta.

Skladnost glede prirejanja

Nek izraz e, ki pripada tipu Te, je skladen glede prirejanja s spremenljivko v, ki pripada tipuTv, ce je resnicen vsaj en od naslednjih pogojev:

1. Te in Tv sta ista tipa;

2. Te in Tv sta stevilcna tipa in Tv vsebuje Te;

3. Te in Tv sta zapisna tipa, Te je razsiritev Tv in dinamicni tip v je Tv;

4. Tv je kazalcni ali procedurni tip, e pa ima vrednost NIL;

5. Tv je enak ARRAY n OF CHAR, e je znakovno zaporedje dolzine m in velja m < n;

6. Tv je procedurni tip, e pa je ime procedure, cigar formalni parametri ustrezajo formal-nim parametrom Tv.

Tabelaricna skladnost

Stvarni parameter a tipa Ta je tabelaricno skladen s formalnim parametrom f tipa Tf , kadar

1. sta Tf in Ta ista tipa ali

2. Tf je odprta tabela, Ta je poljubna tabela, njuna tipa elementov pa sa tabelaricnoskladen ali

3. Tf je enak ARRAY OF CHAR, a pa je znakovno zaporedje.

Skladnost glede uporabe v izrazih

Za podani operator sta tipa njegovih operandov skladen glede uporabe v izrazih, kadar ustre-zajo naslednji tabeli (ki dodatno prikazuje tip vrednosti izraza). Znakovne tabele, ki jihprimerjamo, morajo imeti zakljucni znak 0X. V vseh primerih mora biti T1 razsiritev T0.

Page 228: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

220 JEZIK OBERON-2

operator prvi operand drugi operand tip rezultata+− ∗ stevilcni stevilcni najmanjsi stevilcni tip,

ki vsebuje oba operanda/ stevilcni stevilcni najmanjsi realen tip,

ki vsebuje oba operanda+ - * / SET SET SETDIV MOD celostev. celostev. najmanjsi celostev. tip,

ki vsebuje oba operandaOR & ∼ BOOLEAN BOOLEAN BOOLEAN= # <<=>>= stevilcni stevilcni BOOLEAN

CHAR CHAR BOOLEANznakovna tabela znakovna tabela BOOLEANali zn. zaporedje ali zn. zaporedje

= # BOOLEAN BOOLEAN BOOLEANSET SET BOOLEANNIL, POINTER NIL, POINTER BOOLEANTO T0 ali T1 TO T0 ali T1

proced. tip T proced. tip T BOOLEANali NIL ali NIL

IN INTEGER SET BOOLEANIS kazalec kazalec BOOLEAN

zapis zapis BOOLEAN

A.12.1 Skladnost seznamov formalnih parametrov

Dva seznama formalnih parametrov sta skladna v kolikor

1. vsebujeta isto stevilo parametrov in

2. imata isti tip rezultata ali nimata rezultata in

3. so istolezni parametri enakih tipov in

4. so istolezni parametri bodisi oboji referencnega tipa ali oboji vrednostnega tipa.

A.13 Sintaksa jezika Oberon-2

Module → “MODULE” ident [ ImportList ]DeclSeq [ “BEGIN” StatementSeq ] “END”

ImportList → “IMPORT” [ Ident “ := ” ] “, ” [ Ident “ := ” ] “; ”DeclSeq → “CONST” ConstDecl “; ” |

“TYPE” TypeDecl “; ” |“VAR” V arDecl “; ” | ProcDecl “; ” | ForwardDecl “; ”

ConstDecl → IdentDef “=” ConstExprTypeDecl → IdentDef “=” TypeVarDecl → IdentList “:” TypeProcDecl → “PROCEDURE” [Receiver ] IdentDef [ FormalPars ] “; ”

DeclSeq [ “BEGIN” StatementSeq ] “END” ident

Page 229: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.13. SINTAKSA JEZIKA OBERON-2 221

ForwardDecl → “∧” “PROCEDURE” [Receiver ] IdentDef [ FormalPars ]

FormalPars → “(” [ FPSection “; ” FPSection ] “)” [ “:”Qualident ]

FPSection → “VAR” ident “, ” ident “:” Type

Receiver → “(” [ “VAR” ] ident “:” ident “)”

Type → Qualident |“ARRAY” “[” ConstExpr “, ” ConstExpr “]” “OF” Type |“RECORD” [ “(”Qualident “)” ] FieldList “; ” FieldList “END” |“POINTER” “TO” Type |“PROCEDURE” [ FormalPars ]

FieldList → [IdentList “:” Type]

StatementSeq → Statement “; ” Statement Statement → [Designator “ := ” Expression |

Designator [ “(” ExprList “)” ] |“IF” Expr “THEN” StatementSeq “ELSIF” Expr “THEN” StatementSeq [ “ELSE” StatementSeq ] “END” |“CASE” Expr “OF” Case “ | ” Case [ “ELSE” StatementSeq ] “END” |“WHILE” Expr “DO” StatementSeq “END” |“REPEAT” StatementSeq “UNTIL” Expr |“FOR” ident “ := ” Expr “TO” Expr[ “BY” ConstExpr ] “DO” StatementSeq“END” |“LOOP” StatementSeq “END” |“WITH”Guard “DO” StatementSeq “ | ” “DO” StatementSeq [ “ELSE” StatementSeq ] “END” |“EXIT” |“RETURN” [ Expression ] ]

Case → [ CaseLabels “, ” CaseLabels “:” StatementSeq ]

CaseLabels → ConstExpr [ “..” ConstExpr ]

Guard → Qualident “:”Qualident

ConstExpr → Expr

Expr → SimpleExpr [Relation SimpleExpr ]

SimpleExpr → [ “ + ” | “− ” ] Term AddOp Term Term → Factor MulOp Factor Factor → Designator [ “(” [ ExprList ] “)” ] |

number | character | string | “NIL” |set | “(” Expr “)” | “∼” Factor

Set → “” [ Element “, ” Element ] “”Element → Expr [ “..” Expr ]

Relation → “ = ” | “#” | “ < ” | “ <= ” | “ > ” | “ >= ” | “IN” | “IS”

AddOp → “ + ” | “− ” | “OR”

MulOp → “ ∗ ” | “/” | “DIV” | “MOD” | “&”

Designator → Qualident “.” ident | “[” ExprList “]” |“∧” | “(”Qualident “)”

ExprList → Expr “, ” Expr

Page 230: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

222 JEZIK OBERON-2

IdentList → IdentDef “, ” IdentDef Qualident → [ ident “.” ] ident

IdentDef → ident [ “ ∗ ” | “− ” ]

A.14 Modul SYSTEM

Modul z imenom SYSTEM vsebuje dolocene tipe in procedure, ki so potrebni za realizacijoniskoravenskih operacij, ki so lastne posameznemu racunalniku ali prevajalniku. S takimi ele-menti na primer omogocamo naslavljanje razlicnih naprav, ki so prikljucene na racunalnik,kakor tudi ne upostevanje pravil skladnosti tipov, ki jih predpisuje definicija jezika. Pri-porocljivo je, da se uporaba teh zmogljivosti omeji le na dolocene module (ki jim pravimoniskoravenski moduli). Taki moduli po svoji naravi niso prenosljivi med racunalniskimi sis-temi in med razlicnimi izvedbami prevajalnikov za Oberon-2, so pa enostavno razpoznavnizaradi naziva modula SYSTEM v svojem seznamu uvozenih modulov. Naslednje specifikacijeveljajo za realizacijo Oberona-2 na racunalniku Ceres.

Modul SYSTEM izvaza tip BYTE, ki ima naslednje lasnosti: Spremenljivkam tipa BYTElahko prirejamo vrednosti tipov CHAR ali SHORTINT. V primeru, ko je formalni parametertipa ARRAY OF BYTE, je lahko ustrezni stvarni parameter poljubnega tipa.

Modul SYSTEM izvaza tudi tip PTR. Spremenljivkam tega tipa lahko prirejamo vre-dnosti poljubnega kazalcnega tipa. V primeru, ko je formalni parameter tipa PTR, je lahkoustrezni stvarni parameter poljubnega kazalcnega tipa.

Procedure modula SYSTEM so nastete v naslednih tabelah. Vecina je realizirana zenim samim strojnim ukazom, ki je postavljen v ukazno zaporedje, brez dejanskega klicaprocedure. Podrobnosti lahko bralec izve v prirocniku za ustrezni procesor. V tabelahpredstavlja v spremenljivko, x, y, a in n predstavljajo izraze in T predstavlja tip.

Funkcijske procedure

Ime tipi argumentov tip rezultata opisADR(v) poljuben LONGINT naslov vBIT(a, n) a: LONGINT BOOLEAN n-ti bit Mem[a]

n: celo st.CC(n celost. konst. BOOLEAN pogoj n (0 ≤ n ≤ 15)LSH(x, n) x: celost. tip, isti tip kot x logicni pomik

CHAR, BYTEn: celost. tip

ROT(x, n) x: celost. tip, isti tip kot x rotacijaCHAR, BYTEn: celost. tip

VAL(T, x) T, x: polubna tipa T vrednost xinterpretiranakot, da pripada T

Page 231: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

A.14. MODUL SYSTEM 223

Prave procedure

Ime tipi argumentov opisGET(a, v) a: LONGINT ; v := Mem[a]

v: poljubnega osnovnega,procedurnega ali kazal. tipa

PUT(a, x) a: LONGINT ; Mem[a] := vv: poljubnega osnovnega,procedurnega ali kazal. tipa

GETREG(n, v) n: celost. tip ; v := Register nv: poljubnega osnovnega,procedurnega ali kazal. tipa

PUTREG(n, x) n: celost. tip ; Register n := vv: poljubnega osnovnega,procedurnega ali kazal. tipa

MOVE(a0, a1, n) a0, a1: LONGINT Mem[a1 . . . a1 + n− 1] :=n: INTEGER Mem[a0 . . . a0 + n− 1]

NEW(v, n) v: poljuben kazal. tip dodeli se blok celicn: celostev. tip dolzine n bajtov,

naslov se priredi v

Page 232: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

224 JEZIK OBERON-2

Page 233: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Dodatek B

PREDIKATNI RACUNPRVEGA REDA

V pricujocem delu privzemamo, da je bralec seznanjem s predikatnim racunom prvega reda,namen tega kratkega poglavja pa je le ponovitev osnovnih pojmov. Snov je v glavnemsestavljena na podlagi dela Mendelson [12], je pa dostopna tudi iz stevilnih drugih virov (gl.tudi Batagelj [2]).

Logicnim trditvam v predikatnem racunu prvega reda pravimo stavki. Vsak stavek pre-dikatnega racuna prvega reda je zapis, ki je sestavljen po natancnih pravilih. Pravimo, daima predikatni racun prvega reda natancno doloceno sintakso. Simboli, ki jih uporabljamoza sestavljanje stavkov, pa so:

1. stevno neskoncno stevilo znakov za spremenljivke (x1, x2, x3 . . .); seveda je vsaka po-samezna trditev koncne dolzine in lahko vsebuje le koncno stevilo spremenljivk. Vprakticnih primerih ponavadi uporabljamo razlicne simbole za razlicne spremenljivke,npr. x, y, . . .;

2. koncno ali stevno neskoncno stevilo znakov za predikate (npr. Anj , n, j > 0, kjer n

predstavlja stevilo argumentov predikata, j pa njegov indeks). V prakticnih primerihnajpogosteje opuscamo zapis stevila argumentov in prav tako kot v primeru spremen-ljivk uporabljamo razlicne znake za razlicne predikate, namesto da bi jih razlikovali zindeksi;

3. stevno neskoncno ali koncno stevilo (vstevsi nic) znakov za funkcije (npr. fnj , n, j > 0)

(n in j imata podoben pomen kot pri predikatih in prav tako velja pripomba, da seizogibamo uporabi indeksov ter raje uporabljamo razlicne simbole za razlicne funkcije);

4. stevno neskoncno ali koncno stevilo (vstevsi stevilo nic) znakov za posamezne kon-stante (npr. ai, i > 0);

5. sintakticna simbola ( in ), logicna znaka ⊃ in ¬ ter univerzalnostni kvantifikator ∀.

Neki stavek predikatnega racuna prvega reda je sestavljen iz izrazov in elementarnih stavkov .

1. Izraz je posamezna konstanta ali spremenljivka, ali

2. izraz je fnj (e1, e2, . . . , en), pri cemer je fn

j funkcijski znak, e1, e2, . . . , en pa so izrazi;

225

Page 234: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

226 DODATEK B. PREDIKATNI RACUN PRVEGA REDA

3. izraz lahko pridobimo le na podlagi tock 1 in 2.

B.1 Primer Ce sta a1 in a2 posamezni konstanti, x, y in z spremenljivke in f2, g3 znakaza funkciji, so

a1, f2(a2, f2(a1, y)), g3(a1, x, z), (B.1)

izrazi.

Elementarni stavki so zgrajeni iz izrazov in znakov za predikate. Torej ima elementaren sta-vek obliko An

j (e1, e2, . . . , en), kjer je Anj znak za predikat, e1, e2,

. . . , en pa so izrazi.

B.2 Primer Ce uporabljamo simbole iz primera B.1 ter simbol A3 za predikat, sta elemen-tarna stavka:

A3(x, y, z), A3(a1, f2(a2, f

2(a1, y)), g3(a1, x, z)) (B.2)

In koncno so stavki predikatnega racuna prvega reda1 zgrajeni iz elementarnih stavkov napodlagi naslednjih pravil:

1. vsak elementaren stavek je stavek predikatnega racuna;

2. naj bosta A in B stavka predikatnega racuna, x pa spremenljivka. Tedaj so ¬A,A ⊃ Bin ∀xA stavki predikatnega racuna;

3. stavki predikatnega racuna so sestavljeni le na podlagi tock 1 in 2.

B.3 Primer Stavek predikatnega racuna je ∀y(∀xA21(x, y) ⊃ A1

2(y)).

Pri zapisovanju stavkov predikatnega racuna pogosto uporabljamo dolocene okrajsave inspremembe v zapisu. Na primer, funkcije in predikate pogosto raje zapisujemo v infiksnemzapisu namesto v nekoliko manj preglednem funkcijskem zapisu. Denimo, da A2 predstavljadobro znani predikat enakosti. Tedaj ustrezni elementarni stavek raje pisemo kot t1 = t2namesto A2(t1, t2). Podobno pisemo x + y namesto f2(x, y) v primeru, ko f2 predstavljasestevanje (in podobno za druge funkcije). Naslednja pomembna okrajsava je uporaba eksi-stencnega kvantifikatorja. Namesto ¬(∀x¬A(x)) pisemo ∃xA(x) (torej “Ni resnicno, da privseh x velja negacija A(x)” je enakovredno “eksistira tak x, da velja A(x)”).

Predikatni racun rabi za opisovanje trditev o elementih neke poljubne mnozice, vendarnas bo tu zanimala predvsem mnozica celih stevil . Torej moramo sedaj opisati, kako nekemustavku predikatnega racuna pripisemo pomen.

Najprej opisemo pojem mnozice prostih spremenljivk , ki pripada nekemu izrazu in natostavku predikatnega racuna. Ce je X bodisi izraz ali stavek, ki ne vsebuje kvantifikatorja∀, je njegova mnozica prostih spremenljivk, V (X), definirana povsem obicajno kot mnozicaspremenljivk, ki se pojavljajo v X. Ce pa je X stavek in ima obliko ∀xA, je V (∀xA) =V (A)−x. Z drugimi besedami, ucinek kvantifikatorja ∀ je, da spremenljivko, ki jo imenuje,izloci iz mnozice prostih spremenljivk izraza, v katerem se pojavlja. Pravimo tudi, da ∀xveze spremenljivko x (in torej ni vec prosta). Pri stavku ∀xA moramo upostevati, da sekvantifikator ∀ vedno nanasa na stavek A in da se znotraj svojega obmocja nanasa na tisteprimerke spremenljivke x, ki niso v obmocju nekega drugega kvantifikatorja znotraj A.

1Prilastek “prvega reda” se nanasa na dejstvo, da izraz, ki je argument predikata, predstavlja leposamezne elemente mnozic in ne more predstavljati nekega drugega predikata ali funkcije. Odslejbomo prilastek “prvega reda” vecinoma opustili.

Page 235: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

227

L1. A ⊃ (B ⊃ A)L2. (A ⊃ (B ⊃ C)) ⊃ ((A ⊃ B) ⊃ (A ⊃ C))L3. (¬B ⊃ ¬A) ⊃ ((¬B ⊃ A) ⊃ B)L4. ∀xA(x) ⊃ A(t) pri pogoju, da je spremenljivka x v

stavku A(x) zamenljiva s t2. Ta pogoj je izpolnjenmed ostalim tudi pri t = x, s cimer dobimo aksiom∀xA(x) ⊃ A(t).

L5. ∀x(A ⊃ B) ⊃ (A ⊃ ∀xB) v primeru, ko je A stavekbrez proste spremenljivke x.

Slika B.1: Logicni aksiomi predikatnega racuna

B.4 Primer V stavku ∀x∀z(A(x, y) ⊃ ∀x(B(x, z))) se prvi kvantifikator nanasa na argu-ment predikata A, ne pa na argument predikata B.

Spremenljivke z istim imenom, na katere delujejo razlicni kvantifikatorji, stejemo za razlicnespremenljivke. V zgornjem primeru sta spremenljivki x v predikatih A in B razlicni. Spre-menljivki, na katero deluje neki kvantifikator, pravimo, da je vezana, sicer je prosta. Vzgornjem primeru sta x in z vezani spremenljivki, y pa je prosta spremenljivka.

Stavke predikatnega racuna lahko interpretiramo kot stavke, ki se nanasanjo na celastevila, tako da vsem konstantam, funkcijskim simbolom in predikatnim simbolom pripisemoustrezen pomen, nato pa logicna simbola ¬ in⊃ interpretiramo na obicajen nacin. Na primer,ce pri stavku

∀x∀y∀z[A(x, y) ⊃ (A(y, z) ⊃ A(x, z))]

interpretiramo A kot predikat enakosti =, se zapisani stavek spremeni v obicajno pravilotranzitivnosti. V primeru, ko stavek vsebuje proste spremenljivke, je stavek resnicen alineresnicen, odvisno od vrednosti, ki jih pripisemo prostim spremenljivkam. Na primer:stavek ∀x[x · y = 0] je resnicen pri y = 0 in neresnicen sicer.

B.5 Primer Omenili smo ze, da predikatni racun uporabljamo za izrazanje trditev ali la-stnosti, ki se nanasajo na cela stevila (ali poljubno drugo mnozico). Kot primer vzemimo:“r je ostanek po deljenju x z y.” To lastnost izrazimo z naslednjim stavkom predikatnegaracuna:

∃q[x = y · q + r ∧ 0 ≤ r < y],

pri cemer simbol ∧ predstavlja logicno operacijo konjunkcije, oziroma, ce jo izrazimo z osnov-nima simboloma ¬ in ⊃, ¬(A ⊃ ¬B).

Osnovna lastnost predikatnega racuna je, da omogoca dokazovanje izpeljanih resnic izpreprostejsih, osnovnih resnic, ki jim pravimo aksiomi. Aksiome delimo na logicne, ki senanasajo na predikatni racun, ne glede na podrocje uporabe, in posebne, ki upostevajo nekoposebno podrocje uporabe. Logicni aksiomi predikatnega racuna so prikazani na sliki B.1,medtem ko sta posebna aksioma, ki se nanasata na predikat enakosti, prikazana na sl. B.2.

2Spremenljivka x v stavku A je zamenljiva s t, v primeru, ko noben prost primerek x v A ni vobmocju nekega kvantifikatorja s spremenljivko y, ki se pojavlja v t.

Page 236: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

228 DODATEK B. PREDIKATNI RACUN PRVEGA REDA

E1. ∀x[x = x] (refleksivnost enakosti)E2. x = y ⊃ [A(x, x) ⊃ A(x, y)] (zamenljivost nekaterih, ne pa

nujno vseh, prostih primerkov enakih spremenljivk)

Slika B.2: Posebna aksioma za predikat enakosti

S1. iz A in A ⊃ B sledi B (pravilo modus ponens)S2. iz A sledi ∀xA (pravilo posplositve)

Slika B.3: Pravila sklepanja za predikatni racun

1. (A ⊃ ((A ⊃ A) ⊃ A)) ⊃ ((A ⊃ (A ⊃ A)) ⊃ (A ⊃A)) (primerek aksioma L2)

2. A ⊃ ((A ⊃ A) ⊃ A) (primerek L1)3. (A ⊃ (A ⊃ A)) ⊃ (A ⊃ A)(iz 1 in 2 na podlagi S1)4. A ⊃ (A ⊃ A) (primerek L1)5. A ⊃ A (iz 3 in 4 na podlagi S1)

Slika B.4: Dokaz stavka A ⊃ A

Naj bo Γ neka mnozica stavkov. Ce imamo neko zaporedje stavkov S, katerega zadnjielement je A, in ki ima lastnost, da vsak element zaporedja bodisi pripada Γ ali pa sledi izpredhodnih elementov zaporedja na podlagi pravil sklepanja (slika B.3), pravimo, da smo Aizpeljali iz Γ. S simboli to zapisemo kot Γ |−A. Za stavek A pravimo, da smo ga dokazali, ko

velja Λ |−A, pri cemer je Λ mnozica aksiomov, ki vsebuje tako logicne aksiome (slika B.1) kotmorebitne posebne aksiome. Obicajno simbola Λ ne pisemo in ima predhodni zapis oblikokar |−A. Na sliki B.4 je prikazan primer dokaza ocitnega stavka A ⊃ A, z drugimi besedami

utemeljitev zapisa |−A ⊃ A.Naj na tem mestu povzamemo osnovne ideje, ki se nanasajo na predikatni racun in

dokazovanje:

1. trditve zapisujemo z nizi simbolov, ki so zgrajeni po natancno doloceni sintaksi;

2. izhajamo iz nekega koncnega nabora trditev, za katere privzemamo, da so resnicne(aksiomi);

3. pri neki doloceni izibiri aksiomov lahko trditve interpretiramo kot trditve, ki se nanasajona ustrezne strukture, kot je npr. kolobar celih stevil;

4. obstaja mehanicen postopek, ki preverja, ali neka trditev sledi iz predhodnih3;

5. ce zadnja trditev posredno sledi iz aksiomov, pravimo, da smo jo “dokazali”.

Spuscanje v podrobnosti predikatnega racuna (prvega reda) dalec presega okvir te knjige.Nas namen pri predhodnem izvajanju je bil le obuditi spomin na doloceno terminologijo in

3Neki postopek je mehanicen, ko si lahko predstavljamo, da ga je sposoben izvajati racunalnik.

Page 237: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

B.1. DODATNI PRIMERI UPORABE PREDIKATNEGA RACUNA 229

priklicati bralcu v spomin pojem dokaza ter idejo, kako s predikatnim racunom izrazamomatematicne resnice. Za bralca, ki ga to zanima, pa je v dodatku B.1 prikazanih nekajdodatnih primerov izpeljav in dokazov.

B.1 Dodatni primeri uporabe predikatnega racuna

V poglavju 1.2 smo opisali osnovne pojme predikatnega racuna in dokazovanja stavkov. Vsakdokaz je zaporedje stavkov, pri cemer je vsak element zaporedja bodisi aksiom ali pa sledi izpredhodnih stavkov na podlagi pravil sklepanja B.3. V praksi pa je potrebno osnovna pravilasklepanja dopolniti z novimi, izpeljanimi pravili zato, da se izognemo pretirano dolgim inzapletenim izpeljavam.

Kot elementaren primer izpeljanega pravila navajamo naslednji izrek

B.6 Izrek Naj velja |−A1 ⊃ (A2 ⊃ (. . . ⊃ An) . . .)) in |−A1, . . . |−An−1. V tem primeru

velja tudi |−An.

Dokaz. (Vaja).V matematicnem razmisljanju pogosto postopamo tako, da privzamemo resnicnost ne-

kega stavka A, nato izpeljemo iz stavka A drug stavek B in koncno povzamemo, da “iz Asledi B”, oziroma “ce velja A, velja tudi B”. Ta nacin razmisljanja povzema naslednji izrek.

B.7 Izrek (Izrek o implikaciji) Naj bo Γ mnozica stavkov, A,B sta stavka in naj veljaΓ,A|−B. V tem primeru velja tudi Γ |−A ⊃ B.

Dokaz. Naj bo B1,B2, . . . ,Bn izpeljava B iz Γ ∪ A, pri cemer je Bn = B. Z indukcijo po ibomo dokazali, da velja Γ |−A ⊃ Bi pri 1 ≤ i ≤ n. Najprej primer i = 1. B1 pripada mnozici

Γ, ali je logicni aksiom ali pa je A. B1 ⊃ (A ⊃ B1) je primerek L1 in Γ |−A ⊃ B1 velja v prvih

dveh primerih na podlagi pravila modus ponens. V tretjem primeru (B1 = A) velja |−A ⊃ B1

na podlagi A ⊃ A (gl. sl. B.4 ) in torej velja tudi Γ |−A ⊃ B1. S tem smo opravili s primerom

i = 1. Denimo sedaj, da velja Γ |−A ⊃ Bk, pri k < i. Bi je bodisi aksiom, ali pripada mnoziciΓ ali je enakoA ali pa Bi sledi na podlagi modus ponens iz nekih stavkov Bj in Bm, pri j,m < iin ko ima Bm obliko Bj ⊃ Bi. V prvih treh primerih razmisljamo kot v primeru i = 1 zgoraj.V zadnjem primeru velja na podlagi induktivne hipoteze Γ |−A ⊃ Bj ter Γ |−A ⊃ (Bj ⊃ Bi).

Vendar imamo na podlagi aksioma L2 (sl. B.1) |−(A ⊃ (Bj ⊃ Bi)) ⊃ ((A ⊃ Bj) ⊃ (A ⊃ Bi)).

Torej imamo, na podlagi modus ponens Γ |−(A ⊃ Bj) ⊃ (A ⊃ Bi) in (zopet na podlagi modus

ponens, Γ |−A ⊃ Bi). S tem je induktivni dokaz koncan. Zeleni rezultat ustreza primerui = n. 2

Na tem mestu bomo za vajo prikazali izpeljavo treh preprostih posledic aksiomov E1 inE2 (sl. B.2).

B.8 Trditev V vsaki teoriji prve stopnje z enakostjo veljajo

1. ce je t poljuben izraz, velja |−t = t (refleksivnost);

2. |−x = y ⊃ y = x (simetrija);

3. |−x = y ⊃ (y = z ⊃ x = z) (tranzitivnost).

Page 238: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

230 DODATEK B. PREDIKATNI RACUN PRVEGA REDA

Dokaz. (1) Na podlagi E1 velja |−∀x1[x1 = x1], nato pa na podlagi L4 (sl. B.1), |−t = t.

(2) Naj bo stavek A(x, x) enak x = x, A(x, y) pa x = y. V tem primeru velja na podlagiE2 |−x = y ⊃ (x = x =⊃ y = x). Ker pa iz 1 sledi x = x, je 2 posledica tavtologije

B ⊃ ((A ⊃ (B ⊃ C)) ⊃ (A ⊃ C)). (3) Naj bo stavek A(y, y) enak y = z, A(y, x) pa x = z.Iz E2 (pri zamenjanima x in y) izpeljemo |−y = x ⊃ (y = z ⊃ x = z). Vendar na podlagi

(2) |−x = y ⊃ y = x. Sedaj pa s pomocjo tavtologije (A ⊃ B) ⊃ ((B ⊃ C) ⊃ (A ⊃ C))

pridobimo |−x = y ⊃ (y = z ⊃ x = z). 2

Page 239: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Literatura

[1] Alfred V. Aho, John E. Hopcroft, and Jeffrey D. Ullman. The Design and Analysis ofComputer Algorithms. Computer Science and Information Processing. Addison-Wesley,1974. ISBN 0-07-039910-7.

[2] Vladimir Batagelj. Diskretne Strukture, zapiski predavanj, 1. zvezek. V. Batagelj, sa-mozaloz;ba, Ljubljana, 1995.

[3] I. N. Bronstein, K. A. Semendjajew, G. Musiol, and H. Muhlig. Matematicni prirocnik(prevod iz nemscine). Tehniska zalozba Slovenije, 1997. ISBN 86-365-0216-0.

[4] Viljan Mahnic. Programiranje v Oberonu. BI–TIM d.o.o., Ljubljana, 1996. ISBN 961-6046-04-7.

[5] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algo-rithms. The MIT Press and McGraw-Hill Book Company, 1992. Eighth Printing, ISBN0-262-03141-8.

[6] LLC Excelsior. Native xds-x86. Version 2.45,http://www.excelsior-usa.com/xdsx86.html

[7] John G. Kemeny, J. Laurie Snell, and Gerald L. Thompson. Introduction to FiniteMathematics. Prentice-Hall, Inc., 1974. Third Edition.

[8] Donald E. Knuth. The Art of Computer Programming, Vol. 3. Computer Science andInformation Processing. Addison-Wesley, 1973.

[9] Igor Kononenko. Nacrtovanje podatkovnih struktur in algoritmov. Zalozba FER in FRI,Ljubljana, 1996. ISBN 961-6209-02-7.

[10] Jernej Kozak. Podatkovne strukture in algoritmi. Drustvo matematikov, fizikov inastronomov SRS, Ljubljana, 1986.

[11] Zohar Manna. Mathematical Theory of Computation. McGraw-Hill Computer ScienceSeries. McGraw-Hill, 1974.

[12] Elliott Mendelson. Introduction to Mathematical Logic. D. Van Nostrand Company,Inc., Princeton, New Jersey, U.S.A., 1964.

[13] H. Mosenbock and N. Wirth. The programming language oberon-2. Technical report,Institut fur Computersysteme, ETH Zurich, October 1993.

[14] Martin Reiser and Niklaus Wirth. Programming in Oberon — Steps Beyond Pascal andModula. ACM Press, Addison-Wesley Publishing Company, 1992.

[15] Ivan Vidav. Visja matematika II. Drzavna zalozba Slovenije, Ljubljana, 1979.

231

Page 240: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

232 LITERATURA

[16] Niklaus Wirth. Systematic Programming: An Introduction. Prentice-Hall, 1973.

[17] Niklaus Wirth. Racunalnisko programiranje, 1. del. DMFA SRS, Ljubljana, 1979.

[18] Niklaus Wirth. Programming in Modula-2. Springer-Verlag, third, corrected edition,1985.

[19] Niklaus Wirth. Racunalnisko programiranje, 2. del. DMFA SRS, Ljubljana, 1985.

[20] Niklaus Wirth. Algorithms & Data Structures. Prentice/Hall International, 1986.

Page 241: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

Stvarno kazalo

Ω, 20⇒, 7Σ∗, 177Θ, 20⊃, 7λ, 184dxe, 43, 150bxc, 43¬, 7ω, 84π, 179≺, 27, 29, 142<, 177=, 177ε, 177∨, 7∧, 7a ∗ b, 88a⊗ b, 88a2b, 90a3b, 90a b, 87O, 19

ABS, 214aksiom, 7

za pogojni stavek, 7, 8za prirejanje, 8za stekalisce, 7

AL, 56algebra

linearna, 81splosna, 81

Algol, 2algoritem, 1

Bellman-Fordov, 147posploseni, 149

Boyer in Mooreov, 181, 182

Dijkstrov, 145, 147dvojiskega iskanja, 2, 14

rekurzivni, 23dvojiskega vstavljanja, 35Floyd-Warshallov, 150iskanja k-tega elementa, 54izmenicnih zamenjav, 38KMP, 178, 181Knutha, Morrisa in Pratta (gl. tudi al-

goritem, KMP), 178, 181leksikografskega urejanja, 30navadnega izbiranja, 36navadnega vstavljanja, 33navadnega zlivanja, 57navadnih zamenjav, 37pogrezanja, 44porazdeljevanja, 47, 57pozresni, 101, 102Shellov, 42simpleksni, 125, 128urejanja

izboljsani, 30navadni, 30tabel, 38

urejanja s kopico, 44urejanja s porazdelitvami, 47vstavljanja s cuvajem, 34vzporedni, 187z razvejitvijo in omejitvijo, 172z rekurzivnim razcepom, 81za 0-1 hahrbtnik, 135za deljenje, 9, 10za DFT

iterativni, 92, 98rekurzivni, 91

za iskanje po znakovnih zaporedjihnavadni, 177, 178

za maksimalni pretok, 115, 116

233

Page 242: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

234 STVARNO KAZALO

za mnozenje, 14za mnozenje dveh stevil, 8, 9za mnozenje matrik

po Strassenu, 83po Winogradu, 82

za najvecjo skupno mero, 17, 18za razvrscanje

poslov v delavnici z enim strojem, 108za topolosko urejanje, 145

antecedens, 7, 12APItem, 32, 56ArrSort, 32ASH, 214asimptoticna rast, 19avtomat

koncni, 1

Bellman, 141beseda

pomnilniska, 2BinaryIns, 35BinSearch, 3BubbleSort, 37

CAP, 214cena, 101CHR, 214cikel, 141

negativni, 141CompareStr, 30COPY, 215CopyKseq, 58, 59CopyRun, 56, 73, 76, 77CopyRunCoroutine, 73, 76, 77CrCoroutine, 73, 76cas, 33

povprecni, 49ceta, 57

navidezna, 67

datoteka, 30zaporedna, 30

DEC, 215deljenje, 81DFT, 84, 86diagram poteka, 6dinamicno zaseganje prostora, 19

diskretna Fourierjeva transformacija (gl. tudiDFT), 84

Distribute, 57, 60, 68dokaz, 5dokazovanje pravilnosti, 6, 12dokumentacija programa, 14dopustnost, 101drevo

neobetavno, 167sledi, 3, 40

Empty, 52enacba

Bellmanova, 132enacbe

Bellmanove, 141ENTIER, 214Exch, 38EXCL, 215

FCmpType, 28FCompareType, 29FCpyRun, 56FCrCoroutine, 73FileSort, 56, 73, 76FinalSwitch, 73, 76, 77Find, 54FNoParam, 56FOR, 20FPPSort, 56, 76FRdItem, 56FSeqInit, 56funkcija, 19

ciljna, 118odsekoma konstantna, nepadajoca, 133OKN, 133preskakovalna, 179, 180

FWrItem, 56

generiranjespremenljivke, 202

globinavozlisc dvojiskega drevesa, 193

goto, 39graf, 111, 140

aciklicen, 143usmerjen, 140z utezenimi povezavami, 140

Page 243: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

STVARNO KAZALO 235

HALT, 215halt, 39HeapPS, 73, 76HeapSort, 44hiperravnina, 119

mejna, 119

if a[i]Ra[j] then S, 39INC, 215INCL, 215Init, 52, 74InitInnerLoop, 69InitLoop, 57, 63InitProg, 60, 62, 68InitRd, 56, 73InitWr, 56, 73InsertionSort, 33IntSort, 56, 73invarianta, 32

zancna, 11, 14inverz, 85iskanje

k-tega elementa, 53po zaporedjih

znakovnih, 177Item, 28, 29izbiranje

navadno, 36izhod, 1izracun, 40izraz, 223izrek

o celostevilcnosti maksimalnega pretoka,115

o lokalnem pogoju za globalni maksi-mum ciljne funkcije na KPM, 124

o maksimumu ciljne funkcije na KPM,122

o max pretoku pri min prerezu, 115o zasicenih poteh, 114o zgornji meji za vrednost pretoka, 113

izvor, 111

jedro, 32jezik

formalne logike, 5programski, 12

kapaciteta, 111prereza, 113

karakteristika, 85kljuc, 29kolobar, 86komutativnost, 82, 83konsekvens, 7, 12konstanta

procedurna, 51konveksnost, 120konvolucija, 87

negativna ovita, 90pozitivna ovita, 90

kopica, 45KPM, 120

neomejena, 120omejena, 120

kvantifikatoreksistencni, 224univerzalnostni, 223

LastRun, 75, 77LEN, 214ListRank, 190LONG, 214

MakeCoroutine, 76matrika, 118MAX, 214meja

spodnja, 37Mendelson, 223Merge, 58MergeNonEmptyRuns, 69MergeRun, 58, 60, 63MergeSort, 57metoda

prestavljanja kazalcev, 189MIN, 215mnozenje, 81

matrikspremenjeno, 150

mnozenje matrik, 81po Strassenu, 83po Winogradu, 82

mnozicakonveksna

poliedrska (gl. tudi KMP), 119

Page 244: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

236 STVARNO KAZALO

modul, 28, 55ArrSort, 32FileSort, 76HeapPS, 76NRQuickSort, 51Skakac, 160Sort, 28, 29

Modula-2, 2

n-ti primitivni koren enote, 84najcenejsa pot

med vsemi pari vozlisc, 141, 149od zacetnega vozlisca, 141

NatBal2MergeSort, 60NatBalMultiMergeSort, 62negacija, 224nesingularnost, 121NEW, 215NextToLastRun, 75, 77NonEmptyInput, 74, 77NRQuickSort, 51, 52

Oberon, 2obseg, 84, 118ocenjevanje vrst, 21ODD, 215odstevanje, 81omrezje, 111operacija

osnovna, 39ORD, 215

PAL, 56PAPItem, 56PARALLEL DO, 188PARALLEL WHILE, 188parameter, 32ParListRank, 190Partition, 47, 49, 54Pascal, 2permutacija, 40PItem, 28, 32, 44, 60podatki, 1pogoj

izstopni, 15pogrezanje, 45polieder, 119polinom, 86

polprostorodprt, 119zaprt, 119

poltrak, 120PolyphaseSort, 68pomnilnik, 2

notranji, 30zunanji, 30

ponor, 111Pop, 52poraba

casa, 2, 17najmanjsa, 33najvecja, 33povprecna, 33prostora, 2, 17

porazdeljevanje, 47poskus, 158pot, 112

neusmerjena, 112zasicena, 112

pot (v grafu), 141povezava, 111

negativna, 112pozitivna, 112zasicena, 112

PRAM, 187pravilnost, 16pravilo

dobrih koncev podzaporedij, 183hevristicno, 181, 183sklepanja, 11“slabih znakov”, 183

predikatni racun prvega reda, 5, 223predstavitev polinoma

koeficientna, 86vrednostna, 86

prerez, 113prestavljanje kazalcev, 189pretok, 111prevedba, 151

0-1 nahrbtnika na najcenejse poti, 151preverjanje pravilnosti, 3, 4

s poskusi, 4z logicno analizo, 4, 5

prirejanje, 12problem

Page 245: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

STVARNO KAZALO 237

0-1 nahrbtnika, 132, 172maksimalnega pretoka, 111najcenejsih poti, 140optimizacijski, 101, 111, 131osmih dam, 161razdalje do konca seznama, 189skakacevega obhoda, 158trdnih zakonov, 164

procedurasamostojna, 73

procesor, 1zaporedni, 17

produktasociativni

zacetnih elementov seznama, 191skalarni, 118

programracunalniski, 1

programiranjedinamicno, 131, 140linearno, 111, 117

prostorpomnilni, 33, 51vektorski, 84, 118

PSeq, 56, 60, 62PStack, 52Push, 52

QuickSort, 47

racunalnik, 1vecprocesorski, 187vzporedni, 187

racunanjevzporedno, 187

RAM, 17razcep

na podprobleme, 132rekurzivni, 131

razvrscanjeposlov v delavnici z enim strojem, 105zapisov na magnetnem traku, 102

Rd, 56, 73recept

za izracun, 1rekurzija, 51relacija

rekurencna, 22

REPEAT, 11–13rezultat, 1

Select, 68, 70, 71SelectionSort, 36Seq, 56sestopanje, 157sestevanje, 81ShakerSort, 38Shellovo urejanje, 41ShellSort, 42SHORT, 215Sift, 44, 73SimpleCopyRun, 59sintaksa, 223sistem

vecprocesorskikrepko povezan, 187sibko povezan, 187

SIZE, 215Skakac, 160sklad, 19, 51sled, 3Sort, 28, 29, 47, 52, 76SortStruc, 52SpecInit, 56, 76spremenljivka

prosta, 8, 224vezana, 224

Stack, 52StackRec, 52stavek, 223

elementarni, 223pogojni, 13sestavljeni, 13

stopnica, 133Strassen V., 83stroj

abstrakten, 1Turingov, 1z enakopravnim dosegom do pomnilnika,

1SwitchCoroutine, 73, 75–77SwitchTapes, 64SYSTEM

ADR, 221BIT, 221CC, 221

Page 246: OSNOVNI ALGORITMI - lalg.fri.uni-lj.silalg.fri.uni-lj.si/~vilfan/OSNOVNI-ALGORITMI.pdf · ALGORITMI 1.1 Pojem algoritma Od bralca pri cakujemo, da je seznanjen s pojmoma ra cunalnik

238 STVARNO KAZALO

GET, 222GETREG, 222LSH, 221MOVE, 222NEW, 222PUT, 222PUTREG, 222ROT, 221VAL, 221

sahovnica, 158stevilo

celo, 224Fibonaccijevo, 66kompleksno, 85racionalno, 85

tabela, 30teoreticni pripomocek, 39TermLoop, 69tip

tabelaricni, 32tocka

ekstremna, 120trak (gl. tudi datoteka, zaporedna), 30transformacija

linearna, 85trditev, 5

izhodna, 14logicna, 223

urejanje, 27drevesno, 43leksikografsko, 30notranje, 30, 32polifazno, 64

s predurejanjem, 71, 76s kopico, 43s porazdelitvami, 47, 131zunanje, 30, 55

urejenosttopoloska, 145

ustavljivost, 16

vbvz, 188vbzz, 188vhod, 1vhodne in izhodne enote, 2vir

racunski, 3vnaprej deklarirane procedure, 214vozlisce, 111vrednost, 101vrsta

aritmeticna, 20geometricna, 21

vstavljanjedvojisko, 35navadno, 32, 33s cuvajem, 34

WHILE, 11, 13Winograd S., 82Wirth, 2Wr, 56, 73

zahtevnostcasovna, 49

zakono ohranjanju pretoka, 112

zamenjaveizmenicne, 38navadne, 36, 37, 40

zanka, 20zaokrozanje stevil, 2zaporedje

znakovno, 177zaporedno izvajanje operacij, 2zbvz, 188zbzz, 188zlivanje

naravno, 57navadno, 55uravnotezeno, 57

dvosmerno, 59vecsmerno, 61

vecsmerno, 57