Divide et Impera

Documente similare
Lecții de pregă,re la informa,că Admitere 2019 Tema: Discutarea problemelor date la ul,mele sesiuni de admitere Bogdan Alexe

Algoritmi elementari Metode de căutare secvenţială binară Metode de ordonare metoda bulelor metoda inserţiei metoda selecţiei metoda numărării Intercl

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Metode de sortare - pregătire admitere - Conf.dr. Alexandru Popa Lect. dr. Andrei Pătraşcu Universitatea din Bucureşti 1

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

Curs 8: Tehnica divizării (I) Algoritmi si structuri de date - Curs 8 1

Backtracking_2018

Diapositive 1

ALGORITHMICS

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Subiectul 1

E_d_Informatica_sp_MI_2015_bar_02_LRO

Ecuatii si sisteme de ecuatii neliniare 1 Metoda lui Newton Algorithm 1 Metoda lui Newton pentru ecuaţia f(x) = 0. Date de intrare: - Funcţia f - Apro

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

SUBPROGRAME

Calcul Numeric

B

Slide 1

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

Programarea şi utilizarea calculatoarelor

Slide 1

Ministerul Educatiei, Cercetarii si Tineretului Grup Scolar Gh. Asachi Galati Proiect pentru obtinerea certificatului de competente profesionale Speci

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

Clasa IX 1. O lăcustă face salturi, fiecare salt în linie dreaptă şi de două ori mai lung ca precedentul. Poate vreodată lăcusta să revină în punctul

L7

DAN LASCU ADRIANA-LIGIA SPORIŞ ANDA OLTEANU PAUL VASILIU MATEMATICĂ. CULEGERE DE PROBLEME TIP GRILĂ PENTRU ADMITEREA ÎN ACADEMIA NAVALĂ MIRCEA CEL BĂT

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Slide 1

E_d_Informatica_sp_SN_2014_bar_10_LRO

O NOUA PROBLEMA DE CONCURS OLIMPIADA MUNICIPALA DE INFORMATICA, IASI 2019 V-am promis într-un articol mai vechi ca vom prezenta pe acest blog câteva p

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XII 1.Să se scrie în limbajul C/C++ definiţia comp

Microsoft Word - D_ MT1_II_001.doc

Probleme proiect TP BITPERM Implementați un algoritm care citește de la intrarea standard două numere naturale și scrie la ieșirea standard da

Nr. 932 din Avizat ISJ Vâlcea, Inspector școlar informatică, Ciochină Luisa EXAMEN DE ATESTARE A COMPETENȚELOR PROFESIONALE A ABSOLVENȚILOR

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc

2.1.Tipul tablou unidimensional

Grafuri neorinetate Aplicatii 1 Care este numărul maxim de componente conexe pe care le poate avea un graf neorientat cu 20 noduri şi 12 muchii? a. 6

Probleme rezolvate informatica: Probleme rezolvate grafuri si a

Lucrarea 7 Filtrarea imaginilor BREVIAR TEORETIC Filtrarea imaginilor se înscrie în clasa operaţiilor de îmbunătăţire, principalul scop al acesteia fi

COMENTARII FAZA JUDEŢEANĂ, 9 MARTIE 2013 Abstract. Personal comments on some of the problems presented at the District Round of the National Mathemati

Microsoft Word - Raspunsul la niste provocari. Partea III..doc

Lucrarea nr. 4 - Algoritmi de sortare şi ordonare Breviar teoretic Un algoritm de sortare este o metoda prin care se aranjează elementele unui tablou

Gheorghe IUREA Adrian ZANOSCHI algebră geometrie clasa a VII-a ediţia a V-a, revizuită mate 2000 standard EDITURA PARALELA 45 Matematică. Clasa a VII-

Analiză statică Analiza fluxului de date 23 octombrie 2014

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Algoritmi genetici paraleli. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte laborator. 4. Tema. 1. Ob

Paradigme de programare

Microsoft Word - O problema cu bits.doc

Metode de programare Proiectarea algoritmilor

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

1

Cuantizare Vectoriala.doc

Şiruri de numere reale Facultatea de Hidrotehnică Universitatea Tehnică Gheorghe Asachi Iaşi, 2015 Analiză Matematică Lucian Maticiuc 1 / 29

Capitole Speciale de Informatică Curs 4: Calculul scorurilor în un sistem complet de extragere a informaţiilor 18 octombrie 2018 Reamintim că în cursu

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XI 1.Fişierul text bac.in conţine cel mult 1000 de

