Atentie — pozitionare in curriculum

Conform OMEN 3393/2017, gasirea minimului si maximului pe siruri de valori este materie de clasa a VIII-a (domeniu: Siruri de valori numerice). La clasa a VII-a, programa prevede algoritmi cu structuri de control (secvential, alternativ, repetitiv), fara siruri. Aceasta lectie poate fi folosita ca material de aprofundare/anticipare sau la clasa a VIII-a.

Lectia 5 - Algoritmi si Siruri

Maxim si minim - Gasim extremele!

Citeste fiecare concept, apoi raspunde la intrebari pentru a continua

Progres lectie:
0%
🎯

Obiectivul lectiei

"Dupa aceasta lectie vei sti sa gasesti valoarea maxima si minima dintr-un sir, precum si pozitia lor, si vei intelege de ce initializarea corecta este esentiala!"

Dupa aceasta lectie vei putea:

  • Sa explici ce sunt maximul si minimul
  • Sa explici strategia pentru gasirea maximului
  • Sa implementezi algoritmul pentru maxim
  • Sa implementezi algoritmul pentru minim
  • Sa aplici gasirea pozitiei maximului si minimului
1

Ce sunt maximul si minimul?

Maximul este cea mai mare valoare din sir, iar minimul este cea mai mica valoare. Aceste doua valori se numesc extreme si sunt printre cele mai importante informatii pe care le putem extrage dintr-un sir de numere.

In viata de zi cu zi, cautam maxime si minime tot timpul. Care este cea mai mare nota din catalog? Care este cea mai mica temperatura din saptamana? Care jucator a marcat cele mai multe goluri? Care este cel mai ieftin produs din magazin? Toate aceste intrebari cer gasirea maximului sau minimului dintr-o lista de valori.

Exemplu: v = [7, 3, 12, 5, 9]

[1] 7
[2] 3
[3] 12
[4] 5
[5] 9

Maxim = 12 (pe pozitia 3) | Minim = 3 (pe pozitia 2)

Cand sirul are putine elemente, poti gasi maximul si minimul dintr-o privire. Dar imagineaza-ti un sir cu temperaturile din fiecare zi a unui an (365 de valori) sau notele tuturor elevilor dintr-o scoala (sute de valori). In aceste cazuri, ai nevoie de un algoritm care sa parcurga sirul sistematic si sa gaseasca extremele automat.

O observatie importanta: maximul si minimul sunt intotdeauna elemente ale sirului. Nu sunt valori inventate sau calculate - sunt valori care exista efectiv in sir. De exemplu, daca sirul este [3, 7, 2, 9], maximul este 9 (nu 10 sau alta valoare) si minimul este 2 (nu 0 sau 1).

Ce este maximul unui sir?
A Prima valoare
B Cea mai mare valoare
C Ultima valoare
2

Strategia pentru gasirea maximului

Strategia pentru a gasi maximul este simpla si intuitiva. Gandeste-te cum ai cauta cel mai inalt elev din clasa ta: te uiti la primul, retii inaltimea lui ca "cel mai inalt de pana acum". Apoi te uiti la al doilea - daca e mai inalt, acela devine noul "cel mai inalt". Continui pana termini toata clasa.

Algoritmul face exact acelasi lucru, in trei pasi:

  1. Presupunem ca primul element este maximul
  2. Parcurgem restul sirului (de la al doilea element)
  3. La fiecare pas, comparam elementul curent cu maximul - daca gasim un element mai mare, acela devine noul maxim

Analogie din viata reala:

Imagineaza-ti ca esti la piata si vrei sa gasesti cel mai mare mar din ladita. Iei primul mar si il tii in mana ("cel mai mare de pana acum"). Compari pe rand cu fiecare mar din ladita. Daca gasesti unul mai mare, il schimbi cu cel din mana. La final, in mana ai cel mai mare mar!

De ce presupunem ca primul element este maximul si nu initializam cu 0? Pentru ca sirul ar putea contine doar numere negative (de exemplu, [-5, -3, -8]). Daca am initializa maximul cu 0, la final am obtine 0 ca maxim, dar 0 nu exista in sir! Initializarea cu primul element garanteaza ca maximul final va fi intotdeauna un element real din sir.

