|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - АлгоритмыАлгоритмы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 |
РЕКЛАМА
|
|||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |