ALGORITHMICS

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

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

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

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

Diapositive 1

E_d_Informatica_sp_SN_2014_bar_10_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

Calcul Numeric

Programarea şi utilizarea calculatoarelor

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

SUBPROGRAME

Analiză statică Analiza fluxului de date 23 octombrie 2014

Subiectul 1

E_d_Informatica_sp_MI_2015_bar_02_LRO

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_10_RO_2019_v1.pptx

Elemente de aritmetica

Backtracking_2018

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

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

Microsoft Word - D_ MT1_II_001.doc

Analiză de flux de date 29 octombrie 2012

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

carte2008.dvi

Microsoft Word - Curs1.docx

Metode de programare Proiectarea algoritmilor

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

LOGICA MATEMATICA SI COMPUTATIONALA Sem. I,

BAC 2007 Pro Didactica Programa M1 2 Rezolvarea variantei 61 versiune finală Redactia Pro Didactica Suportul pe net:

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

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Programarea şi utilizarea calculatoarelor

METODE NUMERICE ÎN INGINERIE

CONCURSUL NAŢIONAL DE MATEMATICA PANAITOPOL EDIŢIA a X-a, TULCEA, 21 aprilie 2018 Clasa a VII - a 1. Se consideră numerele reale x, y şi z, cel puţin

Microsoft Word - CarteC.doc

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o

Paradigme de programare

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

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

I. Partea introductivă Proiectul unității de învățare CONCEPTUL DE MATRICE ŞCOALA: Colegiul Național Petru Rareș Suceava CLASA: a XI a- matematică / a

Curs8

Modelarea si Simularea Sistemelor de Calcul

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

PROGRAMA CONCURSULUI NAŢIONAL

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

09. Informatica 2 - MM 1

SSC-Impartire

LUCRAREA 8 PROGRAMAREA NELINIARĂ ÎN REZOLVAREA PROBLEMELOR DIN ENERGETICĂ. METODE DE ORDINUL Aspecte generale Programarea neliniară are o foart

B

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

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 - PCLP2_Curs_4_2019.doc

OLM_2009_barem.pdf

Microsoft Word - O problema cu bits.doc

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

gaussx.dvi

Microsoft Word - CarteC.doc

ALGORITHMICS

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

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Examen de licenţă Informatică Exemple de întrebări - Structuri discrete şi algoritmi In atenţia studenţilor: Proba scrisă a examenului de licen

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

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

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

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

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

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

L7

Microsoft Word - Tema 06 - Convertoare analog-numerice.doc

Calcul Numeric

Microsoft PowerPoint - Fp_2.ppt

Probleme rezolvate informatica: Probleme rezolvate grafuri si a

Microsoft Word - l10.doc

Examen de licenţă Informatică Exemple de întrebări - Structuri discrete şi algoritmi In atenţia studenţilor: Proba scrisă a examenului de licen

Divide et Impera

Lab6LCD

tehnologii web

2

SECURITATE ȘI CRIPTOGRAFIE

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

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

CLP_UTCN-grila-2012.dvi

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

OPERATII DE PRELUCRAREA IMAGINILOR 1

GHERCĂ MAGDA CASA CORPULUI DIDACTIC BRĂILA PORTOFOLIU EVALUARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A Neamț SERIA 1 GRUPA 1 CURSANT: GHERCĂ G

PowerPoint-Präsentation

Coman Marinela Furnizor program formare acreditat: CCD BRĂILA Denumire program: INFORMATICĂ ŞI TIC PENTRU GIMNAZIU Clasa a V-a Categorie: 1; Tip de co

Școala: Clasa a V-a Nr. ore pe săptămână: 4 Profesor: MATEMATICĂ Clasa a V-a Aviz director PLANIFICARE CALENDARISTICĂ ORIENTATIVĂ Nr. crt. Unitatea de

Microsoft Word - cap1p4.doc

Microsoft Word - Rezolvarea Test nr. 11.doc