Microsoft Word - _arbori.docx

carte2008.dvi

Microsoft Word - Rezolvarea Test nr. 11.doc

Teoria Grafurilor şi Combinatorică recapitulare Principii de numărare Reţineţi că: P (n, r) este numărul de şiruri (sau r-permutări) de forma A 1,...,

Paradigme de Programare

09. Informatica 2 - MM 1

SSC-Impartire

MergedFile

Capitole Speciale de Informatică Curs 2: Determinarea vocabularului de termeni şi a listelor de postări 4 octombrie 2018 Reamintim că listele de indec

carteInvataturaEd_2.0_lectia5.pdf

Laborator Implementarea algoritmului DES - Data Encryption Standard. Exemplu DES Algoritmul DES foloseşte numere b

Calcul Numeric

Analiză de flux de date 29 octombrie 2012

Slide 1

Microsoft Word - Algoritmi genetici.docx

BARAJ NR. 1 JUNIORI FRANŢA ianuarie Fie x şi y două numere întregi astfel încât 5x + 6y şi 6x + 5y să fie pătrate perfecte. Arătaţi că

Programarea şi utilizarea calculatoarelor

1. a. Să se scrie un algoritm care să afişeze toate numerele de patru cifre care au cifra sutelor egală cu o valoare dată k, şi cifra zecilor cu 2 mai

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Dorel LUCHIAN Gabriel POPA Adrian ZANOSCHI Gheorghe IUREA algebră geometrie clasa a VIII-a ediţia a V-a, revizuită mate 2000 standard EDITURA PARALELA

Facultatea de Matematica si Informatica Universitatea din Bucuresti Structuri liniare Liste. Stive. Cozi - Inserare, cautare, stergere - Lectii de pre

Noțiuni de bază ale criptografiei

PCLPII-C16(9)

Noțiuni matematice de bază

PPSD

tehnologii web

Analiz¼a Matematic¼a - Curs 6 M¼ad¼alina Roxana Buneci

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Retele Petri si Aplicatii

CASA CORPULUI DIDACTIC BRĂILA PORTOFOLIU EVALUARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A Neamț SERIA 1 GRUPA 1 CURSANT: ALTERESCU V. IULIA-CRI

Microsoft Word - CarteC.doc

I

CAPITOLUL I

Grile si probleme siruri de caractere in C++ ŞIRURI DE CARACTERE Itemii următori sunt preluaţi din variantele de bacalaureat În secvenţa de i

INSPECTORATUL ŞCOLAR JUDEŢEAN VÂLCEA COLEGIUL NAŢIONAL DE INFORMATICĂ MATEI BASARAB RÂMNICU VÂLCEASTR. HENRI COANDĂ NR.2 TELEFON/FAX:

Managementul Resurselor Umane

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

20 SUBIECTE DE EXAMEN - De fapt, în pofida acestor probleme, până la urmă tot vom logaritma, căci aceasta este tehnica naturală în context. Trebuie do

Microsoft Word - cap1p4.doc

