Алгоритмы
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 imama vir?utin? pus?, tada V pasilieka tas pats, o A(F-1.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-1<n< 2k-1. f(n) ( 1*1/n + 2*2/n +...+ (log n ( * 2k-
2/n + ( (log n ( +1) * (n-(2k-1-1))/n ( 1/n (i(1(log n ( ( i *2i-1) + (
(log n ( +1) * ( n - ( 2k-1 - 1))/n.
Jis artimas max plyginim? sk. Jei ie?kom? ?ra?? n?ra, tai jis ( max
palyginim? sk. Binarin? paie?ka tiek pagal max palyginim? sk. tiek pagal
vidutin? yra optimali.
2) Pos?ra?io dyd?io nustatymo metodas.Pradedant paie?k? i?eities pos?ra?io
dydis S1(N, tai pirmoji riba N1((N/2(, o pos?ra?is S2((S1/2(. Si+1((Si/2( ;
Ni+1(Ni((Si+1/2( . Jeigu ?ra?? n?ra, tai paskutin?je iteracijoje Si+1(1.
Toliau dalinant pusiau ir imant sekant? pos?ra??, jis tampa nuliniu ir tai
rodo, kad ?ra?? n?ra.
3) Ribos numeris visada 2 laipsnyje
Idealus atvejis binarinei paie?kai N(2k-1 ir riba bus N1(2k-1.Tegu 2k-
1<N<2k-1, tai pirma riba N1(2k-1. Gaunam 2 ne vienodas dalis. Jei K<F1, tai
imam pirm? dal? ir elgiam?s kaip idealiu atveju. Jei K>F1, tai ie?komas
?ra?as yra antroje dalyje, kuri ma?esn? u? pirm?j?.
2r-1-1<N-2k-1<2r-1 ir v?l viskas tas pats. Panagrin?sime algoritmo
sud?tingum?, ?statant n element? ? med? pagal atliekam? palyginim? sk..
Blogiausias atvejis, kai elementai i?rikiuoti, nes gaunamas paprastas
s?ra?as ir kiekvien? element? pastatyti ? s?ra?o gal?. T(n)-bendras
palyginim? sk. ?statant n element? ? s?ra??. T(n-1) - bendras palyginim?
sk. ?statant n-1 element?. ?statant n-t?j? element? reikia n-1 palyginim?.
T(n) ( T(n-1) + (n-1). T(n) ( T(n-1) + (n-1) ( T(n-2) + (n-2) + (n-1) (
T(1) + 1 +...+ (n-1) ( (i(1n-1 ( i ) ( n * (n-1)/2. Vidutinis atvejis, kai
i?eities seka a1,a2,...,an yra bet kokia, tai ?io algoritmo sud?tingumas
((n log n ). Lygi? sk. binariniame medyje - log n. Tegu T(n) yra palyginim?
sk. ?statant elementus a1,a2,...,an ? binarin? med?. Tegu b1,b2,...,bn yra
ta pati seka, ta?iau jau i?r??iuota did?jimo tvarka. Kadangi a1,a2,..,an
yra atsitiktinai i?d?styti, tai bet kuris i? j? gali atsidurti bent kurioje
vietoje su vienoda tikimybe. Tuomet a1 su tikimybe 1/n gali atsirasti j
vietoje (j(1...n). a1 fakti?kai tampa med?io ?aknim ir jis yra j-tasis. Tai
(j-1) element? yra kair?je pus?je, o (n-j) de?in?je. ?statant (j-1)
element? ? kair? pomed?, reikia (j-1) palyginim? su ?aknimi plius T(j-1)
((j-1)+T(j-1)). Analogi?kai de?iniam pomed?iui reikia (n-j) palyginim? su
?aknimi plius T(n-j). (j-1) + T(j-1) + (n-j) + T(n-j) ( (n-1) + T(j-1) +
T(n-j). Tiek palyginim? reik?t? jei b?t? j-tasis elementas (med?io
?aknimi),bet a1 gali b?ti bet kuris, tuomet palyginim? sk.: T(n) ( 1/n
(j(1n ((n-1)+T(j-1)+T(n-j)) ( n-1+ 1/n (j(1n (T(j-1) + T(n-j)) ( n-1 + 2/n
(j(0n-1 ( T(j) ).
Toliau pertvarkant galima parodyti, kad T(n) ( k n log n, kur k ( ln 4 (
1.39.
1) Principas - ‘Skaldyk ir valdyk’
Sprend?iant kok? nors u?davin? kartais jie suskaldomi ? du. Rasti j?
sprendimai apjungiami ir gaunamas u?davinio sprendimas. Savo ruo?tu
suskaidyti u?daviniai gali b?ti toliau skaidomi. Visiems u?daviniams
spr?sti naudojama ta pati rekursyvi proced?ra. Pavyzd?iui, reikia rasti
aib?je i? N element? max ir min element?. Surandant max element? reikia (n-
1) palyginim?. Taip pat ir ie?kant min reikia (n-2) palyginim? (su max
nelyginam). Ie?kant min ir max element? reikia 2n -3. Tarkim n(2k. Vis?
aib? suskaldom ? 2 dalis. Kiekvienoje i? j? randam min ir max ir juos
palyginam. T(n)({1, n(22T(n/2)+2, n>2. 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 a<c, turim ma??jan?i? geometrin? progresij?. Tuomet
turim tiesin? algoritm? ((n). Jei a(c, tai algoritmo sud?tingumas
((nlogcn). Jei a>c, 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|<( - t.y. artiname ir
reikalaujame, kad jos skirtus? (. Kad i?rai?ka tur?t? prasm?, mes para?ome:
P=p.Padalinkime abi puses i? vidutin?s kvadratin?s paklaidos.
P =p. Pa?y-m?kime tp = (/ S((t) (2). m- vidurkio
matematin? viltis.(t - m ?vertinimas tada i? formul?s (2) i?eina, kad ( =
tp*S((t) = tp[pic]. Galim para?yti : t-(< m< t+(, tada t - tp[pic]< m <(t +
tp[pic]t.y. tikroji matematin? viltis su tikimybe p rasis ?iame intervale,
o su tikimybe 1 i?eis i? ?io intervalo. Turime taip vadinam? intervalin?
?vertinim?.
Dviej? program? ekspermentinis- statistinis tyrimas. Tegul mes atlikom
skai?iavimus pagal vien? program? ir fiksavom laikus t1i(i=1….K). Galima
paskai?iuoti vidurk? (t1 , dispersij? S2(t1) ir t1+- (1(intervalinis
?vertinimas). T? pat? atlie-kam su kita programa(t2, S2(t2), (t2 +- (2
Jei palyginsim tik (t1 ir (t2 tas dar nerodo, kad vienas i? ?i? algoritm?
yra geresnis, nes (t1 ir (t2 - atsitiktiniai dyd?iai, tod?l palyginim?
rezultatas taip pat gali b?ti atsitiktinis. Geriau lyginti (t1 ( (1 ir (t2
( (2. Jei jie nepersidengia, tai yra pagrindo teigti, kad viena programa
yra geresn? u? kit?.Arba galima lyginti ir taip:
1.paskai?iuojam (t=t1-t2 ; D(((t ) = D((t1)+D((t2); Jeigu ?ie atsitiktiniai
dy-d?iai nepriklausomi.
S2(((t ) = S2((t1 ) + S2((t2) = S2(t1)/K + S2(t2)/K ;
S(((t)=(((S2(t1)+S2(t2))/K);
((t - tpS(((t )<m(((t )< ((t + tpS(((t )
p=0.95. Jeigu ?is intervalas neapima 0, tai galima teigti, kad viena
programa geresn? u? kit?.
Galima naudoti priklausomus bandymus, kurie gaunami taip:
suformuluojam atsitiktin? sek? i? n element?. J? sur??iuojame su viena
programa ir gaunama laik? t11. Po to t? pa?i? sek? sur??iuojame su kita ir
gauname t21 ir taip toliau k kart?, t.y. gauname t1i ir t2i, kur i
=1,2…,K. Galima paskai?iuoti: (t1, (t2, S2(t1)=[pic][[pic]t21I -
1/K([pic]t1I)2]; S2(t2)([pic][[pic]t22I - 1/K([pic]t2i)2]
Tarpusavio momentai M1=[pic][pic] (t1i-(t1)(t2i-(t2)=[pic][pic](t1it2i-
(t1t2i -(t2t1i+(t1(t2)=[pic][[pic] t1it2i - (t1(t2i - (t2(t1i + K (t1(t2]
=[pic][[pic]t1it2i-1/K[pic] t1i[pic] t2i] ; (ti= t1i - t2i ; D((t)=D(t1)+
D(t2)-2M12 (1); Koreliacijos koef. K12 = M12 / ((t1)((t2); Jis gali kisti
nuo -1 iki +1. M12=K12((t1)((t2). Jei K12=1, tai rei?kia teisin? funkcin?
priklausomyb?. Jei K12=1 ir ((t1)=((t2), tai jei ?statysim ? 1 -aj?
formul?, tai gausime D((t)=0. Ta?iau tai idealus atvejis, o prakti?kai K12
< 1.
Jei K12 > 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) <m ((t) < ((t + tpS(((t) (1). Kadangi S2((t)
esant priklausom? bandym? atvejais yra < nei nepriklausom? bandym?, tai
intervalinis ?vertinimas (1) yra siauresnis ir algoritm? vertinimas yra
tikslesnis. Jei intervalas apima 0, tai algoritm? palyginti negalima. Arba
galima sakyti ir taip: naudojant priklausomus bandymus, esant teigiamai
koreliacijai mums pavyksta i?skirti grei?iau reik?mingus skirtumus. Tas
pats rezultatas gaunasi jei su kiekvienu bandymu mes fiksuosime t1i, t2i ir
skai?iuosime (ti, i=1,2,……..,K. fakti?kai gauname atsitiktinius dyd?ius. (t
= 1/K[pic](ti; S2((ti)=[pic][[pic](ti2-1/K([pic](ti)2]
S2(((t)=S2((ti)/K; S(((t)= S((ti)/(K
((t - tp S(((t) < m((t) < ((t + tp S(((t)
Jei ?is intervalas apima 0, tai negalima sakyti, kad viena programa geresn?
? kit?. Ir prie?ingai, jei neapima 0, tai yra pagrindo teigti, kad viena
programa yra geresn? u? kit?.
Binarinis ?terpimo algoritmas
Ie?kant elementui vietos jau sur??iuotoje sekoje mes galima naudoti
binarin? paie?kos metod?.
Iterpiant i+1 element? ? i-tojo dyd?io sur??iuot? s?ra?? reikia atlikti
(log i ( + 1 = (log(i+1)( palyginim?. Visada reiks atlikti max palyginim?,
nes ?terpiamo dyd?io tame s?ra?e n?ra. R??iuojant n-tojo dyd?io s?ra?? mums
reik?s atlikti [pic](log(i+1)( palyginim?.
[pic](log(i+1)( = [pic](log(i)( = n(log(n)]-2(logn( + 1 tokio algoritmo
sud?tingumas ((nlogn).
R??iavimas i?rinkimu
I? prad?i? i?renkame did?iausi? element?. J? sukei?iame su paskutiniu.
Paskui i? likusios dalies i?renkame did?iausi? ir sukei?iame su
prie?paskutiniu ir t.t.
Palyginim? sk. tokiam algoritmui yra [pic](n-i)=[pic]i=n(n-1)/2, tai ?io
algo-ritmo sud?tingumas: ((n2).?is alg. gali b?ti geriausias vienu metu
ie?kant max ir min.
R??iavimas piramide
?is algoritmas susideda i? dviej? dali?:1. I? duotos sekos sudaryti
r??iavimo med?. 2. Sukeisti pirm? element? su paskutiniu ir atstatyti
r??iavimo med?. R??iavimo med? pradedame sudarin?ti nuo (n/2(, o kiekviena
narys A(i) (A(2i) ir A(i) (2i+1, ir [1(i(n/2] arba [1(i(n/2]. Did?iausias
elementas tampa med?io ?aknis. Pastatome did?iausi? element? ? sekos gal?
ir kadangi jis jau savo vietoje, tod?l jis daugiau nenagrin?jamas, o sek?
suma?iname 1 ir turime jau ne r??iavimo med?. Mums v?l reikia atstatyti
r??iavimo med?, kad pirmasis elementas b?t? did?iausias t.y. pradedant nuo
n/2 eiti link pirmo ir kiekvien? element? reikia sukeisti vietomis su
didesniu s?numi. Taigi mums reikia tam tikr? element? perstumti per ka?kiek
lygi?. Perstumiant element? per 1 lyg? reikia atlikti 2 palyginimus: (2i)
ir (2i+1) tarpusavyje ir did?iausi? i? j? su palyginamu elementu.
Perstumiant element? per n lygi? reikia atlikti 2n palyginim?, tod?l
blogiausiu atveju, perstumiant n element?, palyginim? sk. nevir?ins 2nm.(m-
lygi? sk. , be pirmos vir??n?s). Kai reikiia perstumti 1 element?,
maksimaliai reikia f(n)(2(log n( palyginim?. Tiksliau: f(n) ( (log n( +
(log (n-1)(. Perstumiant n vir??ni? maksimaliai tur?tume 2n(log n(
palyginim?. Algoritmo sud?tingumas bus ((n log n). Ta?iau ?rodyta, kad
pirmoje dalyje reik?s ne daugiau kaip 2n-4 palyginim?, tod?l pirmos dalies
algoritmo sud?tingumas yra tiesinis, nes ?ia reikia per?i?r?ti tik n/2
element?, o visumoje ?io algoritmo sud?tingumas ((n log n).
R??iavimas suliejimu (sujungimu)
n element? dalinami ? 2 dalis: [pic] ir [pic] ?ios dalys tur?t? b?ti
sur??iuojamos ir sujungiamos. Ta?iau jos v?l savo ruo?tu suskaidomos iki
vieno vieno elemento ir atliekamas j? sujungimas. Tai palyginim? sk. ?iame
metode:
f(n)=[pic]
?ios rekurentin?s lygties sprendimas yra toks: f(n)=n (log n( - 2 (log n(
+1
?i rekurentin? formul? sutampa su binarinio algoritmo ?terpimo blogiausiu
atveju.
Paai?kinimas algoritmo: next - indeksas, ? kur? mes ra?omelower 1 - pirmos
dalies pirmas indeksas. Tr?kumas: reikia papildomos atminties masyvui Save.
R??iavimas suskaldymu (quick sort).
Turime sek? i? n element?. I(1, o J(n. Lyginame A(I) su A(J). Jei A(I) <
A(J), tai J(J-1, bet jei A(I) > 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 =<3 * |
| |2(log n(-1|
| | |
| |(2(log |
| |n(+1-n)/2,|
| |kitais |
| |atvejais |
k-ojo didesnio elem. I?rinkimas[be ru?iavimo]
1.Alg. - i?rinkimas su randomizacija: pa?mus ?-aj? elem ir elementu seka
suskaidoma ? 2 dalis: (i-1)- S1, i, (n-i)-S3. Jeigu pataikeme paimti
skaidymui elem. k-uoju, tai jis atsiduria savo vietoje ir algor. baigia
darba. Jei nepataikeme tai tolimesniam skaidymui imame poaib?, kuriame yra
ie?komas elem. ir j? skaidome toliau: Jei i>k, tai imame S1, kuriame yra (i-
1) ele-t?. Jei i<k, tai imame S3 kuriame yra (n-i) elem. Antru atveju
imamas poabis S3 , taciau ie?komas elem., kuris yra(k-i), o skaidymui
naudojamas tas pats alg. Kadangi skaidydami gali buti parinktas bet kuris