-

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

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

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Capitole Speciale de Informatică Curs 1: Extragerea informaţiilor. Modelul boolean şi modelul boolean extins 27 septembrie 2018 Extragerea informaţiil

Microsoft PowerPoint - Prezentarea_programelor_de_studii_de_licenta_2019

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

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.

Noțiuni de bază ale criptografiei

Transcriere:

CURS 2: Descrierea algoritmilor în pseudocod =Exemple= 1

Structura Descrierea unor algoritmi simpli Specificarea și utilizarea subalgoritmilor 2

Exemplu 1 Considerăm un tabel cu informații despre studenți Nr. Nume Note Credite Stare Medie 1 A 8 6 7 60 2 B 10 10 10 60 3 C - 7 5 40 4 D 6 - - 20 5 E 8 7 9 60 Problema: să se completeze coloanele stare și medie folosind regulile stare = 1 dacă Credite=60 stare= 2 dacă Credite este in [30,60) stare= 3 dacă Credite <30 (obs: 1 credit=25 ore de activitate) media aritmetică a notelor se calculează doar dacă Credite =60 3

Exemplu 1 După completare tabelul va arăta astfel: Nr. Nume Note Credite Stare Medie 1 A 8 6 7 60 1 7 2 B 10 10 10 60 1 10 3 C - 7 5 40 2-4 D 6 - - 20 3-5 E 8 7 9 60 1 8 stare = 1 dacă Credite=60 stare= 2 dacă Credite este in [30,60) stare= 3 dacă Credite <30 4

Exemplu 1 Ce fel de date vor fi prelucrate? Nr. Nume Note Credite Stare Medie 1 A 8 6 7 60 2 B 10 10 10 60 3 C - 7 5 40 4 D 6 - - 20 5 E 8 7 9 60 Date de intrare: Note si Credite note[1..5,1..3] : tablou bidimensional (matrice) cu 5 linii și 3 coloane Descriere în pseudocod: int note[1..5,1..3] 5

Exemplu 1 Ce fel de date vor fi prelucrate? Nr. Nume Note Credite Stare Medie 1 A 8 6 7 60 2 B 10 10 10 60 3 C - 7 5 40 4 D 6 - - 20 5 E 8 7 9 60 Date de intrare: Note și Credite credite[1..5] : tablou unidimensional cu 5 elemente Descriere in pseudocod: int credite[1..5] 6

Exemplu 1 Ce fel de date vor fi prelucrate? Nr. Nume Note Credite Stare Medie 1 A 8 6 7 60 2 B 10 10 10 60 3 C - 7 5 40 4 D 6 - - 20 5 E 8 7 9 60 Date de ieșire: Stare si Medie stare[1..5], medie[1..5] : tablouri unidimensionale cu 5 elemente Descriere pseudocod: int stare[1..5] real medie[1..5] 7

Exemplu 1 Regula pt.determinarea stării asociate unui student stare = 1 dacă credite=60 stare= 2 dacă credite in [30,60) stare= 3 dacă credite <30 da credite=60 nu Descriere în pseudocod: if credite=60 then stare 1 else if credite>=30 then stare 2 else stare 3 endif endif stare 1 da credite>=30 nu stare 2 stare 3 Descriere in Python if credite==60: stare=1 elif credite>=30: stare=2 else: stare=3 8

Exemplu 1 Completarea stării pentru toți studenții i 1 Obs: Numărul studenților este notat cu n (în exemplul analizat n=5) i<=n nu STOP Pas 1: se pornește de la prima linie din tabel (i 1) Pas 2: se verifică dacă mai sunt linii de prelucrat (i<=n); dacă nu, se oprește prelucrarea Pas 3: se calculează starea elementului i Pas 4: se pregătește indicele următorului element (i i+1) Pas 5: se continuă cu Pas 2 =60 da calcul stare[i] i i+1 1 >=30 2 3 9

