You are on page 1of 17

Aszals Lszl

Informatikai algoritmusok

mobiDIK knyvtr

Aszals Lszl

Informatikai algoritmusok

mobiDIK knyvtr SOROZATSZERKESZTO Fazekas Istvn

Aszals Lszl

Informatikai algoritmusok
Szakmai segdanyag Programtervez matematikusok rszre o els kiads o

mobiDIK knyvtr Debreceni Egyetem Informatikai Kar

Copyright c Aszals Lszl, 2006 Copyright c elektronikus kzls mobiDIK knyvtr, 2006 mobiDIK knyvtr Debreceni Egyetem Informatikai Kar 4010 Debrecen, Pf. 12 http://mobidiak.unideb.hu

A m egyni tanulmnyozs cljra szabadon letlthet . Minden egyb felhasznls u o csak a szerz el zetes rsbeli engedlyvel trtnhet. o o A m a A mobiDIK nszervez mobil portl (IKTA, OMFB-00373/2003) s a u o GNU Itertor, a legjabb genercis portl szoftver (ITEM, 50/2003) projektek keretben kszlt.

Tartalomjegyzk
I. Binomilis kupacok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1. Binomilis fk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2. Binomilis kupac felptse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3. Binomilis kupacok m veletei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 u II. Fibonacci-kupacok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1. Fibonacci-kupac felptse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2. Fibonacci-kupac m veletei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 u III. Maximlis folyamok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1. Ford-Fulkerson algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2. El folyam algoritmusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 o

I. fejezet

Binomilis kupacok
A korbban mr megismert kupacok esetn a minimlis elem megkeresse konstans, a kupac valamely elemnek a trlse logaritmikus bonyolultsg volt. A kupacba szrs (a tmb megnyjtsa egy elemmel) szintn megoldhat logaritmikus bonyolultsggal, csak az j elem s osei esetn kell a beszr rendezsben hasznlt ciklusmagot egyszer vgrehajtani. A kupacok sszef zse viszont lnyegben egy u j kupac felptst jelenti, teht lineris bonyultsg.

1. Binomilis fk
Egy j adatszerkezet, a binomilis kupacok esetn a kupacok egyestse mr egyszer bb, logaritmikus bonyolultsg. u A binomilis kupac binomilis fk halmaza lesz. Lssuk el szr ennek a deno cijt! A B0 binomilis fa egyetlen (gykr) cscsbl ll. A Bk binomilis fa kt sszekapcsolt Bk1 binomilis fbl ll: az egyik gykrcscsa a msik gykrcscsnak legbaloldalibb gyereke. A Bk binomilis fra fennllnak a kvetkez o tulajdonsgok: 2k cscs van. a magassga k. az i-dik mlysgben pontosan k cscs van. i a gykrcscs fokszma k, ami nagyobb, mint brmely ms cscs fokszma; msrszt, ha a gykrcscs gyerekeit balrl jobbra haladva megszmozzuk k 1, k 2, . . . 0-val, akkor az i gyerek egy Bi fa gykrcscsa.

2. Binomilis kupac felptse


Egy H binomilis kupac binomilis fk olyan halmaza, amely kielgti a kvetkez binomilis kupac tulajdonsgokat: o H minden binomilis fja kupac rendezett, azaz egy cscs kulcsa nagyobb, vagy egyenl mint a szl je kulcsa. o o H-ben legfeljebb egy olyan binomilis fa van, melyben a gykrcscsnak egy meghatrozott fokszma van.
9

10

I. BINOMILIS KUPACOK

