Sortare şi cǎutare. 8 ianuarie Utilizarea şi programarea calculatoarelor. Curs 11

Σχετικά έγγραφα
Sortare. 29 martie Utilizarea şi programarea calculatoarelor. Curs 16

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

Metode iterative pentru probleme neliniare - contractii

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

Esalonul Redus pe Linii (ERL). Subspatii.

Metode de sortare. Se dau n numere întregi, elemente ale unui vector a. Se cere să se aranjeze elementele vectorului a în ordine crescătoare.

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

MARCAREA REZISTOARELOR

Curs 4 Serii de numere reale

Subiecte Clasa a VIII-a

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

riptografie şi Securitate

Subiecte Clasa a VII-a

Curs 1 Şiruri de numere reale

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

Principiul incluziunii si excluziunii. Generarea şi ordonarea permutărilor. Principiul porumbeilor. Pri

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

Metode de interpolare bazate pe diferenţe divizate


III. Reprezentarea informaţiei în sistemele de calcul

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

Integrala nedefinită (primitive)

5.4. MULTIPLEXOARE A 0 A 1 A 2

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

Laborator 11. Mulţimi Julia. Temă

Seminar 5 Analiza stabilității sistemelor liniare

a. 11 % b. 12 % c. 13 % d. 14 %

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

V O. = v I v stabilizator

T R A I A N ( ) Trigonometrie. \ kπ; k. este periodică (perioada principală T * =π ), impară, nemărginită.

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

Criptosisteme cu cheie publică III

Să se arate că n este număr par. Dan Nedeianu

Examen AG. Student:... Grupa:... ianuarie 2011

Proiectarea Algoritmilor 2. Scheme de algoritmi Divide & Impera

Teme de implementare in Matlab pentru Laboratorul de Metode Numerice

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

EDITURA PARALELA 45 MATEMATICĂ DE EXCELENŢĂ. Clasa a X-a Ediţia a II-a, revizuită. pentru concursuri, olimpiade şi centre de excelenţă

Valori limită privind SO2, NOx şi emisiile de praf rezultate din operarea LPC în funcţie de diferite tipuri de combustibili

Curs 2 Şiruri de numere reale

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

1. Tehnici de programare

Asupra unei inegalităţi date la barajul OBMJ 2006

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Eficienta algoritmilor

Tablouri unidimensionale

Sisteme liniare - metode directe

Proiectarea algoritmilor: Programare dinamică

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

Subiecte Clasa a V-a

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

Algoritmi genetici. 1.1 Generalităţi

Lucrare. Varianta aprilie I 1 Definiţi noţiunile de număr prim şi număr ireductibil. Soluţie. Vezi Curs 6 Definiţiile 1 şi 2. sau p b.

Geometrie computationala 2. Preliminarii geometrice

Subiectul III (30 de puncte) - Varianta 001

Algoritmica grafurilor XI. Cuplaje in grafuri. Masuri de calitate. Numere Ramsey

Problema a II - a (10 puncte) Diferite circuite electrice

Foarte formal, destinatarul ocupă o funcţie care trebuie folosită în locul numelui

Erori si incertitudini de măsurare. Modele matematice Instrument: proiectare, fabricaţie, Interacţiune măsurand instrument:

1. Preliminarii 1.1 Ce este un algoritm?

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

Temă pentru acasă. Pointeri către funcţii


Εμπορική αλληλογραφία Ηλεκτρονική Αλληλογραφία

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

Δομές Δεδομένων και Αλγόριθμοι

riptografie şi Securitate

Αλγόριθμοι ταξινόμησης

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

Programarea Calculatoarelor

* K. toate K. circuitului. portile. Considerând această sumă pentru toate rezistoarele 2. = sl I K I K. toate rez. Pentru o bobină: U * toate I K K 1

TEMA 9: FUNCȚII DE MAI MULTE VARIABILE. Obiective:

Curs 2 DIODE. CIRCUITE DR

Προχωρημένες έννοιες προγραμματισμού σε C

Capitolul 2 - HIDROCARBURI 2.5.ARENE

Zgomotul se poate suprapune informaţiei utile în două moduri: g(x, y) = f(x, y) n(x, y) (6.2)

Capitolul ASAMBLAREA LAGĂRELOR LECŢIA 25

5.1. Noţiuni introductive

Noţiuni introductive

3. ALGORITMI GENETICI