Completarea stării pentru toți studenții i 1 i<=n da calcul stare[i] i i+1 nu Exemplu 1 STOP Pseudocod: int credite[1..n], stare[1..n], i i 1 while i<=n do if credite[i]=60 then stare[i] 1 else if credite[i]>=30 then stare[i] 2 endif i i+1 endwhile endif else stare[i] 3 10

Simplificarea descrierii algoritmului prin gruparea unor prelucrări in cadrul unui subalgoritm Pseudocod: int credite[1..n], stare[1..n], i i 1 while i<=n do stare[i] calcul(credite[i]) i i+1 endwhile Exemplu 1 Descriere subalgoritm (modul / funcție /procedură/ rutină ): calcul (int c) int stare if c=60 then stare 1 else if c>=30 then stare 2 endif else stare 3 endif return stare Obs: un subalgoritm descrie un calcul efectuat asupra unor date generice numite parametri 11

Utilizarea subalgoritmilor Idei de bază: Problema inițială se descompune în subprobleme Pentru fiecare subproblemă se proiectează un algoritm (numit subalgoritm sau modul sau funcție sau procedură) Prelucrările din cadrul subalgoritmului se aplică unor date generice (numite parametri) și eventual unor date ajutătoare (numite variabile locale) Prelucrările specificate în cadrul subalgoritmului sunt executate în momentul apelului acestuia (când parametrii generici sunt inlocuiți cu valori concrete) Efectul unui subalgoritm constă în : Returnarea unuia sau a mai multor rezultate Modificarea valorilor unor parametri (sau a unor variabile globale) 12

Utilizarea subalgoritmilor Mecanismul de comunicare intre algoritm si subalgoritmi: - parametri și valori returnate Algoritm Variabile (globale) Calcule locale. Apel subalgoritm.. Calcule locale Date intrare Date iesire Subalgoritm Parametri: - intrare - iesire Variable locale Calcule asupra variabilelor locale si parametrilor Returnarea rezultatelor 13

Utilizarea subalgoritmilor Mecanismul de comunicare intre algoritm si subalgoritmi: - parametri si valori returnate Algoritm int credite[1..n], stare[1..n], i i 1 while i<=n do stare[i] calcul(credite[i]) i i+1 endwhile Date intrare Date iesire Subalgoritm calcul (int c) int stare if c=60 then stare 1 else if c>=30 endif endif return stare Param. intrare then stare 2 else stare 3 Var. locala Rezultat de returnat 14

Utilizarea subalgoritmilor Structura unui subalgoritm: <nume subalgoritm> (<parametri formali (generici)>) < declarații ale variabilelor locale > < prelucrări > RETURN <rezultate> Apelul unui subalgoritm: <nume subalgoritm> (<parametri efectivi>) 15

Înapoi la Exemplul 1 Pseudocod: int credite[1..n], stare[1..n], i i 1 while i<=n do stare[i] calcul(credite[i]) i i+1 endwhile Alta variantă: int credite[1..n], stare[1..n], i for i 1,n do stare[i] calcul(credite[i]) endfor Subalgoritm (functie) : calcul (int c) int stare if c=60 then stare 1 else if c>=30 then stare 2 else stare 3 endif endif return stare 16

Înapoi la Exemplul 1 Python: credite=[60,60,40,20,60] n=len(credite) stare=[0]*n i=0 while i<n: stare[i]=calcul(credite[i]) i=i+1 print stare Utilizare for in loc de while: for i in range(n): stare[i]=calcul(credite[i]) Functie Python: def calcul(c): if c==60: stare=1 elif c>=30: stare=2 else: stare=3 return stare Obs: indentarea liniilor este foarte importantă în Python 17

Înapoi la Exemplul 1 Nr. Nume Note Credite Stare Medie 1 A 8 6 7 60 1 2 B 10 10 10 60 1 3 C - 7 5 40 2 4 D 6 - - 20 3 5 E 8 7 9 60 1 Calcul medie: pentru studenții având starea=1 trebuie calculată media aritmetică a notelor Notele studentului i se află pe linia i a matricii note (se pot specifica prin note[i,1..m]) 18

