You are on page 1of 11

Cap. 1. Problema cutrii n informatic.

Tehnici de cutare
Pentru a nelege problema cutrii, ne putem imagina o bibliotec public. Aceast bibliotec este utilizat de muli clieni care doresc s mprumute anumite cri sau le restituie pe cele vechi. Bibliotecarul este persoana care trebuie s ntrein biblioteca i s satisfac aceste cereri ale clienilor. Crile au anumite atribute: autor, titlu, editur, an de apariie i, bineneles, coninut. Uneori au i o cot, sau numr de inventar. Atunci cnd un client solicit o carte, bibliotecarul nu va face identificarea ei dup coninut. De fapt, clientul solicit cartea pentru a o citi sau pentru a o consulta, deci pentru con inutul ei. n aceste condiii este firesc ca solicitarea s se fac dup un alt criteriu, de exemplu dup numele autorului, sau dup numrul de inventar. n informatic, obiectele care trebuie cutate se numesc nregistrri i, analog crilor, sunt alctuite din mai multe componente, numite cmpuri. Cutarea se face dup un cmp special, numit cheie. Sau, dup o reuniune de cmpuri. Crile sunt depozitate n dulapuri, nregistrrile de grupeaz n tabele sau fiiere. Biblioteca este compus din toate dulapurile sale cu cri, iar o baz de date este alctuit din tabele. ntre dou dulapuri din bibliotec sau ntre dou tabele din baza de date poate exista sau nu o legtur. Acestea fiind spuse, ne punem ntrebarea: cum poate bibliotecarul s-i organizeze ct mai bine munca pentru a deservi ct mai bine cererile clienilor? 1. CUTAREA SECVENIAL S presupunem c n bibliotec exist un numr de dulapuri i fiecare dulap are un numr de rafturi, i pe fiecare raft pot fi depozitate mai multe cri. De fiecare dat cnd i se solicit o carte, bibliotecarul ncepe s o caute pe primul raft al primului dulap, de la stnga la dreapta, apoi, dac nu o gsete, trece la al doilea raft, i aa mai departe. El consider c o carte este gsit atunci cnd identific elementul dup care se face cutarea (de exemplu, titlul crii sau numrul de inventar) Formaliznd, putem presupune c avem un tabel cu un numr n 1, cunoscut, de nregistrri 1, 2, ... , n, i cheile corespunztoare C1, C2, ... , Cn. Nicio alt informaie nu este disponibil despre aceste chei. n aceste condiii, pentru a cuta nregistrarea cu cheia C, nu

avem altceva de fcut dect s comparm pe rnd cheia C cu fiecare din cheile C 1, C2, ... , pn vom identifica o cheie Ci egal cu cheia C. Algoritmul corespunztor n pseudocod este: i0 found false while (not found) do i++ if C = Ci then found true if found then ... //cutarea a avut succes else ... //cutarea nu a avut succes Nu e greu s ne dm seama c acest algoritm nu este deloc eficient. Pentru a-l analiza ar trebui s tim care este probabilitatea ca nregistrarea cu cheia C s existe, altfel spus s avem succes de fiecare dat. Presupunnd c aceast nregistrare exist ntotdeauna, i nregistrrile sunt dispuse aleator, sau c probabilitatea ca o anumit nregistrare cutat s fie constant (i egal cu 1/n), iar timpul necesar efecturii unei singure comparaii este t, atunci timpul necesar efecturii tuturor comparaiilor este, n cazul cel mai favorabil, t, n cazul cel mai nefavorabil, (n+1)t, iar n cazul mediu (n+1)t/2, n alte cuvinte algoritmul are un timp mediu de execuie liniar. Se poate ntmpla ca, dup un timp, observnd c unele cri sunt solicitate mai des, iar altele aproape deloc, bibliotecarul s decid s le schimbe ordinea, astfel nct crile care este solicitat cel mai des mai des s fie prima, din primul raft, din primul dulap, apoi a doua cea mai solicitat carte, pe urmtoarea poziie etc. ntr-o astfel de situaie, timpul de cutare se poate reduce considerabil, dar totul depinde de probabilitatea de solicitare a unei cri. Astfel, notnd cu Pi probabilitatea de solicitare a crii cu numrul i, i = 1, n, i aranjnd crile astfel nct P1 P2 ... Pn, putem avea urmtoarele situaii: a) P1 = 0, P2 = P3 = b) P1 = P2 = ... = Pn = 0. Este un caz uor absurd, presupune c, de fapt, ntotdeauna este solicitat o singur carte, care este gsit dintr-o singur comparaie1. ... = Pn ( = 1/n). Corespunde situaiei n care orice carte este la fel de probabil s fie solicitat, si prin urmare, nu este posibil nicio ameliorare a timpului

