Cap. 1. – Problema căutării în informatică.

Tehnici de căutare
Pentru a înțelege problema căutării, ne putem imagina o bibliotecă publică. Această bibliotecă este utilizată de mulți clienți care doresc să împrumute anumite cărți sau le restituie pe cele vechi. Bibliotecarul este persoana care trebuie să întrețină biblioteca și să satisfacă aceste cereri ale clienților. Cărțile au anumite atribute: autor, titlu, editură, an de apariție și, bineînțeles, conținut. Uneori au și o cotă, sau număr de inventar. Atunci când un client solicită o carte, bibliotecarul nu va face identificarea ei după conținut. De fapt, clientul solicită cartea pentru a o citi sau pentru a o consulta, deci pentru con ținutul ei. În aceste condiții este firesc ca solicitarea să se facă după un alt criteriu, de exemplu după numele autorului, sau după numărul de inventar. În informatică, obiectele care trebuie căutate se numesc înregistrări și, analog cărților, sunt alcătuite din mai multe componente, numite câmpuri. Căutarea se face după un câmp special, numit cheie. Sau, după o reuniune de câmpuri. Cărțile sunt depozitate în dulapuri, înregistrările de grupează în tabele sau fișiere. Biblioteca este compusă din toate dulapurile sale cu cărți, iar o bază de date este alcătuită din tabele. Între două dulapuri din bibliotecă sau între două tabele din baza de date poate exista sau nu o legătură. Acestea fiind spuse, ne punem întrebarea: cum poate bibliotecarul să-și organizeze cât mai bine munca pentru a deservi cât mai bine cererile clienților? 1. CĂUTAREA SECVENȚIALĂ Să presupunem că în bibliotecă există un număr de dulapuri și fiecare dulap are un număr de rafturi, și pe fiecare raft pot fi depozitate mai multe cărți. De fiecare dată când i se solicită o carte, bibliotecarul începe să o caute pe primul raft al primului dulap, de la stânga la dreapta, apoi, dacă nu o găsește, trece la al doilea raft, și așa mai departe. El consideră că o carte este găsită atunci când identifică elementul după care se face căutarea (de exemplu, titlul cărții sau numărul de inventar) Formalizând, putem presupune că avem un tabel cu un număr n ≥ 1, cunoscut, de înregistrări Î1, Î2, ... , În, și cheile corespunzătoare C1, C2, ... , Cn. Nicio altă informație nu este disponibilă despre aceste chei. În aceste condiții, pentru a căuta înregistrarea cu cheia C, nu

iar altele aproape deloc. nu este posibilă nicio ameliorare a timpului 1 Deoarece numărul n de înregistrări este finit. Pentru a-l analiza ar trebui să știm care este probabilitatea ca înregistrarea cu cheia C să existe. = Pn ( = 1/n). n. . iar timpul necesar efectuării unei singure comparații este t. //căutarea a avut succes else .. astfel încât cărțile care este solicitată cel mai des mai des să fie prima. C2. probabilitatea 0 de solicitare a unei cărți înseamnă că acea carte nu va fi solicitată niciodată. și înregistrările sunt dispuse aleator. Astfel. timpul de căutare se poate reduce considerabil. pe următoarea poziție etc. P2 = P3 = b) P1 = P2 = . Este un caz ușor absurd. care este găsită dintr-o singură comparație1. Presupunând că această înregistrare există întotdeauna. până vom identifica o cheie Ci egală cu cheia C. . bibliotecarul să decidă să le schimbe ordinea. dar totul depinde de probabilitatea de solicitare a unei cărți... în alte cuvinte algoritmul are un timp mediu de execuție liniar. întotdeauna este solicitată o singură carte. din primul dulap. ≥ Pn. cazurilor favorabile / nr. în cazul cel mai nefavorabil. si prin urmare. după un timp.. //căutarea nu a avut succes Nu e greu să ne dăm seama că acest algoritm nu este deloc eficient... de fapt. în cazul cel mai favorabil. = Pn = 0. cazurilor posibile). altfel spus să avem succes de fiecare dată.. sau că probabilitatea ca o anumită înregistrare căutată să fie constantă (și egală cu 1/n). din primul raft. .. presupune că. observând că unele cărți sunt solicitate mai des. Algoritmul corespunzător în pseudocod este: i←0 found ← false while (not found) do i++ if C = Ci then found ← true if found then . Altfel spus. Se poate întâmpla ca. și aranjând cărțile astfel încât P1 ≥ P2 ≥ . t. iar în cazul mediu (n+1)t/2.avem altceva de făcut decât să comparăm pe rând cheia C cu fiecare din cheile C 1. apoi a doua cea mai solicitată carte. urmează cu necesitate utilizarea unui câmp de probabilitate finit pentru definirea probabilităților respective și definiția clasică a probabilității (nr. i = 1. Corespunde situației în care orice carte este la fel de probabil să fie solicitată. (n+1)t.... .. Într-o astfel de situație. putem avea următoarele situații: a) P1 = 0. atunci timpul necesar efectuării tuturor comparațiilor este. notând cu Pi probabilitatea de solicitare a cărții cu numărul i.