Înapoi la Exemplul 1 Calculul mediei Funcție pt calcul medie int note[1..n,1..m], stare[1..n] real medie[1..n] for i 1,n do if stare[i]=1 medie[i] calculmedie(note[i,1..m]) endif endfor Linia i a matricii = tablou unidimensional calculmedie(int v[1..m]) real suma int i suma 0 for i 1,m do suma suma+v[i] endfor suma suma/m return suma 19

Înapoi la Exemplul 1 Calculul mediei (exemplu Python) note=[[8,6,7],[10,10,10],[0,7,5],[6,0,0],[8,7,9]] stare=[1,1,2,3,1] medie=[0]*5 for i in range(5): if stare[i]==1: medie[i]=calculmedie(note[i]) print medie Obs: range(5) = [0,1,2,3,4] In Python indicii tablourilor încep de la 0 Functie pt. calculul mediei (Python) def calculmedie(note): m=len(note) suma=0 for i in range(m): suma = suma+note[i] suma=suma/m return suma 20

Pauză... de ciocolată Am o tabletă de ciocolată pe care doresc să o rup în bucățele (în cazul unei tablete 4x6 sunt 24 astfel de bucățele). Care este numărul de mișcări de rupere necesare pentru a separa cele 24 de bucățele? (la fiecare mișcare pot rupe o bucată în alte două bucăți doar de-a lungul uneia din liniile separatoare ale tabletei) 21

Pauză... de ciocolată Am o tabletă de ciocolată pe care doresc să o rup în bucățele (în cazul unei tablete 4x6 sunt 24 astfel de bucățele). Care este numărul de mișcări de rupere necesare pentru a separa cele 24 de bucățele? (la fiecare mișcare pot rupe o bucată în alte două bucăți doar de-a lungul uneia din liniile separatoare ale tabletei) Răspuns: 23 (în cazul unei tablete de mxn numărul de mișcări este mxn-1) Cum putem demonstra? 22

Pauză... de ciocolată Prin inducție matematică (pentru o tabletă cu N=nxm bucățele) Caz particular: bucata întreagă (1) nu necesită nici o rupere (0) Ipoteză: Prespunem că pentru orice K<N sunt necesare și suficiente K-1 mișcări. Pentru a obține N bucăți se procedează astfel: Se rupe tableta în două bucăți (cu K 1 <N respectiv K 2 <N bucățele, K 1 +K 2 =N) o mișcare Se rupe fiecare dintre cele două bucăți în bucățele (K 1-1+K 2-1=K 1 +K 2-2 mișcări) Total: K 1 +K 2-2+1=K 1 +K 2-1=N-1 mișcări 23

Exemplu 2 cel mai mare divizor comun Problema: Fie a și b două numere reale. Să se determine cel mai mare divizor al lui a și b: cmmdc(a,b) Metoda lui Euclid (varianta bazată pe împărțiri): Se calculează restul r al împărțirii lui a (deîmpărțit) la b (împărțitor) Inlocuiește valoarea deimpărțitului (a) cu valoarea împărțitorului (b), valoarea împărțitorului (b) cu valoarea restului r și calculează din nou restul împărțirii lui a la b Procesul continuă până se obține un rest egal cu 0 Restul anterior (care este evident diferit de 0) va fi cmmdc(a,b). 24

Exemplu 2 cel mai mare divizor comun Cum funcționează metoda? Observații: 1: a=bq 1 +r 1, 0<=r 1 <b 2: b=r 1 q 2 +r 2, 0<=r 2 <r 1 3: r 1 =r 2 q 3 +r 3, 0<=r 3 <r 2 i: r i-2 =r i-1 q i +r i, 0<=r i <r i-1 n-1: r n-3 =r n-2 q n-1 +r n-1, 0<=r n-1 <r n-2 n : r n-2 =r n-1 q n, r n =0 la fiecare pas deîmpărțitul ia valoarea vechiului împărțitor iar noul împărțitor ia valoarea vechiului rest secvența de resturi este un șir strict descrescător de numere naturale, astfel că există o valoare n astfel încât r n =0 (metoda este finită) utilizând aceste relații se poate demonstra ca r n-1 este într-adevar cmmdc(a,b) 25

