Алгоритмы

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{|(t - m |<(}=p.Padalinkime abi puses  i? vidutin?s kvadratin?s paklaidos.
P {|(t - m |/S((t)<( / S((t)}=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