B={0,1,...,MAX-1} : K

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

Sisteme diferenţiale liniare de ordinul 1

Instructiunea while. Forma generala: while (expresie) instructiune;

CONCURSUL INTERJUDEȚEAN DE MATEMATICĂ TRAIAN LALESCU, 2017 Clasa a V-a

Inteligenta Artificiala Universitatea Politehnica Bucuresti Anul universitar

Teorema Rezidurilor şi Bucuria Integralelor Reale

Functii Breviar teoretic 8 ianuarie ianuarie 2011

1. PROPRIETĂȚILE FLUIDELOR

Transcript:

Sortare şi cǎutare 8 ianuarie 2004

Sortare şi cǎutare 2 Sortarea. Generalitǎţi Sortarea = aranjarea unei liste de obiecte dupǎ o relaţie de ordine datǎ (ex.: pentru numere, ordine lexicograficǎ pt. şiruri, etc.) una din clasele cele mai fundamentale şi studiate de algoritmi [D. Knuth - Tratat de programare a calculatoarelor. Vol. 3: Sortare şi cǎutare] sortare internǎ (în memorie) sau externǎ (folosind fişiere) Principalele operaţii la sortare: compararea şi interschimbarea vom studia complexitatea algoritmilor (nr. de operaţii necesare) O(f(n)) dacǎ timpul de rulare este cf(n), pt. n > n 0 Ω(f(n)) dacǎ timpul de rulare este cf(n), pt. n > n 0 se studiazǎ pentru cazul cel mai defavorabil şi cel mediu vom raţiona despre corectitudinea algoritmilor folosind invarianţi

Sortare şi cǎutare 3 Înainte de a sorta...... sǎ generǎm un tablou de numere aleatoare pe care sǎ le sortǎm. int rand(void); /* ^ın stdlib.h */ genereazǎ numǎr pseudoaleator între 0 şi RAND MAX void srand(unsigned seed); seteazǎ starea iniţialǎ pentru generatorul de numere pseudoaleatoare OBS: în absenţa apelului la srand, funcţia rand va repeta aceeaşi secvenţǎ generatǎ pentru fiecare rulare se poate iniţializa generatorul în funcţie de ceas (time.h): time t time(time t *timer); (time t e unsigned long) ret. nr. de secunde trecute de la o datǎ origine (UNIX: 1 ian. 1970) dacǎ param. pointer e nenul, valoarea se stocheazǎ şi la acea adresǎ. const int N=100; const int MAX=1000; int i, a[n]; srand((int)time(null)); /* iniţializeazǎ generatorul */ for (i = 0; i < N; i++) a[i] = rand() % MAX; /* ^ıntre 0 şi MAX-1 */

Sortare şi cǎutare 4 Algoritmul Bubblesort interschimbǎm elemente adiacente, pornind de la ultimul; cel mai mic element va ajunge pânǎ la începutul tabloului; se continuǎ pentru tabloul de lungime N- 1 rǎmas void swap (int *p, int *q) { /* o vom folosi peste tot */ int aux; aux = *p; *p = *q; *q = aux; void bubblesort(int *a, int N) { int i, j; for (i = 1; i < N; i++) for (j = N-1; j >= i; j--) /* if (a[j] < a[j-1]) swap(&a[j-1], &a[j]);

Sortare şi cǎutare 5 Analiza lui Bubblesort Complexitatea: bucla dupǎ j executǎ N - i comparaţii total: N 1 i=1 N i = N-1 + N-2 +... + 1 = N(N-1)/2 = O(N 2 ) cele mai multe interschimbǎri: pentru şirul iniţial sortat invers Invariant: dupǎ iteraţia i (1 i N), primele i elemente din tablou sunt cele mai mici, şi sunt ordonate Pasul inductiv: în iteraţia i cel mai mic element dintre a[i-1].. a[n-1] e adus pe poziţia i (a[i-1], începând cu 0) Exerciţiu: Modificaţi bubblesort aşa încât: sǎ parcurgǎ tabloul alternativ în ambele direcţii sǎ se încheie atunci când nu se mai produce nici o modificare

Sortare şi cǎutare 6 Sortarea prin selecţie se selecteazǎ cel mai mic element se interschimbǎ cu primul element din tablou se continuǎ pentru tabloul de lungime N- 1 rǎmas void selectionsort (int *a, int N) { int i, j, low; for (i = 0; i < N; i++) { for (low = j = i; ++j < N;) if (a[j] < a[low]) low = j; if (low!= i) swap(&a[i], &a[low]);

Sortare şi cǎutare 7 Analiza sortǎrii prin selecţie Complexitatea: similar cu bubblesort bucla dupǎ j executǎ N - i comparaţii total: N 1 i=1 N i = N-1 + N-2 +... + 1 = N(N-1)/2 = O(N 2 ) însǎ numǎrul de interschimbǎri de elemente: cel mult N-1 preferabil dacǎ dimensiunea elementelor este mare Invariant: acelaşi ca la bubblesort: dupǎ iteraţia i (1 i N), primele i elemente din tablou sunt cele mai mici, şi sunt ordonate

Sortare şi cǎutare 8 Algoritmul Quicksort dezvoltat de Hoare (1960); descompunere recursivǎ în probleme mai mici se alege o valoare numitǎ pivot, în mod ideal cât mai aproape de valoarea medianǎ a elementelor din tablou. se interschimbǎ elemente din tablou pânǎ se partiţioneazǎ în douǎ segmente, cu elemente mai mici şi respectiv mai mari decât pivotul se apeleazǎ recursiv pentru cele douǎ partiţii (tablouri mai mici) Gǎsirea pivotului: o euristicǎ simplǎ (ex. mediana a 3 elemente) int findpivot (int *a, int i, int j) { int m, n, p; m = rand() % (j - i + 1); n = rand() % (j - i + 1); p = rand() % (j - i + 1); return (a[m] < a[n])? ((a[n] < a[p])? a[n] : max(a[m], a[p])) : ((a[m] < a[p])? a[m] : max(a[n], a[p]))

Sortare şi cǎutare 9 Quicksort: algoritmul propriu-zis void partition (int *a, int i, int j, int *pl, int *pr) { int p, l = i, r = j; p = findpivot(a, i, j); while (1) { while (l <= j && a[l] <= p) l++; while (r >= i && a[r] >= p) r--; if (l < r) swap(&a[l], &a[r]); else break; *pl = l; *pr = r; void quicksort (int *a, int i, int j) { int l, r; partition(a, i, j, &l, &r); if (r > i) quicksort (a, i, r); if (l < j) quicksort (a, l, j);

Sortare şi cǎutare 10 Discuţia algoritmului Quicksort timpul mediu de rulare este O(n log n) (limita teoreticǎ inferioarǎ pentru sortarea bazatǎ pe comparaţii). O(n 2 ) în cazul cel mai defavorabil de alegere a pivotului cu algoritm mai sofisticat pt. pivot, O(n log n) în toate cazurile numeroase variante pe lângǎ cea prezentatǎ la invocarea recursivǎ, pentru subproblemele mici se foloseşte de regulǎ unul din algoritmii mai simpli În C: implementat ca funcţie standard de bibliotecǎ: void qsort(void *base, size t num, size t size, int (*compar)(void *, void *));

Sortare şi cǎutare 11 Cǎutare: ghicire din nr. minim de întrebǎri #include <stdio.h> void main(void) { unsigned m, lo = 0, hi = (1 << 10) - 1; printf("g^andiţi-vǎ la un numǎr ^ıntreg ^ıntre 0 şi %d\n", hi); do { m = (lo + hi) >> 1; printf("numǎrul e mai mare dec^at %d? (d/n) ", m); if (tolower(getchar()) == d ) lo = m+1; else hi = m; while (getchar()!= \n ); while (lo < hi); printf("numǎrul este %d!\n", lo); Invariant: lo nr cǎutat hi Altfel spus: gǎsim pe rând biţii din scrierea binarǎ a numǎrului cǎutat

Sortare şi cǎutare 12 Cǎutare binarǎ: recursiv şi nerecursiv Cǎutǎm cheia v în tablou sortat int a[n]; returnǎm indicele int bsrch_nr(int v, int *a, int l, int r) { while(l<r) { int m = (l+r)/2; if (v>a[m]) l=m+1; else r=m; if (v==a[l]) return l; else return -1; int bsrch(int v, int *a, int l, int r) { int m; if (l<r) { int m = (l+r)/2; if (v>a[m]) return bsrch(v, a, m+1, r); else return bsrch(v, a, l, m); else if (v==a[l]) return l; else return -1; void *bsearch(const void *key, const void *base, size t nmemb, size t size, int (*compar)(const void *, const void *));