Exemplu 2 cel mai mare divizor Cum funcționează metoda? 1: a=bq 1 +r 1, 0<=r 1 <b 2: b=r 1 q 2 +r 2, 0<=r 2 <r 1 3: r 1 =r 2 q 3 +r 3, 0<=r 3 <r 2 i: r i-2 =r i-1 q i +r i, 0<=r i <r i-1 n-1: r n-3 =r n-2 q n-1 +r n-1,0<=r n-1 <r n-2 n : r n-2 =r n-1 q n, r n =0 comun Demonstratie: din ultima relație rezultă că r n-1 divide pe r n-2, din penultima relație rezultă că r n-1 divide pe r n-3 s.a.m.d. rezultă astfel că r n-1 divide atât pe a cât și pe b (deci este divizor comun) pt a arăta că r n-1 este cmmdc considerăm că d este un alt divizor comun pentru a și b; din prima relație rezultă că d divide r 1 ; din a doua rezultă că divide pe r 2 s.a.m.d. din penultima relație rezultă că d divide pe r n-1 Deci orice alt divizor comun il divide pe r n-1 => r n-1 este cmmdc 26

Exemplu 2 cel mai mare divizor Algoritm (varianta WHILE ): comun Algoritm : (varianta REPEAT ) cmmdc(int a,b) int d,i,r d a i b r d MOD i while r!=0 do d i i r r d MOD i endwhile return i cmmdc(int a,b) int d,i,r d a i b repeat r d MOD i d i i r until r=0 return d 27

Exemplu 2 cmmdc al unei secvențe de valori Problema: să se determine cmmdc al unei secvențe de numere naturale nenule Exemplu: cmmdc(12,8,10)=cmmdc(cmmdc(12,8),10)=cmmdc(4,10)=2 Date de intrare: secvența de valori (a 1,a 2,..., a n ) Date de ieșire (rezultat): cmmdc (a 1,a 2,..., a n ) Idee: Se calculează cmmdc al primelor două elemente, după care se calculează cmmdc pentru rezultatul anterior și noua valoare e natural să se utilizeze un subalgoritm care calculează cmmdc 28

Exemplu 2 cmmdc al unei secvențe Structura algoritmului: de valori cmmdcsecventa(int a[1..n]) int d,i d cmmdc(a[1],a[2]) for i 3,n do d cmmdc(d,a[i]) endfor return d cmmdc (int a,b) int d,i,r d a i b r d MOD i while r!=0 do d i i r r d MOD i endwhile return i 29

Exemplu 3: problema succesorului Se consideră un număr constituit din 10 cifre distincte. Să se determine elementul următor din secvența crescătoare a numerelor naturale constituite din 10 cifre distincte. Exemplu: x= 6309487521 Data de intrare: tablou unidimensional cu 10 elemente ce conține cifrele numărului: [6,3,0,9,4,8,7,5,2,1] Care este următorul număr (în ordine crescătoare) ce conține 10 cifre distincte? Răspuns: 6309512478 30

Exemplu 3: problema succesorului Pas 1. Determină cel mai mare indice i având proprietatea că x[i-1]<x[i] (se consideră că prima cifră, adică 6, are indicele 1) Exemplu: x= 6309487521 i=6 Pas 2. Determină cel mai mic x[k] din subtabloul x[i..n] care este mai mare decât x[i-1] Exemplu: x=6309487521 k=8 Pas 3. Interschimbă x[k] cu x[i-1] Exemplu: x=6309587421 (aceasta valoare este mai mare decât cea anterioară) Pas 4. Sortează x[i..n] crescător (pentru a obține cel mai mic număr care satisface cerințele) Exemplu: x=6309512478 (este suficient să se inverseze ordinea elementelor din x[i..n]) Algoritmi si structuri de date - Curs 2 31