acest algoritm este complet ineficient. tinde spre . însă. între care mai remarcabilă este: c) Probabilitățile se supun legii lui Zipf. Între aceste două cazuri extreme există o mulțime de alte posibilități. din doar maximum 10 comparații. Este o îmbunătățire remarcabilă.. pentru valori mari ale lui n. că avem un tabel first ← 1 last ← n while (first ≠ last) do i ← [(first + last)/2] //partea întreagă if C > Ci then first ← i+1 else last ← i cu un număr n ≥ 1. iar bibliotecarul a aranjat cărțile în ordinea alfabetică a lor. 2. În aceste condiții. dacă acesta există. CĂUTAREA BINARĂ Chiar dacă nu l-am denumit așa. timpul total mediu de efectuare a tuturor comparațiilor se reduce cu un factor care. cunoscut. Pentru a putea fi aplicat.. și cheile corespunzătoare C1 ≤ C2 ≤ . este foarte ușor să ne dăm seama că.5. așadar. de înregistrări Î 1. . Atunci numărul mediu de încercări va fi de 1025/2 = 512.de căutare printr-o astfel de reordonare. cât este timpul mediu de execuție.. Presupunem. De fapt. . algoritmul de mai sus este unul de căutare binară. cheia este titlul. că biblioteca are 1024 (= 210) de cărți și că e egal probabil ca un client să solicite o carte sau alta. și este cu atât mai mare cu cât numărul înregistrărilor este mai mare. bibliotecarul va reuși să găsească titlul respectiv. dar trebuie remarcat că. adică Pi este invers proporțional cu i. În. de care vom vorbi în cele ce urmează. . de exemplu. ≤ Cn. în cazul căutărilor repetate. pentru valori mari ale lui n. Algoritmul de căutare binară este: . tabela de înregistrări trebuie să fie ordonată. Diferența e colosală.. Dacă. Astfel. Să ne imaginăm. atunci prima oară va cerceta dacă titlul solicitat se află între primele 512 sau în următoarele. în cazul căutării binare. Î2. pe tabele cu un mare număr de înregistrări. pentru aceasta fiind suficientă o singură comparație cu cartea aflată pe această poziție.

iar subarborele drept este arborele binar construit cu n – [n/2] noduri și cu indicii nodurilor incrementați cu [n/2]... //căutarea a avut succes else . //căutarea a avut succes else ... construit după cum urmează: dacă numărul de noduri n = 1.. [1]. altfel nodul rădăcină este [n/2] și subarborele stâng este arborele binar construit cu [n/2] noduri. //căutarea nu a avut succes 3.if C = Ci then . De exemplu. arborele este format dintr-o singură frunză... în mod recursiv.. ARBORI DE DECIZIE ASOCIAȚI CĂUTĂRII BINARE Fiecărei căutări binare precum cea descrisă mai sus putem să-i asociem un arbore binar de decizie construit. //căutarea nu a avut succes O altă variantă ar putea fi: first ← 1 last ← n found ← false while ((not found) and (first ≠ last)) do i ← [(first + last)/2] //partea întreagă if C > Ci then first ← i+1 else if C < Ci then last ← i – 1 else found ← true if found then . arborele binar care se obține în cazul unei căutări cu n = 13 noduri este: .