Aceasta strategie se numeste presupune si verifica : presupunem un raspuns initial (primul element) si apoi verificam daca exista un raspuns mai bun parcurgand restul sirului. Este un tipar foarte puternic in algoritmistica si il vei intalni in multe alte contexte.

Cu ce initializam variabila maxim?
A Cu 0
B Cu primul element v[1]
C Cu ultimul element
3

Algoritmul pentru maxim

Sa scriem algoritmul complet in pseudocod. Observa ca parcurgerea incepe de la pozitia 2, nu de la 1, deoarece primul element a fost deja luat ca valoare initiala pentru maxim:

maxim = v [ 1 ] // presupunem ca primul e maxim
PENTRU i = 2 , n EXECUTA
DACA v [ i ] > maxim ATUNCI
maxim = v [ i ]
SFARSIT_DACA
SFARSIT_PENTRU
SCRIE ("Maximul este: ", maxim )

Sa urmarim traseul complet pentru sirul v = [7, 3, 12, 5, 9] cu n=5:

Pas cu pas:

Initial: maxim = v[1] = 7

i=2: v[2]=3, 3 > 7? NU - maxim ramane 7

i=3: v[3]=12, 12 > 7? DA - maxim devine 12

i=4: v[4]=5, 5 > 12? NU - maxim ramane 12

i=5: v[5]=9, 9 > 12? NU - maxim ramane 12

Maxim = 12

Observa ca maximul s-a schimbat o singura data (la pasul i=3, cand am gasit 12). In cel mai bun caz, maximul nu se schimba deloc (cand primul element este deja cel mai mare). In cel mai rau caz, maximul se schimba la fiecare pas (cand sirul este sortat crescator: [1, 3, 5, 7, 9]).

Nota tehnica: bucla poate incepe si de la i=1 in loc de i=2. In acest caz, la primul pas comparam v[1] cu v[1] (maxim cu el insusi), ceea ce este inutil dar nu gresit. Inceperea de la i=2 este mai eficienta (cu o comparatie mai putin), dar ambele variante dau acelasi rezultat.

Cand actualizam maximul?
A Cand v[i] < maxim
B Cand v[i] > maxim
C La fiecare pas
4

Algoritmul pentru minim

Algoritmul pentru minim este aproape identic cu cel pentru maxim. Singura diferenta este conditia de comparatie : in loc de > (mai mare), folosim < (mai mic). Cautam valori mai mici decat minimul curent.

minim = v [ 1 ] // presupunem ca primul e minim
PENTRU i = 2 , n EXECUTA
DACA v [ i ] < minim ATUNCI
minim = v [ i ]
SFARSIT_DACA
SFARSIT_PENTRU
SCRIE ("Minimul este: ", minim )

Sa facem traseul pentru acelasi sir v = [7, 3, 12, 5, 9] cu n=5:

Pas cu pas:

Initial: minim = v[1] = 7

i=2: v[2]=3, 3 < 7? DA - minim devine 3

i=3: v[3]=12, 12 < 3? NU - minim ramane 3

i=4: v[4]=5, 5 < 3? NU - minim ramane 3

i=5: v[5]=9, 9 < 3? NU - minim ramane 3

Minim = 3

Observa simetria perfecta intre algoritmii de maxim si minim. Structura este identica, doar conditia difera: > pentru maxim, < pentru minim. Aceasta simetrie face foarte usor sa scrii un algoritm daca il cunosti pe celalalt - trebuie doar sa schimbi sensul comparatiei.

Un exercitiu util: daca ai deja algoritmul de maxim scris si ai nevoie de minim, fa urmatoarele modificari: (1) schimba numele variabilei din maxim in minim , (2) schimba conditia din > in < . Atat! Restul ramane identic.

La fel ca la maxim, initializarea se face cu primul element al sirului, nu cu 0 sau alta valoare arbitrara. Daca sirul contine doar numere pozitive mari (de exemplu, [100, 200, 300]) si am initializa minimul cu 0, am obtine 0 ca minim - dar 0 nu exista in sir!

Pentru minim, ce conditie folosim?
A v[i] > minim
B v[i] < minim
C v[i] = minim
5

Gasirea pozitiei maximului si minimului

Uneori nu este suficient sa stim doar valoarea maximului - vrem sa stim si unde se afla in sir (pe ce pozitie). De exemplu, daca avem notele elevilor si gasim nota maxima 10, vrem sa stim si care elev a luat nota 10 (adica pe ce pozitie in sir se afla aceasta nota).

maxim = v [ 1 ]
poz_max = 1 // pozitia maximului
PENTRU i = 2 , n EXECUTA
DACA v [ i ] > maxim ATUNCI
maxim = v [ i ]
poz_max = i // retinem si pozitia
SFARSIT_DACA
SFARSIT_PENTRU
SCRIE ("Maxim: ", maxim , " pe pozitia ", poz_max )

Observa ca am adaugat o variabila noua: poz_max . O initializam cu 1 (pozitia primului element, pe care l-am presupus maxim). In interiorul conditiei DACA, cand actualizam maximul, actualizam simultan si pozitia: poz_max = i . Astfel, la orice moment, poz_max contine pozitia elementului maxim gasit pana acum.

v = [7, 3, 12, 5, 9], n=5

Initial: maxim=7, poz_max=1

i=2: 3>7? NU

i=3: 12>7? DA, maxim=12, poz_max= 3

i=4, i=5: nu se schimba

Maxim = 12, Pozitia = 3

Acelasi principiu se aplica pentru pozitia minimului. Adaugam variabila poz_min initializata cu 1 si o actualizam in interiorul conditiei de minim: poz_min = i .

Daca maximul apare de mai multe ori in sir (de exemplu, v = [5, 12, 8, 12, 3]), algoritmul va retine pozitia primei aparitii (poz_max=2). Daca vrem ultima aparitie, schimbam conditia din > in >= . Daca vrem toate pozitiile, trebuie o abordare diferita: parcurgem sirul, gasim maximul, apoi parcurgem din nou si afisam toate pozitiile unde valoarea este egala cu maximul.

Ce variabila folosim pentru a retine pozitia maximului?
A maxim
B poz_max
C v[i]
6

Maxim si minim simultan

O intrebare fireasca: putem gasi atat maximul cat si minimul intr-o singura parcurgere? Raspunsul este da ! Punem ambele conditii in aceeasi bucla FOR, una dupa alta. La fiecare pas, verificam daca elementul curent este mai mare decat maximul SI daca este mai mic decat minimul.

maxim = v [ 1 ]
minim = v [ 1 ]
PENTRU i = 2 , n EXECUTA
DACA v [ i ] > maxim ATUNCI
maxim = v [ i ]
SFARSIT_DACA
DACA v [ i ] < minim ATUNCI
minim = v [ i ]
SFARSIT_DACA
SFARSIT_PENTRU
SCRIE ("Maxim: ", maxim , " Minim: ", minim )

Observa ca ambele variabile (maxim si minim) sunt initializate cu v[1]. La fiecare pas al parcurgerii, se fac doua verificari independente: una pentru maxim si una pentru minim. Un element nu poate fi simultan mai mare decat maximul SI mai mic decat minimul, deci la fiecare pas cel mult una dintre conditii este adevarata.

Traseu pentru v = [7, 3, 12, 5, 9]:

Initial: maxim=7, minim=7

i=2 (v=3): 3>7? NU | 3<7? DA, minim=3

i=3 (v=12): 12>7? DA, maxim=12 | 12<3? NU

i=4 (v=5): 5>12? NU | 5<3? NU

i=5 (v=9): 9>12? NU | 9<3? NU

Maxim=12, Minim=3

Aceasta abordare este eficienta : parcurgem sirul o singura data si obtinem ambele rezultate. Alternativa ar fi sa parcurgem sirul de doua ori (o data pentru maxim, o data pentru minim), dar aceasta ar fi mai lenta. In programare, eficienta conteaza - cu cat facem mai putine parcurgeri, cu atat programul ruleaza mai repede.

Putem extinde aceasta idee si mai mult: intr-o singura parcurgere putem calcula suma, media, maximul si minimul. Toate aceste operatii se pot face simultan, adaugand instructiunile corespunzatoare in corpul aceleiasi bucle FOR.

Este posibil sa gasim maxim si minim in aceeasi parcurgere?
A Nu, trebuie 2 parcurgeri
B Da, cu 2 conditii in acelasi FOR
C Nu se poate niciodata
7

De ce NU initializam cu 0