Deoarece numrul n de nregistrri este finit, urmeaz cu necesitate utilizarea unui cmp de probabilitate finit pentru definirea probabilitilor respective i definiia clasic a probabilitii (nr. cazurilor favorabile / nr. cazurilor posibile). Altfel spus, probabilitatea 0 de solicitare a unei cri nseamn c acea carte nu va fi solicitat niciodat.

de cutare printr-o astfel de reordonare. ntre aceste dou cazuri extreme exist o mulime de alte posibiliti, ntre care mai remarcabil este:
c) Probabilitile se supun legii lui Zipf, adic Pi este invers proporional cu i. n aceste

condiii, timpul total mediu de efectuare a tuturor comparaiilor se reduce cu un factor care, pentru valori mari ale lui n, tinde spre . Este o mbuntire remarcabil,

dar trebuie remarcat c, pentru valori mari ale lui n,

, ct este timpul

mediu de execuie, n cazul cutrii binare, de care vom vorbi n cele ce urmeaz. De fapt, este foarte uor s ne dm seama c, n cazul cutrilor repetate, pe tabele cu un mare numr de nregistrri, acest algoritm este complet ineficient. S ne imaginm, de exemplu, c biblioteca are 1024 (= 210) de cri i c e egal probabil ca un client s solicite o carte sau alta. Atunci numrul mediu de ncercri va fi de 1025/2 = 512,5. Dac, ns, cheia este titlul, iar bibliotecarul a aranjat crile n ordinea alfabetic a lor, atunci prima oar va cerceta dac titlul solicitat se afl ntre primele 512 sau n urmtoarele, pentru aceasta fiind suficient o singur comparaie cu cartea aflat pe aceast poziie. Astfel, din doar maximum 10 comparaii, bibliotecarul va reui s gseasc titlul respectiv, dac acesta exist. Diferena e colosal, i este cu att mai mare cu ct numrul nregistrrilor este mai mare. 2. CUTAREA BINAR Chiar dac nu l-am denumit aa, algoritmul de mai sus este unul de cutare binar. Pentru a putea fi aplicat, tabela de nregistrri trebuie s fie ordonat. Presupunem, aadar, 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 numr n 1, cunoscut, de nregistrri 1, 2, ... , n, i cheile corespunztoare C1 C2 ... Cn. Algoritmul de cutare binar este:

if C = Ci then ... //cutarea a avut succes else ... //cutarea 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 ... //cutarea a avut succes else ... //cutarea nu a avut succes 3. ARBORI DE DECIZIE ASOCIAI CUTRII BINARE Fiecrei cutri binare precum cea descris mai sus putem s-i asociem un arbore binar de decizie construit, n mod recursiv, construit dup cum urmeaz: dac numrul de noduri n = 1, arborele este format dintr-o singur frunz, [1], altfel nodul rdcin este [n/2] i subarborele stng este arborele binar construit cu [n/2] noduri, iar subarborele drept este arborele binar construit cu n [n/2] noduri i cu indicii nodurilor incrementai cu [n/2]. De exemplu, arborele binar care se obine n cazul unei cutri cu n = 13 noduri este:

11

2 1 2 3 4 5

5 7 6 8

10

12

1 0

1 1

1 2

1 3

4. RAFINAREA TEHNICILOR DE CUTARE Problema cutrii este una crucial n informatic. De fapt, cea mai mare parte a timpului de execuie al programelor este folosit pentru a regsi anumite informaii, adic, de fapt, de a efectua cutri n diferite baze de date. Practic, orice utilizator de internet face acest lucru cu ajutorul unui program specializat numit navigator sau browser de internet. Funcia sa principal este aceea de a regsi anumite informaii i sursele acelor informaii, n conformitate cu anumite criterii. n alte cuvinte, de a efectua cutri ntr-o mulime extrem de vast de servere i fiiere. Fie i numai din acest exemplu, importana identificrii i utilizrii unor tehnici i algoritmi de cutare ct mai performani. Se poate demonstra c algoritmul de cutare binar pe care l-am prezentat mai sus este optim n orice situaie n care nu avem niciun fel de informaii despre structura i particularitile spaiului de cutare. Cu toate acestea, i acest algoritm poate fi mbuntit atunci cnd se cunosc informaii suplimentare. Astfel, revenind la comparaia de mai sus, aceea cu biblioteca, s presupunem c bibliotecarul a implementat un algoritm de cutare binar. La fiecare pas, bibliotecarul identific o submulime n care ar trebui s se afle cartea respectiv i continu cutarea doar n acel subspaiu. Cele dou submulimi pot fi numeric egale sau nu. Dup un timp, observ c unele cri sunt solicitate mai des, iar altele mai rar sau deloc. n fapt, se aplic aa-numitul