RAFINAREA TEHNICILOR DE CĂUTARE Problema căutării este una crucială în informatică. de a efectua căutări într-o mulțime extrem de vastă de servere și fișiere. bibliotecarul identifică o submulțime în care ar trebui să se afle cartea respectivă și continuă căutarea doar în acel subspațiu. de a efectua căutări în diferite baze de date.6 3 9 1 4 7 11 2 1 2 3 4 5 5 7 6 8 8 10 12 9 1 0 1 1 1 2 1 3 4. adică. Funcția sa principală este aceea de a regăsi anumite informații și sursele acelor informații. Practic. iar altele mai rar sau deloc. se aplică așa-numitul . Cu toate acestea. revenind la comparația de mai sus. de fapt. În fapt. În alte cuvinte. să presupunem că bibliotecarul a implementat un algoritm de căutare binară. Se poate demonstra că algoritmul de căutare binară pe care l-am prezentat mai sus este optim în orice situație în care nu avem niciun fel de informații despre structura și particularitățile spațiului de căutare. importanța identificării și utilizării unor tehnici și algoritmi de căutare cât mai performanți. La fiecare pas. orice utilizator de internet face acest lucru cu ajutorul unui program specializat numit navigator sau browser de internet. De fapt. După un timp. observă că unele cărți sunt solicitate mai des. Fie și numai din acest exemplu. Cele două submulțimi pot fi numeric egale sau nu. și acest algoritm poate fi îmbunătățit atunci când se cunosc informații suplimentare. în conformitate cu anumite criterii. aceea cu biblioteca. cea mai mare parte a timpului de execuție al programelor este folosit pentru a regăsi anumite informații. Astfel.

nu este corect ca prima comparație sa se efectueze cu numărul 5. Pentru soluționarea acestei probleme se utilizează așa-numiții arbori AVL. O altă problemă poate apărea în cazul unor noi intrări și ieșiri de cărți în bibliotecă. normal.000 de volume. atunci când dorim să achiziționăm un obiect. care. Un cost mai mic decât cel planificat nu ar trebui. au mai fost achiziționate 5. în principiu. căutăm nu o soluție exactă.000. transpus în cazul nostru spune că 20% din cele mai frecvente căutări reprezintă 80% din totalul tuturor căutărilor. că la un moment dat erau înregistrate 10. Să presupunem. care. . apare ca naturală ideea grupării celor mai frecvent căutate 20% din cărți într-un subspațiu. să ne deranjeze. au fost inventariate/indexate cu numere mai mari de 10. ci pe baza încadrării în acest buget. și prima operațiune a bibliotecarului era să verifice dacă indexul ei este mai mic sau mai mare decât valoarea medie 5000. O astfel de decizie ar genera un arbore dezechilibrat. nu facem niciodată selecția sa pe criteriul potrivirii stricte cu bugetul de care dispunem. Dacă ulterior. De multe ori. De exemplu.000. și a celorlalte 80% într-altul. ci o mulțime de soluții acceptabile. sau arbori echilibrați. de exemplu. Abordarea tehnicilor corespunzătoare depășește cadrul acestei lucrări. din considerente practice.000 de volume. Astfel. Transpunerea acestei idei în practică se face cu ajutorul arborilor binari ponderați.principiul al lui Pareto.

txt . Date de intrare: Pe prima linie a fișierului de intrare intrare. respectiv cea mai mică poziție pe care se află un element mai mic sau egal cu elementul căutat (în cazul sortării descrescătoare) Pentru fiecare situație. putem căuta un element anume / toate elementele care au o anumită valoare Se cere răspunsul la următoarele întrebări: a) Cea mai și cea mai mare poziție pe care se elemente de valoare V. Căutarea binară – studiu de caz Definirea problemei: Se consideră un șir numeric cu N elemente. reprezentând obiectul (numărul) care trebuie căutat în șir.Cap 2. Șirul este considerat ordonat (crescător sau descrescător).txt se află numerele N și V. se reține și numărul de comparații efectuate. În alte cuvinte. respectiv cea mai mare poziție pe care se află un element mai mare sau egal cu elementul căutat (în cazul sortării descrescătoare) c) Cea mai mică poziție pe care se află un element mai mare sau egal cu valoarea elementului căutat (în cazul șirului sortat crescător). Date de ieșire: Se rețin în fișierul iesire. de asemenea. valoarea V se presupune a fi între valorile minimă și maximă ale șirului. aceasta fiind o condiție necesară de implementare a algoritmului de căutare binară. În cazurile b și c. Se dă. respectiv valoarea de comparație V. Numărul total de elemente N este dinainte cunoscut. Se presupune că pot exista mai multe valori egale. Pe următoarea linie se află elementele șirului. „căutarea” poate fi strictă sau nestrictă. reprezentând numărul de elemente ale șirului. o anumită valoare numerică V. respectiv -1 dacă nu există astfel de elemente (căutarea a eșuat) b) Cea mai mare poziție pe care se află un element mai mic sau egal cu valoarea elementului căutat (în cazul șirului sortat crescător). De obicei.

Observații: Accentul cade pe implementarea algoritmului și pe studierea eficienței sale. dependent. Fișierul de intrare poate fi creat cu un alt program C/C++ sau cu orice editor de texte fără opțiuni de formatare grafică (Notepad/Notepad++). de sortare crescătoare sau descrescătoare sau altele asemenea. Aceasta presupune. de asemenea. că programul nu conține opțiuni de creare a fișierului de intrare. Primul parametru este. Aceasta înseamnă că am ales deliberat să utilizez fișiere de tip text și nu fișiere binare. Programul reține atât numărul de comparații efectuate. cât și timpul efectiv de lucru. de datele din fișierul de intrare.000. implicit pe gestionarea pointerilor de fișier.000. cel de-al doilea depinde de mașina Windows pe care se rulează programul. în mod evident. Elementele șirului vor fi numere naturale cuprinse între 1 și 1. programul preia datele dintr-un fișier dinainte creat conform specificațiilor programului.Restricții: Șirul va avea cel puțin un element și cel mult 100. . de adăugare sau eliminare de elemente. Pur și simplu.000. deoarece acest aspect ar fi deplasat accentul spre operațiunile de lucru cu astfel de fișiere. Consider că o asemenea abordare ar fi fost mai dificilă și mai susceptibilă de bug-uri.000.