Aceasta este una dintre cele mai importante lectii de retinut: nu initializa niciodata maximul sau minimul cu 0 (sau cu orice alta valoare arbitrara). Initializeaza intotdeauna cu primul element al sirului. Sa vedem de ce prin doua exemple concrete.

Exemplul 1: Maxim gresit cu numere negative

// GRESIT: maxim = 0
// Sir: v = [-5, -3, -8, -1]
// La final: maxim = 0 (GRESIT! 0 nu e in sir)
// Raspunsul corect: maxim = -1

Daca initializam maximul cu 0 si sirul contine [-5, -3, -8, -1], la fiecare pas verificam daca elementul este mai mare decat 0. Niciun element nu este mai mare decat 0, deci maximul ramane 0. Dar 0 nu exista in sir! Raspunsul corect este -1 (cel mai mare numar din sir), pe care l-am fi gasit daca am fi initializat cu v[1]=-5.

Exemplul 2: Minim gresit cu numere pozitive

// GRESIT: minim = 0
// Sir: v = [15, 23, 8, 42]
// La final: minim = 0 (GRESIT! 0 nu e in sir)
// Raspunsul corect: minim = 8

Daca initializam minimul cu 0 si sirul contine doar numere pozitive, niciun element nu va fi mai mic decat 0, deci minimul ramane 0. Dar raspunsul corect este 8 (cel mai mic numar din sir).

Regula de aur:

Maximul si minimul se initializeaza intotdeauna cu v[1] (primul element al sirului).

Aceasta garanteaza ca rezultatul va fi un element real din sir.

La teste si examene, aceasta greseala de initializare este una dintre cele mai penalizate. Multi elevi scriu algoritmul perfect dar pierd puncte deoarece initializeaza cu 0 in loc de v[1]. Retine aceasta regula si nu o uita niciodata: maxim si minim se initializeaza cu primul element.

De ce este gresit sa initializam maximul cu 0?
A Nu este gresit niciodata
B Pentru ca sirul ar putea avea doar numere negative
C Pentru ca 0 nu este un numar valid
8

Aplicatie: Amplitudinea

Amplitudinea este diferenta dintre maximul si minimul unui sir. Ne arata cat de "raspandite" sau "variabile" sunt valorile din sir. O amplitudine mare inseamna valori foarte diferite, iar o amplitudine mica inseamna valori apropiate.

// Dupa ce am gasit maxim si minim
amplitudine = maxim - minim
SCRIE ("Amplitudinea: ", amplitudine )

Amplitudinea este un indicator statistic important. In meteorologie, amplitudinea termica zilnica (diferenta dintre temperatura maxima si minima a zilei) ne arata cat de mult variaza temperatura. O amplitudine de 5 grade inseamna o zi stabila, iar o amplitudine de 20 de grade inseamna diferente mari intre zi si noapte.

Exemplu 1: Note elev

Note: [7, 9, 5, 10, 6]

Maxim = 10, Minim = 5

Amplitudine = 10 - 5 = 5

Notele variaza cu 5 puncte - o variatie moderata.

Exemplu 2: Temperaturi saptamana

Temperaturi: [18, 22, 15, 25, 20, 16, 23]

Maxim = 25, Minim = 15

Amplitudine = 25 - 15 = 10

Temperatura a variat cu 10 grade pe parcursul saptamanii.

Amplitudinea se calculeaza dupa ce am gasit maximul si minimul. Deci algoritmul complet este: parcurgem sirul pentru a gasi maxim si minim (intr-o singura parcurgere), apoi calculam amplitudinea ca maxim - minim. Rezultatul este intotdeauna un numar pozitiv sau zero (zero doar daca toate elementele sunt egale).

In sport, amplitudinea scorurilor unui jucator (diferenta dintre cel mai bun meci si cel mai slab meci) ne arata cat de constant este: o amplitudine mica inseamna un jucator stabil, iar o amplitudine mare inseamna un jucator imprevizibil. La fel, amplitudinea notelor unui elev (diferenta dintre cea mai mare nota si cea mai mica nota) ne spune daca elevul este constant sau are rezultate foarte variabile.

Ce aflam cu formula maxim - minim?
A Media
B Amplitudinea (diferenta intre extreme)
C Suma
9

Maxim si minim cu conditie

