Algoritmi de Căutare – Căutarea Secvențială
1. Obiectivele lecției:
- Să înțeleagă principiul căutării secvențiale.
- Să implementeze algoritmul de căutare secvențială în limbajul C++.
- Să analizeze eficiența algoritmului (complexitatea în timp).
- Să aplice metoda pentru rezolvarea unor probleme practice.
2. Conținutul lecției:
Ce este căutarea secvențială?
- Definiție: Căutarea secvențială este o metodă simplă de căutare, în care se verifică fiecare element al unui vector în ordine, până când se găsește elementul căutat sau se ajunge la finalul vectorului.
- Aplicație: Este utilizată atunci când datele nu sunt sortate sau când se lucrează cu seturi de date mici.
Cum funcționează?
- Se compară elementul căutat cu fiecare element din vector, pornind de la început.
- Dacă se găsește o potrivire, se returnează poziția elementului.
- Dacă nu se găsește elementul până la finalul vectorului, se indică faptul că nu există.
Pseudocod:
Intrare: vector, dimensiune, valoare_cautata
Pentru i de la 0 la dimensiune – 1:
Dacă vector[i] == valoare_cautata:
Returnează i
Returnează -1 (valoarea nu a fost găsită)
3. Cod în C++:
Exemplu de bază:
#include <iostream>
using namespace std;
int cautareSecventiala(int arr[], int n, int valoare_cautata) {
for (int i = 0; i < n; i++) {
if (arr[i] == valoare_cautata) {
return i; // Returnează poziția unde a fost găsită valoarea
}
}
return -1; // Valoarea nu a fost găsită
}
int main() {
int arr[] = {4, 2, 7, 1, 9, 3};
int n = sizeof(arr) / sizeof(arr[0]);
int valoare_cautata;
cout << „Introdu valoarea cautata: „;
cin >> valoare_cautata;
int rezultat = cautareSecventiala(arr, n, valoare_cautata);
if (rezultat != -1) {
cout << „Valoarea ” << valoare_cautata << ” a fost gasita la pozitia ” << rezultat << „.” << endl;
} else {
cout << „Valoarea ” << valoare_cautata << ” nu a fost gasita in vector.” << endl;
}
return 0;
}
Exemplu cu toate aparițiile unei valori:
#include <iostream>
using namespace std;
void cautareSecventialaToate(int arr[], int n, int valoare_cautata, int pozitii[], int& nr_pozitii) {
nr_pozitii = 0; // Inițializăm numărul de poziții găsite la 0
for (int i = 0; i < n; i++) {
if (arr[i] == valoare_cautata) {
pozitii[nr_pozitii] = i; // Stocăm poziția găsită
nr_pozitii++; // Incrementăm numărul de poziții găsite
}
}
}
int main() {
int arr[] = {4, 2, 7, 2, 9, 3, 2};
int n = sizeof(arr) / sizeof(arr[0]);
int valoare_cautata;
cout << „Introdu valoarea cautata: „;
cin >> valoare_cautata;
int pozitii[n]; // Tablou static pentru stocarea pozițiilor
int nr_pozitii; // Variabilă pentru numărul de poziții găsite
cautareSecventialaToate(arr, n, valoare_cautata, pozitii, nr_pozitii);
if (nr_pozitii > 0) {
cout << „Valoarea ” << valoare_cautata << ” a fost gasita la pozitiile: „;
for (int i = 0; i < nr_pozitii; i++) {
cout << pozitii[i] << ” „;
}
cout << endl;
} else {
cout << „Valoarea ” << valoare_cautata << ” nu a fost gasita in vector.” << endl;
}
return 0;
}
4. Complexitatea algoritmului:
- Cazul cel mai favorabil: O(1)
- Elementul căutat se află la prima poziție.
- Cazul cel mai defavorabil: O(n)
- Elementul căutat se află la ultima poziție sau nu există în vector.
- Cazul mediu: O(n)
- Elementul căutat este distribuit aleatoriu.
Avantaje:
- Simplu de implementat.
- Nu necesită vector sortat.
Dezavantaje:
- Ineficient pentru vectori mari.
- Timp de execuție proporțional cu dimensiunea vectorului.
5. Activități practice pentru elevi:
- Realizați un program care determină dacă o valoare introdusă de utilizator există într-un vector de numere reale.
- Modificați algoritmul pentru a afișa numărul total de apariții ale unei valori în vector.
- Implementați un program care verifică dacă un șir de caractere există într-un vector de șiruri.
6. Scheme logice:
- Căutare secvențială:
- Start -> Inițializează index i=0 -> Compară arr[i] cu valoare_cautata -> (DA: Returnează i) / (NU: i++) -> Dacă i≥n: Returnează -1 -> Stop.
7. Concluzie:
- Căutarea secvențială este un algoritm de bază, ușor de implementat, dar cu o eficiență scăzută pentru vectori mari.
- Este utilă atunci când datele nu sunt sortate sau pentru probleme simple.
- Prin implementarea acestui algoritm, elevii vor învăța concepte fundamentale de iterare și comparare.
Algoritmi de Căutare – Căutarea Binara
1. Obiectivele lecției:
- Să înțeleagă principiul căutării binare.
- Să implementeze algoritmul de căutare binară în limbajul C++.
- Să analizeze eficiența algoritmului (complexitatea în timp).
- Să aplice metoda pentru rezolvarea unor probleme practice.
2. Conținutul lecției:
Ce este căutarea binară?
- Definiție: Căutarea binară este un algoritm eficient care presupune împărțirea repetată a unui vector sortat în două jumătăți și eliminarea jumătății în care elementul căutat nu poate exista.
- Condiție: Vectorul trebuie să fie sortat înainte de aplicarea căutării binare.
Cum funcționează?
- Se determină mijlocul vectorului.
- Se compară elementul mijlociu cu elementul căutat:
- Dacă sunt egale, elementul este găsit.
- Dacă elementul căutat este mai mic, căutarea continuă în jumătatea stângă.
- Dacă elementul căutat este mai mare, căutarea continuă în jumătatea dreaptă.
- Se repetă până când elementul este găsit sau până când intervalul devine gol.
Pseudocod:
Intrare: vector sortat, dimensiune, valoare_cautata
Inițializează left = 0, right = dimensiune – 1
Cât timp left <= right:
Calculează mid = (left + right) / 2
Dacă vector[mid] == valoare_cautata:
Returnează mid
Dacă vector[mid] < valoare_cautata:
left = mid + 1
Altfel:
right = mid – 1
Returnează -1 (valoarea nu a fost găsită)
3. Cod în C++:
Exemplu: Căutare binară iterativă
#include <iostream>
using namespace std;
int cautareBinara(int arr[], int n, int valoare_cautata) {
int left = 0, right = n – 1;
while (left <= right) {
int mid = left + (right – left) / 2;
// Verifică dacă valoarea este la mijloc
if (arr[mid] == valoare_cautata) {
return mid;
}
// Dacă valoarea este mai mare, continuă căutarea în dreapta
if (arr[mid] < valoare_cautata) {
left = mid + 1;
} else { // Continuă căutarea în stânga
right = mid – 1;
}
}
return -1; // Valoarea nu a fost găsită
}
int main() {
int arr[] = {2, 3, 4, 10, 40};
int n = sizeof(arr) / sizeof(arr[0]);
int valoare_cautata;
cout << „Introdu valoarea cautata: „;
cin >> valoare_cautata;
int rezultat = cautareBinara(arr, n, valoare_cautata);
if (rezultat != -1) {
cout << „Valoarea ” << valoare_cautata << ” a fost gasita la pozitia ” << rezultat << „.” << endl;
} else {
cout << „Valoarea ” << valoare_cautata << ” nu a fost gasita in vector.” << endl;
}
return 0;
}
Exemplu: Căutare binară recursivă
#include <iostream>
using namespace std;
int cautareBinaraRecursiva(int arr[], int left, int right, int valoare_cautata) {
if (left > right) {
return -1; // Valoarea nu a fost găsită
}
int mid = left + (right – left) / 2;
// Verifică dacă valoarea este la mijloc
if (arr[mid] == valoare_cautata) {
return mid;
}
// Continuă căutarea în jumătatea stângă
if (arr[mid] > valoare_cautata) {
return cautareBinaraRecursiva(arr, left, mid – 1, valoare_cautata);
}
// Continuă căutarea în jumătatea dreaptă
return cautareBinaraRecursiva(arr, mid + 1, right, valoare_cautata);
}
int main() {
int arr[] = {2, 3, 4, 10, 40};
int n = sizeof(arr) / sizeof(arr[0]);
int valoare_cautata;
cout << „Introdu valoarea cautata: „;
cin >> valoare_cautata;
int rezultat = cautareBinaraRecursiva(arr, 0, n – 1, valoare_cautata);
if (rezultat != -1) {
cout << „Valoarea ” << valoare_cautata << ” a fost gasita la pozitia ” << rezultat << „.” << endl;
} else {
cout << „Valoarea ” << valoare_cautata << ” nu a fost gasita in vector.” << endl;
}
return 0;
}
4. Complexitatea algoritmului:
- Timp:
- Cazul cel mai favorabil: O(1)
- Elementul căutat este la mijloc.
- Cazul cel mai defavorabil: O(logn)
- Fiecare iterație reduce numărul de elemente analizate la jumătate.
- Cazul cel mai favorabil: O(1)
- Spațiu:
- Iterativ: O(1)
- Recursiv: O(logn) (datorită stivei recursiei).
Avantaje:
- Eficient pentru vectori mari.
- Complexitate scăzută în comparație cu căutarea secvențială.
Dezavantaje:
- Necesită un vector sortat.
- Mai complicat de implementat decât căutarea secvențială.
5. Activități practice pentru elevi:
- Scrieți un program care implementează căutarea binară pentru un vector sortat descrescător.
- Modificați algoritmul pentru a găsi prima apariție a unei valori în cazul unui vector cu elemente duplicate.
- Implementați o funcție care sortează un vector și apoi efectuează căutarea binară asupra acestuia.
6. Scheme logice:
- Căutare binară (iterativă):
- Start -> Calculează mijlocul mid -> Compară arr[mid] cu valoare_cautata -> (DA: Returnează mid) / (NU: Actualizează left/right) -> Reia -> Stop.
- Căutare binară (recursivă):
- Start -> Calculează mijlocul mid -> Compară arr[mid] cu valoare_cautata -> (DA: Returnează mid) / (NU: Apelează recursiv cu left/right) -> Stop.
7. Concluzie:
- Căutarea binară este un algoritm extrem de eficient pentru vectori mari, dacă aceștia sunt sortați.
- Elevii pot înțelege mai bine divizarea problemei și optimizarea prin reducerea domeniului de căutare.
- Este un instrument fundamental în algoritmică și programare.