G. nicio lucrare care să trateze acest subiect la nivel elementar și care să evite acest subiect. În fapt. [Aho. Hopcroft. Scragg .Charles River Media. nu influențează decât stilul de programare. Ronald R. Pap. 2003 [Das. aproape întotdeauna. O. Beijing.Addison Wesley. MIT. Mai mult. un anumit limbaj. Vaz]: S. este prima. Kakde – C & Data Structures – Cherles River Media. 3rd Edition – Jones & Barlett Publishers. Tratatul clasic de programare al lui Donald Knuth e. Lei. Scr]: Douglas Baldwin. C. Ullman – Data Structures and Algorithms . Deshpande. Există multe cărți bune de algoritmi și structuri de date. Leiserson. cum limbajele și paradigmele au evoluat continuu. 2007 [Des. doar pe acelea care au tratat subiectul din perspectivă C/C++. aparținând unei anumite paradigme. Însă. prezentarea tehnicilor de căutare urmează. algoritmii rămânând.McGrawHill Higher Education.Bibliografie Problema căutării este una extrem de clasică în teoria algoritmilor. nu există practic. Jeffrey D. 2002 [Bal. Hop. Greg W. 2004 . John E. Cormen. Dintree aceste lucrări am menționat. după Introduction to Algorithms. 1990) [Dal]: Nell Dale – C++ Plus Data Structure. aceeași.Algorithms and Data Structures: The Science of Computing . era normal ca anumite lucrări să prezinte diverși algoritmi din perspectiva unui anumit mediu de programare sau a unei anumite paradigme. Dar. Alsuwaiyel – Algorithms Design Tehniques and Analysis – PHEI. Dasgupta. Ull]: Alfred V. 2004 [Cor.H. conceptual. Charles E. însă.S. cu focus pe anumite limbaje: Java. Aho. Rivest – Introducere în algoritmi – Computer Libris Agora. 1983 [Als]: M. Vazirani – Algorithms . doar prima dintr-o serie practic nesfârșită de lucrări care tratează acest subiect și. Python etc. prima sa apariție fiind consemnată într-o perioadă în care nici limbajul C/C++ și nici conceptul de programare pe obiecte nu erau cunoscute. cu mici variații. expunerea corespunzătoare din [Knu]. Papadimitriou. din punct de vedere cronologic. Kak]: P. U. H. V. Riv]: Thomas H. evident. 2000 (trad.

Ken Davidson – Data Structures Demystified – McGrawHill/Osborne. 3rd Edition . 1991 [Goo. Tam. Roberto Tamassia.Foundations of Algorithms Using C++ Pseudocode. Goodrich.PWS-Kent Publishing Company. Ryb]: Robert L. Leonard J.Prentice Hall. 2006 [Knu]: Donald E. Preiss – Data Structures and Algorithms with Object-Oriented Design Patterns in C++ . Garrett – Data Structures. Second Edition – Prentice Hall. 1999 [Meh]: Kurt Mehlhorn – Data Structures and Algorithms 3: Multi-dimensional Searching and Computational Geometry – Springer-Verlag. William Gasarch – Problems on Algorithms. Heineman. vol. 2004 [Kle. Gar]: James F.Computer Science Press .H. Gonnet. Tar]: Jon Kleinberg. Sartaj Sahni – Fundamentals of Data Structures .Jones and Bartlett Publishers. Stanley Selkow .[Dro]: Adam Drozdek – Data Structures and Algorithms in C++.Sorting and Searchind Algorithms: A Cookbook – ePaper Press [Par]: Alan Parker . 2004 [Nie1]: Thomas Niemann – A Compact Guide To Sorting And Searching – ePaper Press [Nie2]: Thomas Niemann . Kruse. 1993 [Par.Bruno R. Preiss. Sah]: Ellis Horowitz. Knuth – The Art of Computer Programming. 1984 [Nea. Yat]: G. David Mount – Data Structures & Algorithms in C++.CRC Press. Èva Tardos – Algorithm Design – Pearson Education. Korsch. 2000 [Laf]: Robert Lafore – SAMS Teach Yourself Data Structures and Algorithms in 24 Hours – SAMS Publishing. Kumarss Naimipour . Pol. 2001 [Edm]: Jeff Edmonds – How to Think about Algorithms – Cambridge University Press. Gas]: Ian Parberry. Ryba – Data Structures and Program Design in C++ . 2009 [Hor. Second Edition – John Wiley & Sons. Baeza-Yates – Handbook of Algorithms and Data Structures in Pascal and C – Addison-Wesley. Algorithms and Program Style Using C . Cum]: Richard Neapolitan. 2008 [Gon. Sel]: George T. Alexander J. 1973 [Kor. 1983 [Keo. 1997 . 3 – Sorting and Searching – Addison Wesley. 1988 [Kru. Mou]: Michael T.Algorithms in a Nutshell – A Desktop Quick Reference – O’Reilly Media. Gary Pollice. 2002 [Pre]: Bruno R. 2011 [Hei. R. Dav]: Jim Keogh.Algorithms and Data Structures in C++ . Second Edition – Brooks/Cole Thomson Learning.

Sorting. Second Edition – Pearson Education. 1976 .Data Structures and Problem Solving Using C++. Data Structure. 3rd Edition – Addison Wesley. 1990 [Sed3]: Robert Sedgewick – Algorithms in C++.[Sed1]: Robert Sedgewick – Algorithms – Addison Wesley. 1998 [Sed. 4th Edition – Pearson Education 2011 [Wei]: Mark Allen Weiss . Parts 1-4: Fundamentals. Way]: Robert Sedgewick. Kevin Wayne – Algorithms. 2003 [Wir]: Niklaus Wirth – Algorithms + Data Structures = Programs – Prentice Hall. Searching. 1983 [Sed2]: Robert Sedgewick – Algorithms in C – Addison Wesley.

Sign up to vote on this title
UsefulNot useful