La fel ca la suma si media, putem cauta maximul sau minimul doar printre elementele care indeplinesc o anumita conditie. De exemplu: care este cel mai mare numar par din sir? Care este cel mai mic numar pozitiv? Aceasta combina algoritmul de maxim/minim cu o conditie de filtrare.

Pasul 1 — problema initializarii. Pana acum am initializat maximul cu v[1] (primul element). Dar acum vrem doar elementele pare. Ce facem daca v[1] este impar? Nu putem folosi v[1] ca punct de start, pentru ca el nu indeplineste conditia noastra. Avem nevoie de o alta strategie.

Pasul 2 — ideea fanionului. Gandeste-te la un fanion (steag) care semnalizeaza daca am gasit sau nu primul element care ne intereseaza. Initializam variabila gasit cu 0 (nu am gasit inca niciun element par). Cand gasim primul element par, ridicam fanionul: gasit = 1. Orice al doilea, al treilea element par se compara normal cu maximul curent.

Pasul 3 — logica completa in doua ramuri. La fiecare element par din sir avem exact doua situatii posibile: fie gasit = 0 (e primul par — il punem direct ca maxim_par), fie gasit = 1 (mai avem cel putin un par deja — comparam cu maxim_par si pastram cel mai mare). Aceasta este toata complexitatea: doua situatii, doua ramuri DACA-ALTFEL.

// Maximul elementelor pare
gasit = 0 // nu am gasit inca un element par
PENTRU i = 1 , n EXECUTA
DACA v [ i ] MOD 2 = 0 ATUNCI
DACA gasit = 0 ATUNCI
max_par = v [ i ] // primul par gasit
gasit = 1
ALTFEL
DACA v [ i ] > max_par ATUNCI
max_par = v [ i ]
SFARSIT_DACA
SFARSIT_DACA
SFARSIT_DACA
SFARSIT_PENTRU

Algoritmul este mai complex deoarece nu putem initializa max_par cu v[1] - ce se intampla daca v[1] nu este par? Am initializa cu o valoare care nu indeplineste conditia! De aceea, folosim variabila gasit (fanion): cand gasim primul element par, il retinem ca maxim initial. Pentru urmatoarele elemente pare, aplicam comparatia normala.

v = [5, 8, 3, 12, 7], cautam maximul par

i=1: 5 par? NU

i=2: 8 par? DA, primul par gasit, max_par=8, gasit=1

i=3: 3 par? NU

i=4: 12 par? DA, 12>8? DA, max_par=12

i=5: 7 par? NU

Maximul par = 12

La final, trebuie sa verificam daca gasit este 1. Daca ramane 0, inseamna ca nu exista niciun element par in sir si nu putem afisa un maxim. Aceasta verificare este la fel de importanta ca verificarea contor>0 la media cu conditie - protejeaza algoritmul impotriva situatiilor imposibile.

Acesta este unul dintre cei mai complexi algoritmi pe care i-ai invatat pana acum, deoarece combina trei concepte: parcurgerea, conditia de filtrare si gasirea maximului. Exerseaza-l pe mai multe exemple pentru a-l stapani.

Cum gasim maximul doar dintre elementele pare?
A Initializam maxim cu 0
B Parcurgem si verificam daca v[i] este par inainte de a compara cu maxim
C Nu se poate
10

Rezumat: Tot ce trebuie sa retii

Sa recapitulam toate regulile si tiparele invatate in aceasta lectie. Algoritmii de maxim si minim sunt fundamentali si ii vei folosi in combinatie cu suma, media si parcurgerea in lectia urmatoare (proiectul final).

Algoritmii de baza:

// Maxim
maxim = v [ 1 ]; PENTRU i = 2 , n : DACA v [ i ] > maxim => maxim = v [ i ]

// Minim
minim = v [ 1 ]; PENTRU i = 2 , n : DACA v [ i ] < minim => minim = v [ i ]

// Amplitudine
amplitudine = maxim - minim

Regulile de aur:

  • Maximul si minimul se initializeaza cu v[1] , niciodata cu 0
  • Pozitia (poz_max, poz_min) se initializeaza cu 1
  • Conditia pentru maxim: v[i] > maxim
  • Conditia pentru minim: v[i] < minim
  • Maxim si minim se pot calcula in aceeasi parcurgere
  • La maxim/minim cu conditie, folosim variabila fanion (gasit)