A msodik felttel alapjn az n cscsot tartalmaz kupac sztbomlik 2i cscsot tartalmaz, klnbz fkra, amelyekb l gy csak ln n + 1 lehet. o o Az albbi programokban a kvetkez jellseket hasznljuk: az x cscs kulcs o mez jre x.kulcs, az x cscs szl jre az x.apa, az x cscs legbaloldalibb o o (legid sebb) gyerekre x.gyerek, az x cscstl jobbra kvetkez cscsra az o o x.testver, az x cscs gyerekeinek szmra az x.fokszam jellssel hivatkozunk. Gykrcscsok esetn a x.testver a kvetkez gykrre mutat, vagy o Nil rtket kap. A gykrcscsok ezen lncolt listjra a H.fej-jel hivatkozunk.

3. Binomilis kupacok muveletei


3.1. j kupac ksztse
Egy res binomilis kupac ksztse (BINOMILIS-KUPACOT-LTREHOZ) csak abbl ll, hogy a H.fej-et Nil-re lltjuk. Ezrt a bonyolultsg konstans.

3.2. Minimlis kulcs megkeresse


Mivel a kupacot alkot binomilis fk kupacrendezettek, gy a gykrelemek kztt talljuk meg a minimlis kulcs elemet. Ezrt a fggvny bonyolultsga O(ln n). Function BINOMILIS-KUPACBAN-MIN(H) Input: H binomilis kupac Output: H minimlis kulcs elemnek a cme
1 2 3 4 5 6 7 8 9 10 11

y N IL x H.f ej min while x = N IL do if x.kulcs < min then min x.kulcs yx endif x x.testver endw return x

3.3. Kt binomilis kupac egyestse


Mivel a binomilis kupac dencija alapjn a listban nem lehet kt ugyanolyan fokszm binomilis fa, gy ha kt ilyen Bk fval tallkozunk, akkor kett jk o

3. BINOMILIS KUPACOK MUVELETEI

11

sszef zsvel alkotunk egy Bk+1 ft. Az sszef zst a BINRIS-SSZEKAPu u CSOLS rutin valstja meg. Mivel itt csak ngy rtkads trtnik, konstans a bonyolultsg.

Procedure BINOMILIS-SSZEKAPCSOLS(y,z) Input: y,z binomilis fk gykrelemeinek cmei Eredmny: y-t z al f zi u


1 2 3 4

y.apa z y.testver z.gyerek z.gyerek y z.f okszam z.f okszam + 1

A BINOMILIS-KUPACOKAT-EGYEST fggvny felhasznl egy sszefsl rutint, mely egy olyan listt kszt, melyben a binomilis fk mret szerint o nvekv sorrendben tallhatak. Ha az eredeti fk is ilyen alakban voltak, akkor o ez az sszefsls a kt kupacban szerepl binomilis fk szmval lineris bonyo olultsg. A rutin vgigfut az gy kapott lista elemein, s szksg szerint az azonos mret fkat sszekapcsolja. Ennek megfelel en a teljes bonyolultsg a cscsok u o szmnak logaritmusa.

3.4. Cscs beszrsa a kupacba


Ez hrom lpsb l ll. Els knt ltre kell hozni egy res kupacot, majd mo o sodik lpsben ebbe beszrni az egyetlen cscsunkat. Ezutn nem marad ms, mint ezt az j kupacot egyesteni a rgivel.

3.5. Minimlis kulcs cscs kivgsa


A minimlis kulcs cscsra a gykrelemek kztt tallunk r. Ezt a lncolt listt kell vgignzni a minimlis elemrt. Ezutn egy j, res kupacot kell kszteni, s verem mdjra ki kell b vteni a minimlis elem fja gykernek o aival. Mivel a magasabb fokszm gyerekek vannak korbban, gy ezek kerlnek htra az j listban. A minimlis elemhez tartoz ft trlni kell az eredeti listbl, s ennek eredmnyt egyesteni kell az gyerekekb l szrmaz kupaccal. o

3.6. Kulcs cskkentse


Ha a kulcsot egy valban kisebb rtkre kvnjuk cskkenteni, akkor az adott cscs szlein kell vgigfutni, s a beszr rendezshez hasonlan kell el retolni o (felbuborkoztatni) a cskkentett kulcs elemet.

12