Exemplu 3: problema succesorului Subprobleme / subalgoritmi: Identifica: Identifică poziția i a celui mai din dreapta element x[i], care este mai mare decât vecinul său stâng (x[i-1]) Input: x[1..n] Output: i Minim: determină indicele celui mai mic element din subtabloul x[i..n] care este mai mare decat x[i-1] Input: x[i-1..n] Output: k Inversare: inversează ordinea elementelor din x[i..n] Input: x[i..n] Output: x[i..n] Algoritmi si structuri de date - Curs 2 32

Exemplu 3: problema succesorului Structura generala a algoritmului: Succesor(int x[1..n]) int i, k i Identifica(x[1..n]) if i=1 then write nu exista succesor!" else k Minim(x[i-1..n]) x[i-1] x[k] x[i..n] Inversare(x[i..n]) write x[1..n] endif Observație: In general interschimbarea valorilor a două variabile necesită 3 atribuiri și utilizarea unei variabile auxiliare (la fel cum schimbarea conținutului lichid a două pahare necesită utilizarea unui alt pahar) a b este echivalent cu aux a a b b aux Algoritmi si structuri de date - Curs 2 33

Exemplu 3: problema succesorului Identifica(int x[1..n]) int i i n while (i>1) and (x[i]<x[i-1]) do i i-1 endwhile return i Minim(int x[i-1..n]) int j k i for j i+1,n do if x[j]<x[k] and x[j]>x[i-1] then k j endif endfor return k Algoritmi si structuri de date - Curs 2 34

Exemplu 3: problema succesorului inversare (int x[left..right]) int i,j i left j right while i<j DO x[i] x[j] i i+1 j j-1 endwhile return x[left..right] Algoritmi si structuri de date - Curs 2 35

Exemplu 3: implementare Python def identifica(x): n=len(x) i=n-1 while (i>0)and(x[i-1]>x[i]): i=i-1 return i def minim(x,i): n=len(x) k=i for j in range(i+1,n): if (x[j]<x[k])and (x[j]>x[i-1]): k=j return k def inversare(x,left,right): i=left j=right while i<j: x[i],x[j]=x[j],x[i] i=i+1 j=j-1 return x Obs. In Python interschimbarea a două variable a și b poate fi realizată prin a,b=b,a Algoritmi si structuri de date - Curs 2 36

Exemplu 3: implementare Python # apelul functiilor definite anterior x=[6,3,0,9,4,8,7,5,2,1] print "secventa cifrelor din numarul initial:",x i=identifica(x) print "i=",i k=minim(x,i) print "k=",k x[i-1],x[k]=x[k],x[i-1] print "secventa dupa interschimbare:",x x=inversare(x,i,len(x)-1) print "secventa dupa inversare:",x Algoritmi si structuri de date - Curs 2 37

Sumar Problemele se descompun in subprobleme cărora li se asociază subalgoritmi Un subalgoritm este caracterizat prin: Nume Parametri Valori returnate Variabile locale Prelucrări Apelul unui subalgoritm: Parametrii sunt înlocuiți cu valori concrete Prelucrările din algoritm sunt executate Algoritmi si structuri de date - Curs 2 38

Cursul următor Cum se poate verifica corectitudinea algoritmilor Introducere in verificarea formală a corectitudinii algoritmilor Algoritmi si structuri de date - Curs 2 39

x = 4 y = 6 while y>0 do x = x+1 y = y-1 endwhile Intrebare de final Variante de răspuns: a) 5 b) 4 c) 6 d) 10 e) 2 Ce valoare va avea variabila x după execuția algoritmului de mai sus? https://goo.gl/forms/4dxhwhy ypnvazf0r2 Algoritmi si structuri de date - Curs 2 40