De ce conteaza cautarea?
Cautarea este una dintre cele mai fundamentale operatii in programare. Aproape orice aplicatie are nevoie sa caute ceva:
• Scoala: Exista elevul "Popescu" in catalog? La ce pozitie?
• Magazin: Avem produsul cu codul 12345 in stoc?
• Jocuri: Exista scorul 9999 in top 100?
• Dictionar: Exista cuvantul "algoritm" in dictionar?
Imagineaza-ti ca esti intr-o biblioteca cu 10.000 de carti. Cauti o carte anume.
Metoda 1 (secventiala): Mergi raft cu raft, carte cu carte, pana o gasesti. Daca e ultima carte, verifici toate 10.000!
Metoda 2 (binara): Cartile sunt ordonate alfabetic. Te uiti la mijloc: "M". Cartea ta incepe cu "D", deci e in prima jumatate. Injumatatesti din nou. In maxim 14 pasi gasesti cartea din 10.000!
Cautarea secventiala - verificam pe rand
Cea mai simpla metoda de cautare: parcurgem tabloul element cu element, de la primul la ultimul, si verificam daca elementul curent este cel cautat.
Algoritmul are 3 pasi:
Pasul 1: Presupunem ca elementul nu exista (gasit = false).
Pasul 2: Parcurgem tabloul de la primul la ultimul element.
Pasul 3: Daca gasim elementul, marcam gasit = true si iesim din bucla cu break.
Cautare secventiala in C++
Sa vedem codul complet. Cautam valoarea 4 in tabloul {3, 8, 1, 4, 9, 2, 7}.
break opreste bucla imediat ce gasim elementul. Fara break, programul ar continua sa verifice TOATE elementele ramase - o munca inutila daca am gasit deja ce cautam!
Cautarea binara - DOAR in tablouri sortate!
Daca tabloul este sortat (crescator), putem folosi o metoda mult mai rapida: cautarea binara. In loc sa verificam fiecare element, injumatatim zona de cautare la fiecare pas.
Ideea: Ne uitam la elementul din mijloc:
• Daca e cel cautat → GASIT!
• Daca cel cautat e mai mic → cautam in jumatatea stanga
• Daca cel cautat e mai mare → cautam in jumatatea dreapta
Prietenul tau s-a gandit la un numar intre 1 si 100. La fiecare incercare, iti spune "mai mare" sau "mai mic".
Strategia optima: intrebi mereu mijlocul. "Este 50?" - "Mai mare." - "Este 75?" - "Mai mic." - "Este 62?" In maxim 7 incercari ghicesti din 100 de numere!
De cate ori apare o valoare?
Uneori nu vrem doar sa stim daca exista un element, ci de cate ori apare. De exemplu: de cate ori a luat un elev nota 10?
Diferenta fata de cautarea simpla: nu folosim break, pentru ca trebuie sa verificam TOATE elementele. Folosim un contor pe care il incrementam la fiecare aparitie.
La cautare simpla, break opreste bucla dupa prima gasire. Dar la numarare, trebuie sa verificam toate elementele pentru ca valoarea poate aparea de mai multe ori. Daca am pune break, am numara mereu maximum 1 aparitie!
Gaseste primul element care indeplineste o conditie
Nu cautam mereu o valoare exacta. Uneori vrem sa gasim primul element care satisface o conditie: primul numar par, prima nota peste 8, primul numar negativ, etc.
Structura e similara cu cautarea secventiala, dar in loc de x[i] == cautat, punem conditia noastra.
Poti inlocui conditia x[i] % 2 == 0 cu orice alta conditie:
• Prima nota peste 8: x[i] > 8
• Primul numar negativ: x[i] < 0
• Primul multiplu de 5: x[i] % 5 == 0
• Prima cifra de doua cifre: x[i] >= 10 && x[i] <= 99
Cautare secventiala + numarare + cautare cu conditie
Acum punem totul impreuna intr-un program complet care citeste un tablou, cauta o valoare, numara aparitiile si gaseste primul numar par.