I. BINOMILIS KUPACOK

Function BINOMILIS-KUPACOKAT-EGYEST(H1 ,H2 ) Input: H1 s H2 binomilis kupac Eredmny: A kt kupacot egyesti binomilis kupacc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

H BINOMILIS-KUPACOT-LTREHOZ() H.f ej BINOMILIS-KUPACOKAT-SSZEFSL(H1 ,H2 ) if H.fej=NIL then return H w N IL x H.fej y x.testvr while y = N IL do if x.fokszm = y.fokszm or (y.testvr = N IL and y.testvr.fokszm = x.fokszm) then wx xy else if x.kulcs y.kulcs then x.testvr y.testvr BINOMILIS-SSZEKAPCSOLS(y, x) else if w = nil then H.fej y else w.testvr y endif BINOMILIS-SSZEKAPCSOLS(x, y) xy endif endif y x.testvr endw return H

3.7. Cscs trlse


Ez nem ll msbl, mint a cscs kulcsnak lehet legkisebbre cskkentsb l, o o s ehhez kapcsoldan az el z rutin meghvsbl, majd a minimlis kulcs elem o o trlsb l. o

II. fejezet

Fibonacci-kupacok
Bizonyos gyakorlati feladatokban nincs gyakran szksg elemek trlsre. Ekkor a korbban logaritmikus bonyolultsg rutinok helyett kzel konstans bonyolultsgakat is hasznlhatunk.

1. Fibonacci-kupac felptse
A korbbihoz hasonlan a Fibonacci-kupac is kupac-rendezett fk gy jtemu nye. Viszont a kupac-rendezett fk nem felttlenl binomilis fk. A binomilis kupacokban a fk a mret szerint rendezve voltak. Itt ilyen rendezs nincs. Azrt, hogy knnyebben mozoghassunk a gykerek illetve a testvrek kztt, a korbbi egyirnyban lncolt listkat dupln lncolt ciklikus listk vltjk fel. Termszetesen kt ilyen dupln lncolt ciklikus lista sszef zse konstans bou nyolultsg. A cscsoknl feljegyezzk a gyerekek szmt. A binomilis kupacnl a fej a gykrlista elejre, a legkisebb fra mutatott. Itt a H.min a minimlis kulcsot tartalmaz fa gykerre, azaz a minimlis kulcs elemre mutat.

2. Fibonacci-kupac muveletei
2.1. Minimlis kulcs megkeresse
A kupac min mutatja pont ezt adja meg, nem kell keresni.

2.2. j Fibonacci-kupac ltrehozsa


Itt is egy res szerkezetet kell kszteni, ami konstans bonyolultsg.

2.3. Egy cscs beszrsa egy kupacba


A cscshoz tartoz adatokat kell aktualizlni, berni a kulcsrtket, belltani, hogy nincs gyereke, majd a kupac gykrlistjba kell beszrni ezt a cscsot. Vgl ha a cscs kulcsrtke kisebb, mint a kupachoz tartoz minimum, akkor erre a cscsra kell irnytani a mutatt. A binomilis kupacokra jellemz sszevons itt o elmarad.
13

14

II. FIBONACCI-KUPACOK

2.4. Kupacok egyestse


A kt kupac gykrlistjt kell egyesteni, s meg kell vizsglni, hogy melyik minimlis elem kisebb, mert ez lesz az j minimlis elem.

2.5. Minimumcscs kivgsa


A binomilis kupachoz hasonlan itt is gykrlistba gy jtjk a minimlis u elem gyerekeit, amire most hasznlhatjuk az eredeti listt is. Viszont az elhalasztott sszevonsokat is most hajtjuk vgre. Ehhez felhasznlunk egy tmbt, mely az ifokszm cscsok helyt tartalmazza. A gykrlistn vgiglpkedve ha egy olyan fokszm cscsot tallunk, mely mg nem szerepelt, akkor azt a tmb megfelel o helyn feljegyezzk. Ha olyan fokszmra akadunk, amelyet mr feljegyeztnk, akkor az aktulis s feljegyzett fkat egyestjk a gykrelemek kulcsai alapjn. Termszetesen az j ft is ssze kell vetni a tblzattal. Miutn a gykrlistt bejrtuk, a feljegyzett cmekb l kell az j gykrlistt sszelltani egy ciklusban, s o a ciklusmagban gyelni a minimlis elemet.

2.6. Kulcs cskkentse


Ha a kulcs cskkentse utn az adott elem s apja kztt a kupac tulajdonsg mr nem ll fenn, akkor az adott elemet le kell vlasztani a szl r l s a oo gykrlistba beszrni, majd ssze kell hasonltani a minimlis elemmel, s ha szksges azt aktualizlni.

2.7. Cscs trlse


A cscs kulcsnak minimlisra (minusz vgtelen) cskkentse utn a minimlis cscsot kell trlni.

III. fejezet

Maximlis folyamok
Egy slyozott grfot nem csupn gy lehet elkpzelni, mint egy trkpet, ahol az egyes cscsok a vrosokat, az lek a kztk meglv utakat jellik, a slyok o pedig az adott t megttelvel jr kltsget (kilomter, forint, stb). Felfoghatjuk gy is, mintha az lek egy hlzat elemei lennnek, s a sly pedig kapacitst jellne, azaz vzvezetk esetn megadn, hogy egy csvn mennyi vz folyhat t egysgnyi id alatt; villamos hlzat esetn pedig megadhatn, hogy egy vezetk o milyen er ssg ramot br el; kzthlzat esetn megadhatn, hogy az egyes o u buszmegllk kztt napjban hny utast kpesek a buszok szlltani. Ezekben az esetekben a grf egy cscst termel nek (forrsnak) tekintjk, o ahonnan a grf egy msik cscsba a fogyasztba (nyel be) ramlik a vz, ram, o illetve a lakossg. Feltesszk, hogy a grf ugyanolyan iramban termeli a termket, mint ahogy azt a fogyaszt felhasznlja, s a grf tbbi cscsban nem halmozdnak fel a termkek. Termszetesen merl fel az az alapvet krds, hogy egy adott o grf esetn mennyi lehet az maximlis mennyisg, ami eljuthat a termel t l a fooo gyasztig, illetve ekkor melyik len mennyi mennyisget kell szlltani.

1. Ford-Fulkerson algoritmus
A G = (E, V ) irnytott grfot, ha minden (u, v) E lnek adott egy nemnegatv c(u, v) kapacitsa, hlzatnak nevezzk. (Ha (u, v) E, akkor c(u, v) legyen 0.) A termel t s-sel, a fogyasztt t-vel jelljk. Feltesszk, hogy a grf o minden cscsa rajta van valamely s-b l t-be vezet ton. o o Hlzati folyamnak nevezzk azt a f : V V R fggvnyt, melyre a kvetkez k teljeslnek: o f (u, v) c(u, v) minden u, v V esetn, f (u, v) = f (v, u) minden u, v V esetn, vV f (u, v) = 0 minden u V {s, t} esetn. Az f (u, v) rtket az u-bl v-be vezet len a folyam rtknek nevezzk. A o folyam negysga a f = vV f (s, v). Feladatunk a maximlis folyam meghatrozsa. Legyen adott egy f folyam. Egy (u, v) l rezidulis kapacitsa legyen a kvetkez : cf (u, v) = c(u, v) f (u, v), magyarul a kihasznlatlan kapacits. Adott f o folyam esetn denilhat az f -hez tartoz Gf = (V, Ef ) rezidulis hlzat, ahol Ef = {(u, v) V V cf (u, v) > 0}.
15

16

III. MAXIMLIS FOLYAMOK