Structuri de date pentru partiţii de mulţimi O partiţie finită a unei mulţimi nevide S este o mulţime finită de submulţimi ale lui S: {S 1, S 2,..., S

Cursul 7 Formula integrală a lui Cauchy Am demonstrat în cursul precedent că, dacă D C un domeniu simplu conex şi f : D C o funcţie olomorfă cu f cont

Transcriere:

Metoda Divide et Impera Lect. Dr. Marina Cidota Facultatea de Matematică şi Informatică Universitatea din Bucureşti cidota@fmi.unibuc.ro Prezentare realizată pe baza: 1. Horia Georgescu. Tehnici de programare, editura Universităţii din Bucuresti, 2005. 2. Ioan Odăgescu, Felix Furtună. Metode şi tehnici de programare, editura Computer Libris Agora, 1998.

Metoda Divide et Impera constă în împărţirea repetată a unei probleme de dimensiuni mari în mai multe subprobleme de acelaşi tip, urmată de rezolvarea acestora şi combinarea rezultatelor obţinute pentre a determina rezultatul corespunzător problemei iniţiale. dacă dimensiunea unei subprobleme este suficient de mică, ea este rezolvată direct. caracter recursiv

Schema generală prelucrare asupra elementelor unui vector function DivImp(p,u) if (u p<ε) then r Prel(p,u); else { m Interm(p,u); r1 DvImp(p,m); r2 DivImp(m+1,u); r Combin(r1,r2); return r; ; Funcţia DivImp, care întoarce rezultatul prelucrării asupra unei subsecvenţe a p,...a u, va fi apelată prin DivImp(1,n).

Exemplul 1 Sortare prin interclasare procedure Inter(p,m,u) k1 p; k2 m+1; k3 p; while (k1 m && k2 u) if (a k1 <a k2 ) then {b k3 a k1 ; k1 k1+1; else {b k3 a k2 ;k2 k2+1; k3 k3+1; if (k1>m) // au fost epuizate elementele primei subsecvenţe then for i=k2,u b k3 a i ; k3 k3+1; else // au fost epuizate elementele celei de a 2-a subsecvenţe for i=k1,m b k3 a i ; k3 k3+1; for i=p,u a i b i;

Exemplul 1 Sortare prin interclasare procedure SortInter(p,u) if (p==u) then else m (p+u)/2 ; SortInter(p,m); SortInter(m+1,u); Inter(p,m,u); In programul principal se face apelul SortInter(1,n)

Exemplul 2 Sortare rapidă Fie (a p,...,a u ) secvenţa curentă care trebuie sortată. Vom poziţiona pe a p în secvenţa (a p,...,a u ), adică printr-o permutare a elementelor secvenţei: x=a p va trece pe o poziţie k; toate elementele aflate la stânga poziţiei k vor fi mai mici decât x; toate elementele aflate la dreapta poziţiei k vor fi mai mari decât x.

Exemplul 2 Sortare rapidă function poz(p,u) i p; j u; ii 0; jj -1 while (i<j) if (a i <a j ) then else {a i a j ; (ii,jj) (-jj,-ii); i i+ii; j j+jj; poz i;

Exemplul 2 Sortare rapidă procedure QuickSort(p,u) if (p>=u) then else {k poz(p,u); QuickSort(p,k-1); QuickSort(k+1,u); Sortarea se realizează prin apelul QuickSort(1,n)

Exemplul 3 Căutarea binară Se consideră vectorul a=(a 1,...,a n ) ordonat crescător şi o valoare x. Se cere să se determine dacă x apare printre componentele vectorului. Vom adăuga a 0 =-, a n+1 =+. Căutăm perechea (b,i) dată de: (true,i) dacă a i =x; (false,i) dacă a i-1 <x<a i. Deoarece problema se reduce la o singură subproblemă, nu mai este necesar să folosim recursivitatea.

Exemplul 3 Căutarea binară procedure CautBin p 1; u n while (p u) i (p+u)/2 ; case a i >x : u i-1; a i =x : write(true,i); return; a i <x : p i+1; write(false,p);

Exemplul 4 Problema turnurilor din Hanoi Se consideră 3 tije. Iniţial pe tija 1 se află n discuri cu diametrele decrescătoare privind de la bază către vârf, iar pe tijele 2 şi 3 nu se află nici un disc. Se cere să se mute aceste discuri pe tija 2, ajutându-ne şi de tija 3, respectând condiţia ca în permanenţă pe orice tijă sub orice disc să se afle baza tijei sau un disc de diametru mai mare.

Exemplul 4 Problema turnurilor din Hanoi Fie H(m;i,j) şirul de mutări prin care cele m discuri din vârful tijei i sunt mutate peste cele de pe tija j, folosind şi a treia tijă, al cărei număr este k=6-i-j. Problema constă în a determina H(n;1,2). Se observă că este satisfăcută relaţia: H(m;i,j) = H(m-1;i,k) (i,j) H(m-1;k,j)

Exemplul 4 Problema turnurilor din Hanoi procedure Hanoi(n,i,j) if (n==1) then write(i,j); else { k 6-i-j; Hanoi(n-1,i,k); Hanoi(1,i,j); Hanoi(n-1,k,j); Observaţie. Numărul de mutări este 2 n -1.

Exemplul 5 Placa cu găuri Se da o placă dreptunghiulară în care sunt facute n găuri şi poziţiile lor date prin coordonatele (x,y). Ştiind ca găurile sunt considerate punctiforme, să se determine placa de arie maximă care se poate decupa din placa iniţială şi care nu contine în interior nicio gaură. Să considerăm placa iniţială având coordonatele (0,0) - colţul din stânga-jos şi (L, l) colţul din dreapta-sus. Fie (x i, y i ), i=1,, n, coordonatele celor n găuri

Exemplul 5 Placa cu găuri procedure FaraGauri(a,b,c,d,k) float a,b,c,d; int k; for i=1,n if (a<x i <c and b<y i <d) then {k i; return; if for k 0

Exemplul 5 Placa cu găuri procedure Placa(x sj,y sj,x ds,y ds,a,x 01,y 01,x 02,y 02 ) float x sj,y sj,x ds,y ds,a,x 01,y 01,x 02,y 02 call FaraGauri(x sj,y sj,x ds,y ds,k) if (k==0) then {A (x ds -x sj )(y ds -y sj ); x 01 x sj ; y 01 y sj ; x 02 x ds ; y 02 y ds ; else { call Placa(x sj,y sj,x ds,y k,a 1,x 011,y 011,x 021,y 021 ); call Placa(x sj,y k,x ds,y ds,a 2,x 012,y 012,x 022,y 022 ); call Placa(x sj,y ds,x k,y ds,a 3,x 013,y 013,x 023,y 023 ); call Placa(x k,y sj,x ds,y ds,a 4,x 014,y 014,x 024,y 024 ); call AlegeMax(A 1,A 2,A 3,A 4,A,x 01,y 01,x 02,y 02 );

Exemplul 6 Arbori binari Cunoscând vectorii corespunzători parcurgerilor în preordine şi inordine ale unui arbore (care are în fiecare nod o informație număr întreg, distinct de numerele din celelalte noduri), construiți arborele inițial şi parcurgeți-l în preordine şi inordine. Vectorii rsd[0..n-1] si srd[0..n-1] sunt cunoscuți. class Nod{ int info; Nod st,dr; Nod (int i) {info=i;st=dr=null; void inord(nod x){ if (x!=null) {inord(x.st); write(x.info); inord(x.dr); void preord(nod x){ if (x!=null) {write(x.info); preord(x.st); preord(x.dr);

Exemplul 6 Arbori binari Nod creare(int li1,ls1,li2,ls2){ // li1,ls1 sunt marginile inf, respectiv sup ale vectorului srd // li2,ls2 sunt marginile inf, respectiv sup ale vectorului rsd if (li2==ls2) then {Nod rad=new Nod(rsd[li2]); return rad; if (li2<ls2) then {int k,p; for (int i=li1;i<=ls1;i++) if srd[i]=rsd[li2] then k=i; Nod rad=new Nod(rsd[li2]); p=k-li1; rad.st=creare(li1,k-1,li2+1,li2+p); rad.dr=creare(k+1,ls1,li2+p+1,ls2); return rad; if (li2>ls2) then return null; Se apeleaza radacina=creare(0,n-1,0,n-1); inord(radacina);preord(redacina);

Exemplul 7 Subiect dat la admitere in 2017 Fie n un număr natural nenul. Fie v un vector cu n poziții numerotate de la 1 la n și elemente numere naturale diferite, de la 1 la n, într-o ordine oarecare. Pentru i și j numere naturale între 1 și n, numim FLIP(n, v, i, j) operația care inversează ordinea elementelor din v situate pe pozițiile de la i la j. a) Să se scrie în limbaj de programare o procedură (sau funcție) care implementează operația FLIP(n, v, i, j). b) Să se scrie un program care sortează crescător vectorul v, folosind pentru schimbarea ordinii elementelor în v doar operația FLIP(n, v, 1, k), cu k de la 2 la n. c) Considerăm că n este o putere a lui 2 (n = 2 m, cu m număr natural nenul) și vectorul v are proprietatea că pentru orice i de la 1 la m și orice j de la 1 la 2 m-i, există k de la 1 la 2 m-i, astfel încât pe pozițiile din v de la la 2 i (j-1)+1 la 2 i j se află numerele naturale de la la 2 i (k-1)+1 la 2 i k, într-o ordine oarecare. Să se scrie un program care sortează crescător vectorul v, folosind pentru schimbarea ordinii elementelor în v doar operația FLIP(n, v, 2 i (j-1)+1, 2 i j), cu i de la 1 la m și j de la 1 la la 2 m-i, printr-un algoritm mai eficient decât cel implementat la punctul b), care se bazează pe proprietatea vectorului v.

Exemplul 7 Subiect dat la admitere in 2017 void flip(int n, int v[], int i, int j) { i=i-1;//pornim de la 0 in C j=j-1;//pornim de la 0 in C int kk, aux; //nu mergem cu contorul pana la capat pentru ca altfel nu facem nimic for(kk=i;kk<=(i+j)/2;kk++) { aux = v[kk]; v[kk] = v[i+j-kk]; v[i+j-kk] = aux;

Exemplul 7 Subiect dat la admitere in 2017 void sorteazaflip(int n,int v[]){ int ncopie = n,i,j; for(i=ncopie;i>0;i--) { //gaseste pozitia pe care se afla i = maximul din vectorul ramas int maxim = v[0]; int pozmaxim = 0; for(j=1;j<n;j++) if(maxim<v[j]) { maxim = v[j]; pozmaxim = j; flip(n,v,1,pozmaxim+1);//apelez flip cu +1 o pozitie (respect cerinta problemei) flip(n,v,1,n); n = n-1;

Exemplul 7 Subiect dat la admitere in 2017 void sorteazaflipoptimdivideetimpera(int n, int v[],int i,int j) { //conditia de oprire if (j-i==1) { // nu faci nimic daca ai doua elemente return; //divide problema in 2 subprobleme sorteazaflipoptimdivideetimpera(n,v,i,(i+j)/2); sorteazaflipoptimdivideetimpera(n,v,(i+j)/2+1,j);

Exemplul 7 Subiect dat la admitere in 2017 //combina solutia // daca elementele din subvectorul din stanga sunt mai mici decat cele din dreapta // trebuie sa sortez subvectorul din stanga crascator si cel din dreapta crescator if(v[i-1]<v[j-1]) { if (v[i-1] > v[(i+j)/2-1]) flip(n,v,i,(i+j)/2); if(v[(i+j)/2+1-1] > v[j-1]) flip(n,v,(i+j)/2+1,j); else { // elementele din subvectorul din stanga sunt mai mari decat cele din dreapta // trebuie sa sortez subvectorul din stanga descrescator si cel din dreapta descrescator if (v[i-1] < v[(i+j)/2-1]) flip(n,v,i,(i+j)/2); if(v[(i+j)/2+1-1] < v[j-1]) flip(n,v,(i+j)/2+1,j);

Exemplul 8 Problema plierii Se consideră un vector de lungime n. Definim plierea vectorului prin suprapunerea unei jumătăţi numită donatoare peste cealaltă jumătate numită receptoare cu precizarea că dacă numărul de elemente este impar, elementul din mijloc este eliminat. Exemplu: Vectorul (1, 2, 3, 4, 5) se poate plia în două moduri (1, 2) sau (4, 5) elementul 3 fiind eliminat conform ipotezei. Plierea se poate aplica în continuare în mod repetat până când se ajunge la un subşir de lungime 1, numit element final. 1) Fiind dat i {1, 2,..., n să se determine dacă elementul i poate fi element final ca rezultat al unor plieri succesive. 2) Să se precizeze toate elementele finale posibile. 3) Fiind dat un element i final, să se figureze pe ecran o succesiune de plieri prin care se ajunge la el.

Exemplul 8 Problema plierii procedure ElFinale(i,j:integer); var k:integer; begin if (i==j) then f[i]:=true else begin if ((i+j)%2==0) then f[(i+j) div 2]:=false; ElFinale(i,i+j-1-(i+j) div 2); for k:=(i+j) div 2+1 to j do f[k]:=f[i+j-k] ;

Exemplul 8 Problema plierii procedure Mutari(i,j:integer); var k:integer; begin if (i==j) then m[i]:='' else begin if ((i+j)%2==0) then m[(i+j) div 2]:='2'; Mutari(i,i+j-1-(i+j) div 2); for k:=i to i+j-1-(i+j) div 2 do m[k]:='1'+m[k]; Mutari((i+j) div 2 +1,j); for k:=(i+j) div 2+1 to j do m[k]:='0'+m[k] ;

Exemplul 8 Problema plierii Mutari(1,n); i:=1; j:=n; if (!f[v]) then writeln('elementul ',v,' nu este element final') else for k:=1 to Length(m[v]) do begin if copy(m[v],k,1)='1' then begin j:=i+j-1-(i+j) div 2; write('se pliaza dreapta peste stanga:'); write(i,'--->',j); writeln; else begin i:=(i+j) div 2 +1; write('se pliaza stanga peste dreapta:'); write(i,'--->',j); writeln;

Problemă Se dă o tablă de dimensiuni 2 m x 2 m cu o pătrățică lipsă. Să se acopere complet tabla cu formele din partea dreaptă a figurii de mai jos.