Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

Информатика->Курсовая работа
Цель работы - описать, разработать и запрограммировать два алгоритма сортировки по указанному методу: первый алгоритм - сортировка методом простых вст...полностью>>
Информатика->Курсовая работа
Используя функции F (x) из п.1, построить интерполяционный многочлен L4 (x) на [a,b], использовав в качестве узловых a и b, остальные необходимые узло...полностью>>
Информатика->Контрольная работа
Данная программа, написанная в среде программирования Borland Pascal 7.0, является электронным тестирующим пособием в области химии для 8-11 классов. ...полностью>>
Информатика->Реферат
Вы уже не раз встречались с алгоритмами в различных школьных предметах. Например, в химии получение того или иного соединения можно описать с помощью ...полностью>>

Главная > Реферат >Информатика

Сохрани ссылку в одной из сетей:

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+i1L (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 kk, 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, n1 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 * i1log n+1 (i * 2i-1). 2k-1-1k-1. f(n)  1*1/n + 2*2/n +...+ log n  * 2k-2/n + ( log n  +1) * (n-(2k-1-1))/n  1/n i1log 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-1k-1, tai pirma riba N12k-1. Gaunam 2 ne vienodas dalis. Jei K1, 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-1k-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)  i1n-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 j1n ((n-1)+T(j-1)+T(n-j))  n-1+ 1/n j1n (T(j-1) + T(n-j))  n-1 + 2/n j0n-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, n22T(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, n1aT(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i0logcn (a/c)i. Jei acn). 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, n1T(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, n1 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, ij 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

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ų:

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:

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i1K (ti), vidurkis - atsitiktinis dydis.

Dirpersija bus : S2(t)=i-t)2= =ti2-2t ti +t2) = = ti2-2tti+Kt2]= =ti2-2(ti)* *ti + K/K2 (ti)2] = * *[ ti2 - ( 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 [ti] = 1/K2 D(ti) = 1/K*D(t); D - tikroji dispersija;S-įvertinimas.S2(t)=S2(t)/K arba ištraukus šaknį: S(t) = S(t)/; |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. Galim parašyti : t-< m< t+, tada t - tp< m <t + tpt.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 )pS(t )



Загрузить файл

Похожие страницы:

  1. Алгоритмы (2)

    Реферат >> Информатика
    ... Вопрос 4. Алгоритмы: понятие и свойства. Линейные алгоритмы. 6 Вопрос 6. Алгоритмы: понятие и свойства. Алгоритмы ветвления. 10 ... блоков в линейном алгоритме Вопрос 6. Алгоритмы: понятие и свойства. Алгоритмы ветвления. Ответ: Алгоритмы: понятие и свойства ...
  2. Алгоритмы. Императивный подход. О понятии алгоритма. Декларативный подход

    Лекция >> Информатика, программирование
    ... команд). 2. Основные свойства алгоритмов. Понятию алгоритма присущи следующие свойства: 1. ... Алгоритмы Алгоритмы + структуры данных = программы. Лекция 2. О понятии алгоритма. Декларативный подход 1. О формализации понятия алгоритма. Термин «алгоритм» ...
  3. Алгоритмы и основы программирования

    Практическая работа >> Информатика, программирование
    ... типов алгоритмов и разновидностей алгоритмов. Разнообразие алгоритмов определяется тем, что любой алгоритм распадается на ... соответствующие операторы, является разветвляющий алгоритм. Разветвляющий алгоритм – это алгоритм с проверкой некоторых действий, ...
  4. Алгоритмы и программы. Понятие алгоритма и его характерные свойства

    Реферат >> Информатика, программирование
    ... после­дова­тельность выполнениия команд). 2. Характерные свойства алгоритмов. Понятию алгоритма присущи следующие свойства: 1. Элементарность ... должно быть определено в виде алгоритма. Пример 4. Алгоритм Евклида вычисления наибольшего общего делителя ...
  5. Алгоритмы обнаружения и сопровождения траекторий целей по дискретным измерениям

    Реферат >> Физика
    ... обработки, когда оба эти алгоритма объединены в единый алгоритм обнаружения и сопровождения траектории, а реализация ... . 4.2 (двойныестрелки обозначают многомерные (векторные) связи) [2]. Алгоритмы линейной фильтрации и экстраполяции при фиксированной ...

Хочу больше похожих работ...

Generated in 0.0030519962310791