El fordulhat hogy (u, v) E, m (u, v) Ef . Mindenesetre egy l csak akkor o szerepelhet a rezidulis hlzatban, ha az l, vagy a fordtottja szerepel az eredeti grfban. Ezzel a rezidulis grf leinek szma fellr l korltozhat az eredeti grf o leinek ktszeresvel. A rezidulis hlzatban egy s-b l t-be vezet utat javttnak neveznk. A p o o javtt kapacitsa cf (p) = min{cf (u, v)|(u, v) p-beli l}. Procedure FORD-FULKERSON(G,s,t) Input: G grf, s forrs, t nyel o Eredmny: f maximlis folyam
1 2 3 4 5 6 7 8 9 10 11

forall the (u, v) E do f [u, v] 0 f [v, u] 0 endfall while Van s-b l t-be p t Gf -ben do o cf (p) min{cf (u, v)|(u, v) p} forall the (u, v) p do f [u, v] f [u, v] + cf (p) f [v, u] f [u, v] endfall endw

A kapacitsok rendszerint egsz szmokknt vannak megadva. (Racionlis szmok esetn a kzs osztval beszorozva jra egsz szmokhoz jutunk.) Ekkor a maximlis folyam rtke is egsz. Ennek |E|-szorosa adja a bonyolultsgot, ha az utakat a rezidulis grfban szlessgi keresssel hatrozzuk meg. Ha a kezdetben a legrvidebb utakkal dolgozunk, majd sorra haladunk a hosszabbak fel, akkor a bonyolultsg O(V E 2 ) lesz.

2. El folyam algoritmusok o
Ha a hlzati folyam dencijban a harmadik pontot az albbira cserljk, akkor az el folyam dencijt kapjuk: vV f (u, v) 0 minden u V {s} eo setn. (Magyarul megengedjk, hogy az egyes cscsokban felhalmozds legyen). A feleslegfolyamon az albbi rtket rtjk: e(u) = vV f (u, v). Az algoritmus sorn kezdetben a forrsbl kivezet minden let maximlis kao pacitssal zemeltetnk. A grf cscsai bizonyos magassgban helyezkednek el, amelyek az algoritmus futsa sorn nvekedhetnek. A magasabban fekv cscsoko bl a felesleget az lek mentn a lentebb elhelyezked cscsokba pumplhatjuk o t. Ha egy cscsban felesleg van s innen indul teltetlen l, de nem pumplhatunk bel le, akkor ezt a pontot valamely teltetlen lnek msik cscsa fl emelhetjk o (megemels).

2. ELOFOLYAM ALGORITMUSOK

17

Procedure PUMPLS(u,v) Input: u, v cscsok Eredmny: A tlfolysbl tadunk v-nek


1 2 3 4 5

df (u, v) min(e[u], cf (u, v)) f [u, v] f [u, v] + df (u, v) f [v, u] f [u, v] e[u] e[u] df (u, v) e[v] e[v] + df (u, v)

Procedure MEGEMELS(u) Input: u cscs Eredmny: u magassga nvekszik


1

h[u] 1 + min{h[v]|(u, v) Ef }

Procedure INDUL-ELFOLYAM(G,s) O Input: G grf, s forrs Eredmny: indul el folyamot kszt o


1 2 3 4 5 6 7 8 9 10 11 12 13 14

forall the u V do h[u] 0 e[u] 0 endfall forall the (u, v) E do f [u, v] 0 f [v, u] 0 endfall h[s] |V | forall the u {(u, v) E} do f [s, u] c(s, u) f [u, s] c(s, u) e[u] c(s, u) endfall

Az ltalnos el folyam algoritmus kezdetben meghvja az INDUL-ELOFOo LYAM rutint, majd egy ciklus addig fut, amg a PUMPLS vagy a MEGEMELS felttelei teljeslnek. Ekkor a ciklusmagban a megfelel m velet hajtdik vo u gre. Bizonyts nlkl megjegyezzk, hogy ez a rutin minden esetben megadja a maximlis folyamot.