principiul al lui Pareto, care, transpus n cazul nostru spune c 20% din cele mai frecvente cutri reprezint 80% din totalul tuturor cutrilor. Astfel, apare ca natural ideea gruprii celor mai frecvent cutate 20% din cri ntr-un subspaiu, i a celorlalte 80% ntr-altul. Transpunerea acestei idei n practic se face cu ajutorul arborilor binari ponderai. O alt problem poate aprea n cazul unor noi intrri i ieiri de cri n bibliotec. S presupunem, de exemplu, c la un moment dat erau nregistrate 10.000 de volume, i prima operaiune a bibliotecarului era s verifice dac indexul ei este mai mic sau mai mare dect valoarea medie 5000. Dac ulterior, au mai fost achiziionate 5.000 de volume, care, normal, au fost inventariate/indexate cu numere mai mari de 10.000, nu este corect ca prima comparaie sa se efectueze cu numrul 5.000. O astfel de decizie ar genera un arbore dezechilibrat. Pentru soluionarea acestei probleme se utilizeaz aa-numiii arbori AVL, sau arbori echilibrai. Abordarea tehnicilor corespunztoare depete cadrul acestei lucrri. De multe ori, din considerente practice, cutm nu o soluie exact, ci o mulime de soluii acceptabile. De exemplu, atunci cnd dorim s achiziionm un obiect, nu facem niciodat selecia sa pe criteriul potrivirii stricte cu bugetul de care dispunem, ci pe baza ncadrrii n acest buget. Un cost mai mic dect cel planificat nu ar trebui, n principiu, s ne deranjeze.

Cap 2. Cutarea binar studiu de caz

Definirea problemei: Se consider un ir numeric cu N elemente. Numrul total de elemente N este dinainte cunoscut, aceasta fiind o condiie necesar de implementare a algoritmului de cutare binar. Se presupune c pot exista mai multe valori egale. Se d, de asemenea, o anumit valoare numeric V, reprezentnd obiectul (numrul) care trebuie cutat n ir. irul este considerat ordonat (cresctor sau descresctor). De obicei, cutarea poate fi strict sau nestrict. n alte cuvinte, putem cuta un element anume / toate elementele care au o anumit valoare Se cere rspunsul la urmtoarele ntrebri: a) Cea mai i cea mai mare poziie pe care se elemente de valoare V, respectiv -1 dac nu exist astfel de elemente (cutarea a euat) b) Cea mai mare poziie pe care se afl un element mai mic sau egal cu valoarea elementului cutat (n cazul irului sortat cresctor), respectiv cea mai mare poziie pe care se afl un element mai mare sau egal cu elementul cutat (n cazul sortrii descresctoare) c) Cea mai mic poziie pe care se afl un element mai mare sau egal cu valoarea elementului cutat (n cazul irului sortat cresctor), respectiv cea mai mic poziie pe care se afl un element mai mic sau egal cu elementul cutat (n cazul sortrii descresctoare) Pentru fiecare situaie, se reine i numrul de comparaii efectuate. n cazurile b i c, valoarea V se presupune a fi ntre valorile minim i maxim ale irului. Date de intrare: Pe prima linie a fiierului de intrare intrare.txt se afl numerele N i V, reprezentnd numrul de elemente ale irului, respectiv valoarea de comparaie V. Pe urmtoarea linie se afl elementele irului. Date de ieire: Se rein n fiierul iesire.txt

Restricii: irul va avea cel puin un element i cel mult 100.000. Elementele irului vor fi numere naturale cuprinse ntre 1 i 1.000.000.000; Observaii: Accentul cade pe implementarea algoritmului i pe studierea eficienei sale. Aceasta nseamn c am ales deliberat s utilizez fiiere de tip text i nu fiiere binare, deoarece acest aspect ar fi deplasat accentul spre operaiunile de lucru cu astfel de fiiere, implicit pe gestionarea pointerilor de fiier. Consider c o asemenea abordare ar fi fost mai dificil i mai susceptibil de bug-uri. Aceasta presupune, de asemenea, c programul nu conine opiuni de creare a fiierului de intrare, de adugare sau eliminare de elemente, de sortare cresctoare sau descresctoare sau altele asemenea. Pur i simplu, programul preia datele dintr-un fiier dinainte creat conform specificaiilor programului. Fiierul de intrare poate fi creat cu un alt program C/C++ sau cu orice editor de texte fr opiuni de formatare grafic (Notepad/Notepad++). Programul reine att numrul de comparaii efectuate, ct i timpul efectiv de lucru. Primul parametru este, n mod evident, dependent, de datele din fiierul de intrare, cel de-al doilea depinde de maina Windows pe care se ruleaz programul.

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

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

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

You might also like