Căutarea secvențială și binară. Complexitatea
Cum găsești o valoare într-un tablou și cum judeci cât de eficient e un algoritm. Căutarea binară e cerută la științele naturii, la I și II.2, în patru tipuri de item; complexitatea se punctează la III.3, la ambele specializări.
- 28 min
- La BAC: I (4p) · Subiectul al II-lea, 2 (6p, științele naturii) · Subiectul al III-lea, 3 (10p)
- De revizuit

ții minte doar fișa asta și ești acoperit
Fișa de aur
- 01
Binară: doar pe tablou ordonat. Mijlocul este m=(st+dr)/2, cu împărțire întreagă.
- 02
7 elemente: pozițiile 3, apoi 1 sau 5, apoi 0, 2, 4, 6. Cel mult 3 comparații.
Truc: Mijlocul, apoi mijlocul jumătății.
- 03
x lipsește: și atunci apar comparații. La 7 elemente, sunt exact 3.
- 04
Criterii: durata de executare și spațiul de memorie utilizat.
- 05
Eficient, la barem: algoritm liniar; dacă enunțul cere și memorie, folosire eficientă a memoriei.
- 06
Justificare: o singură parcurgere, deci liniar; câteva variabile, deci memorie puțină.
Pe scurt
Culorile din lecție:termencifră, datăidee-cheie
- Căutarea secvențială trece prin fiecare element. Căutarea binară înjumătățește la fiecare pas, dar cere tablou ordonat.
- La științele naturii, căutarea binară e temă recurentă, la Subiectul I sau la II.2. La matematică-informatică e în programă, dar în lucrările C/C++ importate nu am găsit niciun item despre ea.
- Complexitatea nu se cere ca formulă separată. Se punctează la III.3, la ambele specializări: 1 p la justificare și 1 p la program.
Căutarea secvențială
Vrei să afli dacă x e în tablou. Îl compari cu fiecare element, de la primul la ultimul.
gasit=0;
for(i=0;i<n && gasit==0;i++)
if(a[i]==x) gasit=1;
Merge pe orice tablou. În cel mai rău caz faci n comparații.
Căutarea binară
Dacă tabloul e ordonat, poți face mult mai puțin. Compari cu elementul din mijloc. Dacă x e mai mic, rămâne jumătatea din stânga; dacă e mai mare, cea din dreapta.
st=0; dr=n-1; gasit=0;
while(st<=dr && gasit==0)
{ m=(st+dr)/2;
if(a[m]==x) gasit=1;
else
if(x<a[m]) dr=m-1;
else st=m+1;
}
Oficial, enunțurile spun „se aplică metoda căutării binare” și cer „succesiunea de elemente ale tabloului a căror valoare se compară cu valoarea lui x”.
La examen, tablourile au de obicei 7 elemente, așa că merită să ții minte forma. Pozițiile sunt numerotate de la 0:
Ordinea pozițiilor la 7 elemente
Tabloul poate fi și descrescător. Atunci „jumătatea” se alege invers. Sesiunea specială 2024 folosește (48,24,16,14,9,8,4).
Patru tipuri de item, pe lucrări oficiale
Tipul 1: se dă tabloul și x, se cere succesiunea
Model 2023, SN, II.3. Tabloul (3,7,10,12,20,23,65), x=21.
| st | dr | m | a[m] | Concluzie |
|---|---|---|---|---|
| 0 | 6 | 3 | 12 | 21 e mai mare, la dreapta |
| 4 | 6 | 5 | 23 | 21 e mai mic, la stânga |
| 4 | 4 | 4 | 20 | 21 e mai mare, nu mai e nimic |
Răspuns: 12, 23, 20 (6 p). Barem: numai 2 p dacă doar prima valoare e bună, numai 4 p dacă primele două sunt bune. Valoarea 21 nu e în tablou, iar succesiunea tot există.
La fel la model 2026, I.2 (7,16,20,25,30,45,70), x=26: 25, 45, 30 (varianta c, 4 p), și la simulare 2025, I.2 (2,3,5,20,25,26,45), x=25: 20, 26, 25 (varianta b, 4 p).
Tipul 2: se dă succesiunea, se cere x
Iunie 2026, varianta 3, SN, II.2. Tabloul (5,7,15,19,21,23,25). Succesiunea e 19, 23, 21. Se cere mulțimea tuturor valorilor întregi ale lui x.
- După 19, s-a mers la dreapta:
x>19. - După 23, s-a mers la stânga:
x<23. - Compararea cu 21 se face pentru orice
xcare a ajuns aici, oricare ar fi rezultatul ei.
Deci x poate fi 20, 21, 22. Barem: câte 2 p pentru fiecare.
Tot așa: specială 2026, II.2 (10,16,21,26,32,38,50), succesiunea 26, 16, 21 cere două valori; baremul acceptă orice număr din [17,25], câte 3 p. Simulare 2026, I.2 (5,10,14,16,19,21,26), succesiunea 16, 21, 19: mulțimea {17,18,19,20} (varianta d, 4 p).
Tipul 3: se dă succesiunea, se cere tabloul
Model 2027, SN, I.2. Un tablou cu 7 elemente, x=27, succesiunea 49, 10, 27. Răspunsul e D, (5,10,27,49,50,51,64), 4 p.
Din succesiune: 49 e pe poziția 3, 10 pe poziția 1, 27 pe poziția 2, iar tabloul trebuie să fie ordonat. Varianta C, (10,11,27,49,50,59,64), are 11 pe poziția 1, deci cade. Variantele A și B nu sunt ordonate.
La fel: iulie 2024, I.2, succesiunea 14, 24, 16, răspuns (4,8,9,14,16,24,48), varianta c. August 2026, I.3, succesiunea 49, 21, 23, răspuns (-10,21,23,49,50,70,95), varianta c.
Tipul 4: numărul de comparații
| Lucrare | Se cere | Răspuns |
|---|---|---|
| Model 2025, I.2, 7 elemente | valori comparate cu două elemente | 5, 25 (b) |
| Iunie 2025, I.2, 11 elemente | trei valori, cu cel mult două comparații | 6, 11, 21 (d) |
| August 2025, I.2, 11 elemente | trei valori, cu trei sau patru comparații | 2, 7, 21 (b) |
| Specială 2024, II.2, 7 elemente | două valori, cu trei comparații | oricare dintre 4, 9, 16, 48 sau o valoare care nu e în tablou |
La 11 elemente, prima comparație e la poziția 5, a doua la 2 sau 8.
Pentru (5,7,15,19,21,23,25), ce x dă succesiunea 19, 23, 21?
Care e succesiunea pentru x=26 în (7,16,20,25,30,45,70)?
Complexitatea: două criterii
Programa spune la 6.8: criteriile de eficiență sunt durata de executare și spațiul de memorie utilizat. Pe scurt, cât durează și câtă memorie ocupă.
Nu am găsit niciun item care să ceară ordinul de complexitate ca răspuns. Complexitatea apare la III.3, unde enunțul spune „proiectați un algoritm eficient”. Baremele cer un algoritm liniar. Cuvântul „liniar” apare în toate cele 67 de bareme C/C++ importate, iar 11 scriu explicit „liniar (de complexitate O(n))”, de exemplu august 2024, specială 2024 și rezerva 2026.
n elementenn și m elementen+m-1| Ce faci | Comparații, în cel mai rău caz | Ordin |
|---|---|---|
Căutare secvențială, n elemente | n | liniar |
| Căutare binară: 7, 11, 10⁶ elemente | 3, 4, 20 | logaritmic |
Interclasare, n și m elemente | n+m-1 | liniar |
| Bule, selecție, inserție | bucle imbricate | pătratic |
| O parcurgere a fișierului | o operație pe valoare | liniar |
Numele de logaritmic și pătratic nu vin din bareme. Le găsești aici ca să ai cuvinte pentru diferență. Formularea sigură pentru examen rămâne „liniar”, pe care o și folosește baremul.
Vrei să justificiScrie
| Vrei să justifici | Scrie |
|---|---|
| timpul | „Parcurge datele o singură dată, deci numărul de operații e proporțional cu numărul de valori: algoritmul este liniar.” |
| memoria | „Folosește doar câteva variabile simple și nu memorează șirul.” |
| vector de frecvență | „Memorează câte o valoare pentru fiecare valoare posibilă, iar acestea sunt puține, oricât de lung ar fi fișierul.” |
Care sunt cele două criterii de eficiență din programă?
Oficial: simulare 2026, MI, III.3
În bac.txt sunt x și y, apoi un șir de cel mult 10⁶ numere ordonate crescător. Se afișează câte valori pare distincte din șir sunt în [x,y]. Pentru 6 11 și șirul 1 1 1 2 2 3 5 5 5 5 6 6 7 8 10 10 12 15 15 21 21, se afișează 3, adică 6, 8, 10.
Ideea: fiind ordonate, valorile egale sunt una lângă alta. Deci ajunge să compari valoarea curentă cu cea de dinainte. Nu ții șirul în memorie și nu cauți nimic.
#include <iostream>
#include <fstream>
using namespace std;
int main()
{ ifstream f("bac.txt");
int x,y,crt,ant=0,nr=0;
f>>x>>y;
while(f>>crt)
{ if(crt!=ant && crt%2==0)
if(crt>=x && crt<=y)
nr++;
ant=crt;
}
f.close();
cout<<nr;
return 0;
}
Baremul indică aceeași soluție, cu ant inițializat cu 0 și cu crt, și adaugă că parcurgerea se poate opri la crt>y.
Barem III.3 (10 p)Puncte
| Barem III.3 (10 p) | Puncte |
|---|---|
| a) descriere coerentă (chiar dacă nu e eficient) | 1 |
| a) justificarea eficienței | 1 |
| b) operații cu fișiere | 1 |
| b) valoare determinată (chiar dacă nu e eficient; numai 3 p dacă e principial corect, dar nu merge pe toate seturile de date) | 5 |
| b) algoritm eficient: numai liniar și cu memorie folosită eficient | 1 |
| b) declarări, afișare, corectitudine globală | 1 |
Citesc x și y, apoi parcurg o singură dată șirul din fișier. Păstrez valoarea anterioară, ant, și numărul cerut, nr. Dacă valoarea curentă e pară, diferită de cea anterioară și aparține intervalului, măresc nr. Valorile egale sunt alăturate, pentru că șirul e ordonat, deci așa fiecare valoare e numărată o singură dată.
Algoritmul este eficient din punctul de vedere al timpului de executare, pentru că este liniar: face o singură parcurgere. Este eficient și din punctul de vedere al memoriei, pentru că folosește doar câteva variabile simple, fără să memoreze șirul.
La științele naturii, aceeași simulare cere valorile pare distincte mai mari sau egale cu x. Pentru 5 și același șir, răspunsul e 4: 6, 8, 10, 12.
Ce se cere la BAC
| La | Tip de cerință | Lucrări |
|---|---|---|
| SN, I sau II.2 | căutare binară, cele patru tipuri de mai sus | cele 15 lucrări SN 2024–2027 importate au și interclasare, și căutare binară |
| Ambele, III.3 a | descriere și justificare | toate lucrările importate |
| Ambele, III.3 b | 1 p pentru algoritm eficient | toate lucrările importate |
Greșeli care costă puncte
- Mijlocul rotunjit în sus:
m=(st+dr)/2e împărțire întreagă. La 0 și 3 mijlocul e 1. - Tabloul neordonat ales ca răspuns la grilă.
- Uiți că
xpoate lipsi din tablou când se cere mulțimea tuturor valorilor. - Ai dat și indicii, în loc de valori, când se cere succesiunea de elemente.
st=mîn loc dest=m+1: bucla poate să nu se termine.- Justificare goală la a): spune de ce e liniar și de ce ai folosit puțină memorie, dacă enunțul cere amândouă criteriile.
- Tablou imens la III.3, când o variabilă era de ajuns.
Termeni-cheie
- Căutare secvențială
- Compari valoarea, pe rând, cu fiecare element. Merge pe orice tablou.
- Căutare binară
- Compari cu elementul din mijloc și păstrezi doar jumătatea în care poate fi valoarea. Merge doar pe tablou ordonat.
- Mijloc
- m=(st+dr)/2, împărțire întreagă, unde st și dr sunt capetele porțiunii rămase.
- Criterii de eficiență
- Durata de executare și spațiul de memorie utilizat. Așa le numește programa.
- Algoritm liniar
- Numărul de operații crește proporțional cu numărul de date. Baremul scrie: liniar (de complexitate O(n)).
- Utilizare eficientă a memoriei
- Păstrezi doar ce îți trebuie: câteva variabile sau un vector de frecvență mic, nu tot șirul.
Notițele mele
Salvat localSurse
- Model BAC 2027, SN: I.2, cu barem
- BAC 2026, sesiunea iunie-iulie, varianta 3, SN: II.2, cu barem
- BAC 2026, sesiunea specială, varianta 4, SN: II.2, cu barem
- Simulare BAC 2026, MI și SN: I.2 (SN) și III.3, cu barem
- BAC 2026, sesiunea august, varianta 1, SN: I.3, cu barem
- Model BAC 2025, SN: I.2, cu barem
- Model BAC 2026, SN: I.2, cu barem
- BAC 2025, sesiunea iunie, varianta 1, SN: I.2, cu barem
- BAC 2025, sesiunea august, varianta 4, SN: I.2, cu barem
- Simulare BAC 2025, SN: I.2, cu barem
- BAC 2024, sesiunea specială, varianta 4, SN: II.2, cu barem
- BAC 2024, sesiunea iulie, varianta 3, SN: I.2 și barem III.3
- BAC 2026, rezervă iunie-iulie, varianta 5, MI: barem III.3 (O(n))
- Model BAC 2023, SN: II.3, cu barem