Comparatie intre toti algoritmii cu siruri:

Suma: initializare cu 0, operatie: suma = suma + v[i]

Produs: initializare cu 1, operatie: produs = produs * v[i]

Contor: initializare cu 0, operatie: contor = contor + 1

Maxim: initializare cu v[1], conditie: v[i] > maxim

Minim: initializare cu v[1], conditie: v[i] < minim

Observa tiparul comun: toti algoritmii au o initializare (inainte de bucla), o parcurgere (bucla FOR) si o operatie (in interiorul buclei). Diferenta este doar in valoarea de initializare si in operatia efectuata. Aceasta uniformitate face algoritmii usor de invatat si de combinat.

In lectia urmatoare (proiectul final), vei combina toti acesti algoritmi intr-un singur program care analizeaza complet un sir de numere: citire, afisare, suma, media, maxim, minim, amplitudine si clasificare. Va fi momentul in care tot ce ai invatat in acest modul se leaga intr-un intreg coerent!

Care sunt regulile esentiale pentru maxim si minim?
A Initializam cu 0, conditia nu conteaza
B Initializam cu v[1], maxim: >, minim: <
C Nu exista reguli fixe

Exercitii practice

Exercitiul 1 (Nivel minim) - Analiza completa

Pentru sirul v = [15, 8, 22, 3, 17, 11], determina urmatoarele. Scrie traseul complet al algoritmului (valoarea variabilelor la fiecare pas) pentru a justifica fiecare raspuns.

  1. Care este maximul si pe ce pozitie se afla? (scrie traseul: la fiecare i, comparatia, valoarea maxim si poz_max)
  2. Care este minimul si pe ce pozitie se afla? (scrie traseul complet)
  3. Care este amplitudinea?
  4. Care este cel mai mare numar impar din sir? (scrie traseul cu conditia de paritate)

Raspunde numerotat: 1. ... 2. ... 3. ... 4. ...

Sfat: fa un tabel cu coloanele "i", "v[i]", "comparatie", "maxim/minim", "pozitie" si completeaza-l pas cu pas.

Exercitiul 2 (Nivel standard) - Mini-proiect: Analiza completa a unui sir

Scrie algoritmul care citeste n numere si afiseaza: maximul, minimul, pozitiile lor, amplitudinea, si cate elemente sunt mai apropiate de maxim decat de minim.

Cerinte obligatorii:

⭐ Bonus (pentru nota maxima):

  • Calculeaza si afiseaza media, apoi spune daca maximul este mai mare decat dublul mediei
  • Afiseaza toate pozitiile pe care apare maximul (daca apare de mai multe ori)
  • Gaseste al doilea cel mai mare element din sir (diferit de maxim)

Scrie algoritmul pe caiet, apoi verifica-l facand traseul pentru v = [5, 12, 3, 12, 8, 1].

Exercitiul 3 (Nivel performanta) - Compunere

Cerinta: Scrie un text de 8-10 randuri in care explici de ce este gresit sa initializam maximul cu 0. Da doua exemple concrete de siruri unde aceasta initializare ar da un rezultat gresit si arata care ar fi raspunsul corect in fiecare caz.

Indicii pentru structurarea raspunsului:

  • Explica regula corecta de initializare (cu v[1])
  • Da un exemplu cu sir de numere negative unde maxim=0 e gresit
  • Da un exemplu cu sir de numere pozitive mari unde minim=0 e gresit
  • Explica de ce initializarea cu v[1] functioneaza intotdeauna

Cuvinte cheie de folosit: initializare, v[1], primul element, numere negative, valoare gresita, element real, presupunere

Format: Scrie raspunsul pe caiet in paragrafe coerente (nu liste!). Foloseste exemple concrete cu valori numerice.

Ce ai invatat astazi

  • Ce sunt maximul si minimul?
  • Strategia pentru gasirea maximului
  • Algoritmul pentru maxim
  • Algoritmul pentru minim
  • Gasirea pozitiei maximului si minimului
  • Maxim si minim simultan
  • De ce NU initializam cu 0
  • Aplicatie: Amplitudinea
  • Maxim si minim cu conditie
  • Rezumat: Tot ce trebuie sa retii

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →