Алгоритмы
Алгоритмы
PAIE?KA PAPRASTAME S?RA?E
1.1. Nuosekli paie?ka
Tegu ?ra?ai i?d?styti atsitiktinai kaip buvo ?ra?yti. Reikia surasti duot?
?ra?? pagal rakt?. Nuosekliai ie?kant reikia per?i?r?ti visus ?ra?us
nuosekliai.Vid.per?i?r?? ?ra?? sk. ie?kant yra Lap =L/2. Jei ?ra?o n?ra
teks per?i?r?ti visus ?ra?us L. Tarkim ie?komo ?ra?o su tikimybe p0 n?ra
s?ra?e, tada vid. per?i?r?t? ?ra?? sk. Lap=L*p0+(i(1L (i*pi ); pi=1-p0/L.
Ie?kant ?ra?o sutvarkytame faile(?ra?ai i?d?styti pagal rakt?) reikia
per?i?r?ti i? eil?s, tod?l vid. per?i?r?t? ?ra?? sk. tas pats: Lsp=L/2. Jei
ie?komo ?ra?o n?ra, tai paie?ka nutraukiama kai eilinis raktas bus didesnis
u? u?duot?. Atliekant k ?ra?? paie?k? nesutvarkytame faile vid. per?i?r?t?
?ra?? sk. Lkap = k * L / 2.
1.2. Paie?ka interpoliavimas
Jei s?ra?ai sur??iuoti ir ?inomas pirmo ?ra?o raktas K(1) ir paskutinio
K(n) tai galima apskai?iuoti p=X-K(1)/K(n)-K(1). X-ie?komo ?ra?o
raktas.Paie?k? pradedam nuo ?ra?o kurio numeris p*n.
1.3. Binarin? paie?ka
Naudojama sur??iuotame masyve. Jis dalinamas pusiau ir ie?komas raktas
lyginamas su vidurio raktu ir t.t.. Idealus masyvo dydis 2n-1.Jei 31 ?ra?as
reik?s 5 ?ingsni?, kad surasti ?ra?? 31(25-1. Bendru atveju 2n-1-1< N ( 2n-
1. Kai ?ra?? sk. bet koks, tai naudojami tokie alg.:
1) Pos?ra?io rib? nustatymo metodas. I?kiriame 2 markerius: V vir?utiniam
adresui ir A apatiniam adresui. Vidurinio ?ra?o adresas F(( (V+A) / 2 (.
Ie?komas ?ra?o raktas k palyginamas su F. Jei k(Fk, tai ?ra?as surastas,
jei k Fk, tai imam apatin? dal?, tada V(F+1, o A i?lieka tas pats ir t.t..
Toks dalinimas atliekamas tol, kol nepasidaro A(V. Rekurentin? lygtis
apra?anti max palyginim? sk. binarin?je paie?koje yra:
f(n)({1, n(1 f( ( n/2 ( )+1, n>1. Sprend?iant rekurentin? formul? galim
u?ra?yti: f(n) ( f( (n/2( ) + 1 ( f( (n/21( ) + 1(( f( (n/22( )+1) +
1 ( f( (n/22( )+2 (...( f( (n/2i( ) + i, kol
( n/2i ((1; i((logn(. f(n)((logn(+1 arba f(n) ( (log (n+1)( . Vid.
palyginim? sk. ideliu atveju kai n ( 2k-1:
f(n)(1* 1/n + 2*2/n + 3*4/n +...+ ((log n( + 1)*2k-1/n ( 1/n * (i(1(log
n(+1 (i * 2i-1). 2k-1-1F1, tai ie?komas
?ra?as yra antroje dalyje, kuri ma?esn? u? pirm?j?.
2r-1-12. Tas dvi dalis galim dalinti dar
pusiau. T(n) ( T(2k) ( 2T(2k-1)+2 ( 2(2T(2k-2) + 2) +2 ( 22T(2k-2) + 22 +2
( 2k-1T(2) + 2k-1 +...+ 23 +22 +2 ( 2k-1 + 2k-1 + 2k-2 + ... + 23 +22 +2 (
n+2k-1-2 ( n+n/2-2 ( 3n/2-2. Atliekant toki? skaidymo proced?r?, algoritmo
sud?tingumas suma??ja.
Rekurentini? lyg?i? sprendimas
T(n) ( {b, n(1aT(n/c) + bi, n>1
a,b,c-teigiamos const.n(ck; k(log cn.
T(1) ( b
T(c) ( aT(1) + bc ( ab + bc ( (1+a/c);
T(c2) ( aT(c) + bc2 ( a(ab + bc) + bc2 ( a2b + abc + bc2 ( bc2(1+ a/c +
a2/c2) ......
T(n) ( T(ck) ( aT(ck-1) + bck ( bck(1+a/c+a2/c2+...+ak/ck) . T(n) (
bn(i(0logcn (a/c)i. Jei ac, turim did?jan?i? geometrin? progresij?. Tuomet T(n)
greitai did?ja did?jant n, tai eksponentinio sud?tingumo algoritmas.
U?davin? suskaid?ius ? 4 dalis ir toki? dali? pa?mus 4 – ias: a=c=4,
gauname ((nlog4n), log2n > log4n. Kas bus, kai n?ck? I?vestos formul?s
netinka, bet pa?mus atvej?, kai n’=ck > n, i?vados galioja. U?davinys gali
b?ti sprend?iamas su rekursija arba be jos, ta?iau u?davinio sud?tingumas
nepasikei?ia. Su rekursija algoritmas sprend?iamas ?iek tiek ilgiau.
T Apie rekurentin?s lygties tipo T(n)=aT(n\c)+f(n), kur a?1, c?1, f(n)-
teigiama f-ja. 1) Jei f(n)= ((n(logca)-() ,tai T(n)= ((nlogca). 2) Jei
f(n)= ((nlogca) ,tai T(n)= ((nlogca . log n. 3) Jei f(n)= ((n(logca)+()
,tai T(n)= ((f(n)), jei af(n\c)?bf(n) (b>1 dideliems n).
Balansavimas (skaidymas ? vienodas dalis). Reikia sur??iuoti n ilgio masyv?
did?jimo tvarka. 1.surandam min, kur? sukei?iam su pirmu, po to i? (n-1)
elemento surandam min ir sukei?iam su antru ir t.t.. Rekursyvin? lygtis
apra?anti palyginim? sk.: T(n) ( {0, n(1T(n-1)+n-1, n>1 ;
T(n) ( n(n-1)/2, o algoritmo sud?tingumas ((n2). ?ia skaldymas ? dvi
nelygias dalis: ? vieno elemento ir (n-1).2. Gaunamas suskald?ius u?davin?
? dvi lygias dalis ( n/2. Tarkim, kad n ( 2k. Viena dalis nuo x1 iki xn/2 ,
o kita nuo xn/2+1 iki xn. ?ias dalis sur??iuojam ir sujungiam palyginant
minimalius elementus. Sujungimui reiks maksimum n-1 palyginim?. Tok?
skaidym? galima rekursyviai t?sti toliau, kol lieka dalyse po 1 element?.
Rekursyvin? lygtis apra?anti tok? algoritm? yra:
T(n) ( {0, n(1 2T(n/2) + n - 1, n>1.
?io algoritmo sud?tingumas (( n log n).
Dinaminis programavimas.
Kartais galima efektyvius algoritmus gauti naudojant dinamin? programavim?.
?iuo b?du reik?t? skai?iuoti visus dalinius u?davnius, bet sprend?iami nuo
ma?? prie dideli?. Atsakymai prisimenami lentel?je ir u?daviniai jungiami,
kad b?t? i?spr?stas visas u?davinys ir gautas optimumas. Pvz. sudauginant n
matric? yra labai svarbus daugybos eili?kumas, kuris nulemia bendr? veiksm?
skai?i?. Pa?ymim mi j minimalus veiksm? sk. dauginant matricas:
Mi*Mi+1*...*Mj, kur 1 ( i < j ( n. Kai M ( M1*M2*...*Mn, tai j? mati?kumas
yra r0*r1*r2*...*rn.
mi j ( {0, i(j MIN( mik + mk+1, j + ri-1 rk rj ),
j > i, i ( k < j (1).
M` (Mi*Mi+1*...*Mk, [ri-1*rk]. Min vei-ksm? sk. mi,k.
M``(Mk+1 *Mk+2 *... * Mj, [rk*rj].
Atliekant ?i? daugyb? min veiksm? sk. mk+1, j, o sudauginant M` su M``,
min veiksm? sk. ri-1 rk rj. Tai atliekam tol kol negaunam m1n.1-a lygtis
ya dinaminio programavimo rekurentin? lygtis. mi,j reik?m?s skai?iuojamos
tvarka, kai did?ja indeks? sk. I? prad?i? skai?iuojam mi,i( 0 (visiem i),
toliau mi, i+1, po to mi, i+2, kol neprieinam m1n.
R??IAVIMO ALGORITMAI
K-ma?i? korte?? r??iavimas
Tegul mes turime sek? A1 A2 ... An k-ma?i? korte??, t.y., A erdvinis Ai
elementas, sudarytas i? ai1 ai2 ... aik.Reikia ?i? sek? r??iuoti taip: B1
B2 ... Bn, kad visiem i Bi ( Bi+1. R??iavimas atliekamas k kart? pereinant
per duot? sek?. Pirm? kart? atliekamas r??iavimas pagal k-?j? komponent?.
Antr? kart? pagal (k-1) komponent? ir t.t. Pr?jus pagal i-?j?, tur?sim
s?ru?iuot? sek?. Kiekviena skiltis ai j yra nuo 0 iki m-1. Reikia
organizuoti m pagalbini? eili? Q(j), kur j ( 0,...,m-1, kurios i? prad?i?
turi b?ti tu??ios. Duomenis A1 A2 ... An i? prad?i? sura?om ? s?ra?? EIL?.
Paimam eilin? korte?? Ai i? EIL?S ir patalpinam ? pagalbin? eil? Q(j) pagal
analizuojamos komponent?s reik?m?. Taip darom tol, kol bendra EIL?
i?tu?t?ja. Visi korte?ai atsiduria pagalbin?se eil?se. Po to jie suduriami:
Q(0) Q(1)...Q(m-1) ir jie sudaro vien? bendr? eil? EIL?. Kai praeinam pro
visas komponentes, tai EIL? bus sur??iuota. Algoritmo sud?tingumas yra
tiesinis ([(n+m)/k]. Naudoti ?? metod? neverta, kai n yra ma?as.
Nevienodo ilgio korte?? r??iavimas
Kad suvienodinti korte?? ilgius galima priekyje prira?yti nulius, ta?iau
tai ne efektyvu, nes bus bereikaling? daug per?i?r?jim?. Tuomet tegul lmax-
korte?? maksimalus ilgis, tai reikia i? prad?i? sur??iuoti maksimalaus
ilgio korte?us pagal l max paskutin? komponent?. Reik?s lmax kart? r??iuoti
visus korte?us.Antr? kart? reikia r??iuoti korte?us, kuri? ilgis lmax -1 ir
jau sur??iuotus pagal paskutin? komponent?, kuri? ilgis lmax. Ir paskutin?
kart? lmax per?jus per vis? s?ra??, bendram s?ra?e bus sur??iuota seka.
Pastabos: 1. Prie? naudojant ?? algoritm?, visi korte?ai turi b?ti
i?skirstyti pagal ilgius. Tam formuojami s?ra?ai ILGIS(l), kur l (
1,...,lmax, kuriuose sura?yti atitinkamo ilgio korte?ai. Pirmame ?ingsnyje
r??iuojamas tik s?ra?as ILGIS(lmax) pagal paskutin? komponent?. 2. Be to
matom, kad pra?jus kart? pro vien? komponent? gali b?ti daug pagalbini?
eili? Q(i) (kur i ( 0,1,...,m-1) tu??ios. Ne?i?rint to jas visas reikia
jungti ? bendr? s?ra??, tod?l naudinga b?t? i? prad?i? nustatyti kurios
pagalbin?s eil?s bus netu??ios ir tik jas jungti ? vien? bendr? s?ra??.
R??iavimas lyginant elementus
“Burbuliuko” metodas. Paprastai elementai r??iuojami pagal raktin? ?od?.
Tarkim turim K1..K16 element? ir lyginame K1 >K2. Jeigu daugiau sukei?iam
vietom. Jeigu ne nieko nedarom ir t.t. Paskutinis palyginimas bus Km > Kn.
Po 1 iteracijos did?iausias skai?ius atsiranda pabaigoje. Sekanti iteracija
vyksta su n-1 elementu, nes paskutinio neimame ir t.t.
Pirmoje iteracijoje bus (n-1) palyginim?. Antroje iteracijoje (n-2), i-
tojoje iteracijoje (n-i).
Tuomet bendras palyginim? skai?ius bus
[pic]
Kadangi ne visuomet elementai sukei?iami, tuomet jeigu i?r??iuota seka bus
0 pakitim?, o atvirk??iai i?r??iuota seka - n(n-1)/2 pakeitim?. Tada
vidutinis pakeitim? sk. bus n(n-1)/4.
Jeigu yra n element? seka, tai i? jos gali b?ti padaryti n! sek?. Mes
laikome kad bet kuri seka gali pasitaikyti su vienoda tikimybe 1/n!.
Kiekvienai sekai galima para?yti inversi?k? sek?. Jeigu turime tokias 2
sekas, ir jas sur??iuosime, tai sumalinis pakeitim? sk. bus n(n-1)/4.
Algoritmo sud?tingumas ((n2).
Iterpimo metodas.
?ia eilinis elementas yra ?terpiamas ? jau sur??iuot? elemet? sek?. Tegul
turime n element? i? viso ir turime jau i sur??iuot? element?. Mums reikia
?terpti i+1 element? Ki+1. Ki+1 atsidurs tarp Kj < Ki+1 < Kj+1 element?.
?statant i+1 element? mums reik?s max palyginim? (su 1, su 2…).Max
palyginim? sk. b?t?:
[pic]Pagal tai ir algoritmo sud?tingumas bus ((n2).Vidutini?kai bus ma?iau
palyginim?.?iuo b?du r??iuojant masyvus (paprastus) patogiau prad?ti elemt?
lyginim? nuo sur??iuotos sekos pabaigos. Tai yra nuo i-tojo elemento.
Panagrin?kime koks ?iame algoritme yra vidutinis palyginim? sk. Tegul
turime i sur??iuot? elemt? ir reikia ?statyti I+1 element?. Pirmiau
lyginsime su 1 elememtu. Yra i+1 pozicijos, ? kurias galima ?statyti i+1
element? ir priekyje ir gale. Laikome, kad i+1 elementas ? bet kuri?
pozicij? gali patekti su vienoda tikimybe 1/(i + 1). Vidutinis palyginim?
sk. ?statant element? bus:
[pic]jei patenka ? paskutin?
prie? pirm?j? pozicij?
element? (gale)
=1/(i+1)(1+2+…+i+i) = 1/(i+1)*((i+1)/i ) /2 + i / ( i + 1 ) = i / 2 + i / (
i + 1 )
Tiek pagal max,tiek pagal vidutin? palyginim? skai?i? ?io algoritmo
sud?tingumas yra ((n2)
Ekspermentinis statistinis algoritm? tyrima.s ?iuo metodu pvz. tiriant
r??iavimo algoritmus mums reikia para?yti atitinkam? program?, paiimti
atsitiktin? sek? i? n duomen? ir atlikti skai?iavimus, pvz.: fikstuoti
laik? t1, po to paimame kit? sek? ir gauname laik? t2 po to paimame kit?
sek? taip pat i? n duomen? ir gauname laik? t3 ir tokius bandymus kartojame
k kart?. Gauname atsitiktini? dyd?i? imt? t1, t2, …. tk. Vidurkis bus ( =
1/K(i(1K (ti), vidurkis - atsitiktinis dydis.
Dirpersija bus : S2(t)=[pic]i-t)2= =[pic]ti2-2(t ti +(t2) = =[pic] ti2-
2t[pic]ti+K(t2]= =[pic][pic]ti2-2([pic][pic]ti)* *[pic]ti + K/K2
([pic]ti)2] = [pic]* *[ [pic]ti2 - [pic]( [pic]ti)2]
?i dispersijos fomul? patogesn? ma?ininiuose skai?iavimuose, nes su
kiekvienu nauju atsitiktiniu dyd?iu ti mes kaupiame tik dvi sumas : (ti ir
(ti2.(t - atvirk?tinis dydis ir jis vertina tam tikr? matematin? vilt?.(t
dispersija yra tokia: D((t )= D [[pic][pic]ti] = 1/K2[pic] D(ti) =
1/K*D(t); D - tikroji dispersija;S-?vertinimas.S2((t)=S2(t)/K arba
i?traukus ?akn?: S(t) = S(t)/[pic]; |(t - m| 0, tai ((t = (t1- (t2, S2((t)(S2((t1)+ S2((t2)-2(M12 t.y.
dispersija ma?esn? nei nepriklausom? dyd?i? atvju. S2(((t)( S2(t1)/K+
S2(t2)/K - 2K12S((t1) * S((t2)= S2(t1)/K+ S2(t2)/K - 2M12/S(t1)S(t2)*
S(t1)/(k * S(t2)/(K = S2(t1)/K+ S2(t2)/K - 2M12/K t.y. ir vidurkio
dispersija yra ma?esn?, nes atsiima 2M12/K. Atitinkamai intervalinis
?vertinimas: ((t - tpS(((t) A(J) tai sukei?iame juos vietomis ir I(I+1
ir t.t.. Taip palyginus su visais elementais, gausime, kad kair?je pus?je
elemento su kuriuo mes lyginome bus elementai ma?esni u? j?, o de?in?je
didesni, t.y. suskald?m sek? jo at?vilgiu. Elementas pagal kur? atlikome
palyginimus yra pirmasis ir vadinamas generaliniu. ?ia generalinis
elementas visada buvo pirmas, ta?iau tai neb?tina. Gaima paimti bet kur?.
Generaliniai elementai gali b?ti parenkami ?vairiai: pirmas, atsitiktinis,
mediana (vidurinis). Skaidyti pagal median? geriausia. Galima paimti
nedideli? imt? i? keli? sekos element? ir surasti median?. Imant visada
pirm? element?, blogiausias atvejis gaunasi, kada seka yra sur??iuota. Tada
seka suskaldoma ? vien? element? ir vis? likusi?. Gausis taip kaip ir
kituose algoritmuose. Tuo atveju algoritmo sud?-tingumas ((n2), o visais
kitais atvejais ?ymiai geriau. ?is algoritmas gerai veikia didel?m sekom, o
taip pat reikia tinkamai parinkti generalin? element?. Vid. veiksm? sk.
yra:
[pic]
c-koef., cn-veiksm? sk. atliekant pirm? suskaldym?. Generalinis elem.
atsiranda i-ojoje vietoje ir gaunam dvi sekas (i-1) ir (n-i). Veiksm? sk.
skaldant sek? (i-1) yra (i(1n f(i-1), o sek? (n-i) yra (i(1n f(n-i). 1/n-
i su vienoda tikimybe gali atsirasti bet kurioje vietoje.
(i(1n [f(i-1)+ f(n-i)](f(0)+ f(n-1)+ f(1)+ f(n-2)+...+ f(n-2)+ f(1)+ f(n-
1)+f(0)( 2 f(0)+2f(1)+...+2f(n-2)+2f(n-1)(2(i(1nf(i)
f(n)(cn + 2/n(i(0n-1 f(i), kai n>1
f(0)(f(1)(b
f(2)(2c+2/2[f(0)+f(1)](2c+2b(k
f(3)(3c+2/3[f(0)+f(1)+f(2)](3c+2/3[2b+2c+2b](3c+8/3b+4/3c((8b+13c)/3.
?rodyta, kad visada galioja lygyb? f(n) < kn ln n. Tod?l QUICKSORT
algoritmo vidutinis sud?tingumas yra ((n ln n). ?ia nevertinta, kad ma?os
sekos gali b?ti r??iuojamos kitu b?du, kas dar pagreitina ?? algoritm?.
Optimalus r??iavimas. Jei yra n element?, tai variant? i? viso gali b?ti
n!. n=3, 3!=6 Minimalus palyginim? sk. blogiausiu atveju = 3. Ir laikom,
kad ?i schema optimali. Tegul S(n) - minimalus palyginim? sk. blogiausiu
atveju, r??iuojant n element?: S(3)=3 Pilname k-tojo lygio binariniame
medyje, paskutiniame lygyje yra 2K mazg?. K=S(n).
n! =< 2 S(n), tada S(n) >= (log n!( =n log n - n/ln2+1/2 log n + (
( - paklaida. (Stirlingo formul?)
Minimalus palyginim? sk. blogiausiu atveju yra apie nlogn . Palyginus
(log n!( su f(n) = n (log n( - 2 (log n( + 1 pasirodo, kad suliejimo
metodas pagal minimal? palyginim? sk. n?ra minimalus.
I?RINKIMAS
Maksimalaus elemento i?rinkimas i? n element? sekosRadus max element?,
reikia atlikti n-1 palyginim?. O kiek reikia priskyrim?? Jei seka -
ma??janti, tai reik?s 1 prisky-rimo. Jei seka - did?janti, tai reik?s n
priskyrim?. O koks vidutinis priskyrim? sk, jei bet kokia seka i? n
element? vienodai galima?
Hn=1 +[pic] P[ai > aj] ( 1 = 1+ [pic]1/2 ( 1 = [pic][pic] = ln n + ( +1/2n
+ (
?i eilut? diverguojanti, t.y. did?jant n, jos reik?m? did?ja.(Eulerio
formul?) ?ia ((0,577; (- paklaida.
Sekan?io did?iausio elemento radimas (2-? max radimas). Norint surasti max
element?, reikia n-1 palyginim?. Po to j? pa?alinam ir surandame kit? max.
Tam reikia n-2 palyginim?. Tod?l i? viso palyginim? sk: 2n-3. ?? algoritm?
galima pagerinti suskald?ius n element? ? 2 dalis: (n/2( ir (n/2( Ie?kome
max element?: I dalyje max el. surasti reik?s (n/2( - 1 palygini-m?, II
dalyje - (n/2( palyginim?. Po to juos reik?s tarpusavyje palyginti. I? viso
reik?s [pic] palyginim?. Paskutiniame lygyje pralai-m?jus? element? reik?s
palyginti su pra-laim?jusiais elementais, lyginant su mak-simaliu. Taip
rasim kit? max element?. Reikia [pic] palyginim?. Toliau galima kelti
klausim?, ar negalima ??jimo sek? padalinti ? 4, 8 ir t.t. dali?, kol
neprieisim algoritmo, kuris atitinka piramidin? r??iavim?. Lai I faz?je
lyginame po 2 elementus: n=8
a1
a1 a6
a1 a3 a6 a7
a1 a2 a3 a4 a5 a6 a7 a8
Ie?kant kito max elemento, reikia a6 ly-ginti su pralaim?jusiais, randant
a1
Jei a6 > a3, tai reikia palyginti ir ar a6 > a2
Jei a6 < a3, tai reikia palyginti ir ar a3 > a6
Radom max per 2 palyginimus. Pirami-d?je radom per n-1 palyginim?. Tai yra
sekantis randamas per (log n( -1 palygi-nim?. Gauname, kad ?iuo metodu
palygi-nim? sk. yra optimalus: n + (log n( - 2 .
Geriausio (max) ir blogiausio (min) elemento i?rinkimas
Galima si?lyti suskaidyti sek? n ? 2 dalis ir sura?yti ?iose dalyse max ir
min elementus. Palyginus max-ius elementus gaunamas max-is elementas, min-
ius -min-is. Rekursyviai galima suskaidyti iki 1,2 element?. Palyginant 2
elementus tarpusavyje i? karto gauname max ir min elementus. Rekurentin?
lygtis, apra?anti tok? akgoritm?:
f(n)=[pic]
Bendras ?ios srities sprendinys:
|[pic|(n-2(log |
|] |n()/2, kai|
| |n =k, tai imame S1, kuriame yra (i-
1) ele-t?. Jei i( . i1 ,i2 ...ik = n. P(i1 ,i2 ..ik ).
Nagrin?jome ?io bendro u?davinio kelis atvejus:
1.ma?iausio elem, radimas P(1,n-1)=n-1. (palyginim? sk ie?kant min =n-1).
2.1-mo ir 2-ro ma?iausio elem, radimas P(1,1,n-2)=n+(log n(-2.
3.ma?. ir did?. elem, radimas
P(1, n-2, 1)=(3/2 n(-2
4.k-tojo didesnio elem, radimas
P(k-1, 1,n-k) = (( n)
5.Dviej? ma?iausi?: P(2,n-2)=n+(log(n-1)(-2
6. trij? ma?iausi?: P(3,n-3)=n+2(log n(-(3|2|1|
?vairiais atvejais priklausomai nuo n.
Galima kelti tokius u?davinius:
a.surasti k ma?iausi? elem, P(k,n-k).
b. surasti k-?j? element? P(k-1,1,n-k).
c. surasti k element? i? eil?s P(1,1,1,..,1,n-k)
P(1,1,1,..,1,n-k)> P(k-1,1,n-k)> P( k,n-k).
Veiksmai su aibemis(DS po?iuriu)
U?davinius galima suvesti ? veiksmus su aib?mis. I?analizuojam ?vairias
Duomen? Strukt?ras ir pasirenkam labiausiai tinkam?. Gero alg. Suk?rimas
neatski-riamas nuo tinkamos DS pasirinkimo. Pagr. mat. veiksmai su aib?mis
b?dingi informacin?s paie?kos u?daviniams:
1:PRIKLAUSYTI (a, S). Nustato ar elem.a priklauso aibei S. Jei a priklauso
S, tada TAIP, prie?ingu atveju NE..
2:?STATYTI (a,S).?stato elem, a ? S. Gaunasi aib? S ir elem, a t.y. S({a}.
3:PA?ALINTI (a,S). Pa?alina a elem, i? aib?s S t.y. aib? S pakei?iama ? S-
{a}.
4. APJUNGTI (S1,S2,S3). Atlieka tok? veiksm?: S3= S1(S2.
5:RASTI (a). Reikia rasti aib?, kurioje duotu momentu randasi elem, a. Jei
rast? dvejose aib?se, tada veksmas nenustatytas.
6:SUSKALDYTI (a,S) ?ia aib?selem, u?duoti santykiu min.
Medis grafas be ciklo. Jei medyje S(V,T) pridesime koki? nors briaun?, tai
susidarys vienas ciklas. Grafo G mi?ku vadiname neorentuot? med?i? aib?:
{V1.,T1}, {V2.,T2},...,{Vk.,Tk} . V1 ,V2, .. Vk-suskaldyta aib? V. V=V1
(V2,(..(Vk; V i (Vj =(. Atitinkamai T1,T2,…Tk yra aib?s E poaibiai.
Kraskalo alg sako: reikia med?ius jungti minimalaus ilgio briaunomis ir
apjungti sujungtus med?ius ? vien?. Taip atliekama tol, kol nesigauna
vienas ekonominis medis.
////////// P R O G R A M A--------------
(1 ir (2 yra med?iai mi?ke. ?iame algo-me E - grafo briaun? aib?. T-
ekonominio med?io briaun? aib?. VS - grafo mi?ko med?iai kurie apjungiami ?
ekonomin? med?:
I? prad?i? VS- atskiras grafo G vir??nei kaip vieno elem, aibei(viena
vir??n?-vienas mi?ko medis).
Kadangi aib?je E yra sura?ytos briaunos,kurias rekia imti su minimaliu
svoriu. Tai galb?t naudinga atlikti j? sur??iavim?. Tai gali b?ti paimtas
alg, kurio sudetingumas ((eloge).e-briaun? sk.
Tuomet 3-?io operatoriaus sudetingumas proporcingas vir??ni? sk. n ((n).
Laikas reikalingas surasti aibei (1 ir (2 ?kurias ?eina vir??nes V ir ( ir
j? sujungimas, jei priklauso skirtingoms aib?ms yra beveik tu??ias: ((n) .
O jei tiksliau t.y. ((n G(n)), kur G(n) - atvirk?tin? f-jai F(n) =2F(n-1)
Jeigu naudosime s?ra?? strukt?r?, tai (7,8) ?ios dalies alg. sudetingumas
(( MAX(e,n log n)). Tod?l matom, kad visumoje Kraskalo algoritmo
sud?tingumas yra ((e log e), kur? nulemia r??iavimas.
Paskirstymo metodas (he?iravimo)
Mes ?ia nagrin?sime duomen? strukt?r? besikei?ian?ioje aib?je S. Nauji
elementai bus ?statomi, seni pa?alinami ir karts nuo karto reik?s atsakyti
? klausim?: ar priklauso duotu momentu konkretus elementas aibei S. Bus
reikalingi tokie veiksmai: PRIKLAUSYTI(a,s), ?STA-TYTI(a,s),
PA?ALINTI(a,s). O elemen-tai, kurie gali b?ti aib?je S, imami i? labai
didel?s aib?s. Panagrin?sime paskirstymo metod?, kuris leid?ia gerai
atlikti ?iuos 3 veiksmus. A
0 h(a)=1
1 h(a)=2
h(a)=
m-1 =m-1
A-nuorod? masyvas(kiekvienas elementas - nuoroda ? sara??). Paskirstymo
funkcija h(a) atvaizduoja universalios aib?s elementus ? sveik? skai?i? 0
( m-1 aib?.
Pvz.: h(a)=a mod m, ji gera kai a yra tolygiai pasiskirst?. Vadinasi mums
reikia h(a) pasirinkti pagal a pasiskirstym?. A(i) - nurodo ? sara?o
element? a ( S, kur h(a)=i. Tai operacijos ?STATYTI(a,s) atlikimui reikia
paskai?iuoti h(a) ir po to per?i?r?ti s?ra??, ? kur? nurodo h A[h(a)]. Jei
elem A ten n?ra, tai j? reikia ?statyti sara?o gale. PA?ALINTI(a,s)
atliekama analogi?kai. Tas pats ir PRIKLAU-SYTI(a,s). Blogiausiu atveju
gali atsitikti, kad atliekant operacij? ?STATYTI visoms h(a) gaunasi tas
pats skai?ius ir visi elementai tada rasis viename sara?e. Tuo atveju,
atliekant i-taj? operacij? reik?s laiko, proporcingo i. Ir atliekant
?statymu reik?s ((n2) laiko. ?iuo atveju tai yra tas pats kaip ir paprastas
sara?as. Ta?iau vidutinis laikas bus ?ymiai geresnis. Jei h(a) ?gauna
reik?m? su tikimyb?mis 1/m ir ?statant nan. Vadinasi yra
u?duotos tikimyb?s q0,q1,...,qn. (pi+(qi(1.Reikia sudaryti optimal?
paie?kos med? ,kuriame vidutini?kai b?t? atliekama ma?iausiai palyginim?,
ie?kant ?vair? element? su u?duotomis tikimyb?s.
a4 0
a3 a5 1
a1 3 4 5 2
0 a2 3
1 2
Fiktyviai pa?ymime elemtus medyje ,kuri? n?ra bet tenka ie?koti. Tikimyb? ,
kad reik?s ie?koti a, kuris a3=nlog n, tai ?is algoritmas i? tikr?j? yra
optimalus, o kai mw (w=T?VAS[v] ). Tod?l kai
gr??tama prie nutr?kusios proced?ros paimama sekanti briauna, kuri gali
vesti ? nauj? vir??n? arba ? sen?. Tada 12 ir 13 operacijos pakuoreguoja
APAT[v] reik?m?. ?ita briauna taip pat patenka ? stek?. 12 op. pataikrina
ar ?i briauna patekusi ? med?.10 op. tikrina ar APAT[w] >=VIRNR[v], jei ne
tai 11 op. pakuoreguoja APAT[v]. Jei taip tai rei?kia aptikta labiausiai
susijusi komponent?, o i? steko i?stumia briaunas ?einan?ias ? j?
(komponent?) ir taip pat i?stumiama paskutin?.
Paie?ka ? gyl? orentuotame grafe
Naudojant paie?kos ? gyl? grafuose algoritm? orentuotame grafe galima
i?skirti orentuot? med?i? mi?k?, jei kiekvienam mazgui v suskaupsime s?ra??
L[v], t.y. pasiekiame vir??ni? v aib? per 1 ?ingsn?. PVZ
V1 V2
V3
V5 V4
V7 V8
V6
V1 V6
V2 V5 V7 V8
V4 V3
I?skirtas grafo mi?kas (med?i? linijos i?tisin?s, kitos punktyrin?s)
Paimam vir??n? v1. I? jos pasiekiam v2. PIE?KA(v2) i??aukia PIE?KA(v3). ?ia
Stop, niekur negalim patekti. Gr??tam ? v2 ir pereinam ? v4. V?l niekur
negalim patekti. Gr??tam ? v1. ?ia i??aukiama PAIE?KA(v5). I? ?ios vir??n?s
niekur negalim patekti, tod?l paimama sekanti “nauja” vir??n? v6 ir t.t.
Gauasi du med?iai.
Tokio algoritmo darbo rezultate gauname 4 tip? lankus:
1. Med?io lankai, kurie paie?kos metu veda ? naujas vir??nes 2.
Tiesioginiai lankai vedantieji nuo prot?vi? ? tiesioginius palikuonis (jei
(v,w) - tiesioginis lankas vw).
Stipriai susijusi? dali? is?kyrimas orentuotame grafe
Stipriai susijusios dalys orentuotame grafe, tai i? bet kurios vir??n?s
egzistuoja kelias ? bet kuri? kit?. Kiekvienai orentuoto grafo vir??nei
skai?iuosime APATRY?YS[v]( MIN({v}Uw ). ?ia vir??ni? numeracija pagal pai?k? ? gyl?,
surandant med?ius. Vir??n? v orentuoto grafo stipriai susijusios dalie
?aknis bus tada, kai APATRY?YS[v](v. Atliekant paie?k? ? gyl? galima
apskai?iuoti APATRY?YS[V], o taip pat i?skirti stipriai susijusias dalis,
tam grafo vir??n?s talpinamos ? stek?, kai apeinant graf? sutinkamos.
Kiekvien? kart?, kai aptinkama stip. susijusios dalies ?aknis, visos
vir??n?s iki ?ios ?aknies i?stumiamos i? steko ir jos yra stipriai
susijusios dalies vir??n?s. Modifikuotos proc. paai?kinimas: APATRY?YS[v]
skai?iuojamas 4,9 ir 11 eilut?je 4 operacijoje suteikiama pradin? reik?m?
(vir??n?s Nr.). 9op. Priskiriam APATRY?YS[v](MIN(APATRY?YS[v], APATRY?YS[w]
)-tai lankams ?einantiems ? med?. 10 op. i?ai?kina ar n?einantis ? med?
lankas (v,w) yra atbulinis ar skersinis, o tai pat i?ai?kinama ar w( stekui
;priklauso stipriai susijusiai grafo daliai. 11 op. koreguojama reik?m?
APATRY?YS[v] (MIN(VIRNR[w], APATRY?YS[v] ). ?io algoritmo sud?tin-gumas yra
((MAX(n,e)) – tiesin?s, n-vir??ni? sk. e-lank? sk.
Graf? susietumo matrica.
G(V,E) V-vir??ni? aib?, E-lank? aib?.
Susietumo matrica: |0 1 1 0|
( C ) ( |0 0 0 0|
|0 1 0 0|
|1 1 0 0|
cij ( {0, jei n?ra lanko i? i ? j 1,jei yra lankas i j
Susietumo matric? daugyba. Tegul turime grafus G1(V,E 1 ) ir G2 (V, E 2 )
su tom pa?iom vir??n?m, bet skirtingais lankais. Sudauginsime j? susietumo
matricas C(C1*C2 . Susietumo matrica C atitinka multigrafas sudarytas taip:
i? vi ? vj eina tiek lank?, kiek yra keli? i? vi ? vj , susidedan?i? i? 2
lank?: pirmas lankas (G1 , antras (G2. ?rodymas: ar egzistuoja vi ? vj
kelias vi vk vj per tarpin? vir??n? vk . Galima patikrinti tokiu b?du
c1ik*c2kj(1; c1ik(G1 , o c2kj(G2 . Kei?iant k nuo 1 iki n patikrinam ar
egzistuoja kelias per visas tarpines vir??nes. Sumuojant, gaunam toki?
keli? sk. cij((k(1 n c1ik* c2kj. O tai atitinka matric? daugyba, cij yra
matricos C elementai. Tegul C yra graf? susietumo matrica. Tada C*C
elementai parodo kiek yra skirting? keli? i? vir??n?s vi ? vj ,
susidedan?i? i? dviej? lank?.
|0110| |0110| |0100|
( C )*( C ) ( |0000| |0000| ( |0000|
|0100| |0100| |0000|
|1100| |1100| |0110|
c12(1 rodo keli? v1 v3 v2 .
( C )( C )( C ) Parodo kiek keli? yra vj ir vi susidedan?i? i? 3 lank?.
|0100| |0110| |0000|
(C)(C)(C)( |0000| |0000| ( |0000|
|0000| |0100| |0000|
|0110| |1100| |0100|
1 rodo, kad tarp v4 ir v2 yra kelias susidedantis i? 3 lauk?, tai v4 v1 v3
v2 . (C)4 rodyt? keli? sk. susidedan?i? i? keturi? lank?, ?ia n?ra toki?
keli?. Kai n?ra cikl?, tai gauname nulin? matric?. (C)n – yra tikslas
skai?iuoti iki (C). Toliau bus rodomi tik ciklai. Jei susumuosime visas
(C)+(C)2+…+(C)n+
|10..0|
+ |01..0|
…
|00..1|
matricas, tai gausime keli? sk. i? vi ? vj . Jei atitinkamas elemntas
cij>0, tai tas rodo, kad yra kelias tarp vir??ni? vi vj . Matricos (n*n)
daugybai reikia atlikti n3 daugybos veiksm?. Matricai (C)n gauti, reikia
~n4daugybos veiksm?. Kartais keliamas u?davinys surasti ar egzistuoja
kelias tarp vis? grafo vir??ni?. T.y. surasti matric? (L), kurios
lij({0, jei n?ra kelio tarp vi ir vj 1, jei yra toks kelias.
Matom, kad toks u?davynys gali b?ti i?spr?stas dauginant ir sudedant
matricas. Grafas atitinkantis susietumo matric? (L) vadinamas refleksiniu
-tranzitiniu grafo u?darymu.
Paai?kinimas (L) matricos radimo algoritmo: ?ia visada ckij(1, jei yra
daugiau keli?. Tod?l 5 op. 1+1(1. T.y. atliekami veiksmai su 0 ir 1. ?ia 5
op. atliekamas n3 kart?, nes kartu atliekamas sumavimas.
Trumpiausio kelio radimas
Min kelio tarp vir??ni? radimo algoritmas:
begin
1. for i(1 until n do c0ii(0;
2. for 1( i,j( n ir (j do c0ij(cij;
3. for k(1 until n do
4. for 1( i, j( n do
5. ckij( MIN(ck-1ij , ck-1ik +ck-1kj);
6. for 1( i, j( n do lij(cnij
end
V2 1 ir 2 op. duos matric? Cij0
V1 2 | 2 8 5|
5 V3 (Cij)( |3 ( (|
|( 2 (|
| 0 8 5| k(1 |0 8 5|
(C0 ij)(| 3 0 8| (C1ij)(|3 0 8|
|( 2 0| |( 2 0|
C112(MIN(C012 , C011+C012)(8
C123(MIN(C023 , C021+C013)(8 ?vertina mas kelias v2v1v3 per v1.
k(2 |0 8 5| C231(MIN(C131 ,C132+
(C2 ij)(| 3 0 8| + C121)(5
|5 2 0| ?vertinamas kelias v3v2v1 per v2.
k(3 |0 7 5| C312(MIN(C212 ,C213+
(C2 ij)(| 3 0 8| + C232)(7
|5 2 0| ?vertinamas kelias v1v3v2 ,
kuris trumpesnis negu tiesioginis v1v2.
?io algoritmo sud?tingumas ((n3),nes ? op. atliekamas n3 kart? , o ? op. n2
kart?. 1,2 op.taip pat n2 kart?.
U?davinys su vienu ?altiniu ( Deiks-tros algoritmas)
Randami trumpiausi atstumai nuo vienos vir??n?s iki kit? garfo vir??ni?.
Grafas G=(V,E), pradin? vir??n? v0(V. Duotos reik?m?s l(vi ,vj ) ir l(vi
,vj )= +(, jei n?ra lanko vi vj . Sprend?iant ?? u?davin?, sudaroma
vir??ni? aib? S(V.Taip trumpiausias atstumas nuo v0 iki v(S eina per
vir??nes (S.
V0 2 V1
7 3
10 6 V5
4
V4 5 V3
I_| S_ |w|D[w]|D[v1]|D[v2]|D[v3]|D[v4]
Prad?.| {v0} | - | - | 2 | +( | +( | 10
1. |{v0,v1} | v1| 2 | 2 | 5 | +( | 9
2. |{v0,v1,v2} | v2 | 5 | 2 | 5 | 9 | 9
3. |{v0,v1,v2,v3} | v3 | 9 | 2 | 5 | 9 | 9
4. |{v0,v1,v2,v3,v4}| v4 | 9 | 2 | 5 | 9 | 9
begin
1. S({v};
2. D[v](0;
3. for v(V,kaiS={v}do D[v](l(v,v)
4. while S(V do
begin
5. paimti vir??n? w(V, nepriklausan?i? S, kuriai D[w]-mminimali (w(V-S)
6. prid?ti vir?un? w prie aib?s S;
7. for v(V-S do
8. D[v](MIN(D[v];D[w]+l(w,v));
end;
end;
5 op. atliekamas n kart? (n-vir??ni? ksai?ius), 7,8 operatoriai
atliekami n kart? (max). 4 op. wile ciklas ?stato kiekivien? vir??n? ? S.
Tod?l ciklas i? 4,5,6,7,8 operatori? atleikamas n2 kart?, tod?l algoritmo
sud?tingumas ((n2) ( 3 operatorius atleikamas n kart?, tod?l algoritmo
sud?tingumui ?takos neturi ).
|