Busc e etores Prof. Dr. José Augusto Brnusks DFM-FFCP-USP Est ul ntroduz busc e vetores que está entre s trefs s freqüenteente encontrds e progrção de coputdores Serão borddos dos tpos de busc: lner (ou seqüencl) e bnár 1 Busc A hpótese básc ssud no processo de busc é que o conjunto de ddos, dentre o qul u deterndo eleento deve ser procurdo, possu tnho fxo, ou sej, u vetor: te [N]; onde te represent u estrutur de ddos contendo u cpo que tu coo chve pr pesqus e N é u constnte ndcndo o núero de eleentos typedef struct { nt key; // chve de busc... // des cpos d estrutur te; Objetvo d busc: ddo x encontrr [].key == x O índce resultnte perte cesso os des cpos 2 Busc Pr estudo, vos dtr que o tpo te sej coposto pens do cpo chve, ou sej, o ddo é própr chve. Alé dsso, pr fcltr o estudo nd s, chve de busc será u ntero, ou sej, o vetor será declrdo coo: Exeplo Busc de x = 19, retorn = 5 Busc de x = 45, retorn = 0 Busc de x = 8, retorn = 6 E busc de x =? nt [N]; ebrndo que N é u constnte que ndc o núero de eleentos do vetor Ass, objetvo d busc se resue ddo x encontrr [] == x 3 4 Exeplo Busc de x = 19, retorn = 5 Busc de x = 45, retorn = 0 Busc de x = 8, retorn = 6 E busc de x =? Depende d pleentção! Pode retornr = -1 (ou outro vlor) ndctvo que busc não teve êxto 5 Busc ner (ou Seqüencl) Utlzd qundo não há de nforções dcons sobre os ddos sere pesqusdos A busc lner tern qundo for stsfet u ds dus condções seguntes: 1. O eleento é encontrdo, sto é, [] == x 2. Todo o vetor fo nlsdo, s o eleento x não fo encontrdo Algorto: whle ( < N && []!= x) Ao térno do lço: Se == N então x não fo encontrdo senão [] == x, é posção onde x fo encontrdo 6 1
Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) N 8 0 N 8 0 7 8 Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) N 8 1 N 8 1 9 10 Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) N 8 2 N 8 2 11 12 2
Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) N 8 3 N 8 3 13 14 Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) N 8 4 N 8 4 15 16 Busc ner (ou Seqüencl) Busc de x = 19 whle ( < N && []!= x) Busc ner (ou Seqüencl) Busc de x = 19 F whle ( < N && []!= x) N 8 5 N 8 5 17 18 3
Busc ner (ou Seqüencl) Exeplo e C++ Busc de x = 19 #nclude <ostre> usng nespce std; nt busc_sequencl(nt x, nt N, nt []) { nt whle ( < N && []!= x) N 8 5 Térno do lço: Se!= N então x fo encontrdo n posção do vetor 19 whle ( < N && []!= x) return ( == N)? -1 : ; nt n(vod) { const nt = 8; nt v[] = {45,56,12,43,95,19,8,67; Busc de 19 = 5 Busc de 45 = 0 Busc de 8 = 6 Busc de = -1 cout << "Busc de 19 = " << busc_sequencl(19,,v) << endl; cout << "Busc de 45 = " << busc_sequencl(45,,v) << endl; cout << "Busc de 8 = " << busc_sequencl(8,,v) << endl; cout << "Busc de = " << busc_sequencl(,,v) << endl; return 0; 20 Análse d Busc ner Busc ner co Sentnel E éd são efetuds N/2 coprções de chves pr encontrr u eleento prtculr x no vetor de N eleentos O por cso requerer N coprções de chves Isso pode consur uto tepo qundo o núero de eleentos do vetor é grnde O uso d sentnel te coo objetvo celerr busc, trvés d splfcção d expressão boolen A dé básc é fzer co que o eleento x sepre sej encontrdo Pr sso, ntroduz-se u eleento dconl no fnl do vetor 21 22 Busc ner co Sentnel Algorto: te [N+1]; [N] = x; // sentnel whle ([]!= x) Ao fnl do lço, == N plc que x não fo encontrdo (exceto o correspondente à sentnel). Busc de x = 56 [N] = x; whle ([]!= x) N 8 0 8 23 24 4
Busc de x = 56 [N] = x; whle ([]!= x) Busc de x = 56 [N] = x; whle ([]!= x) 8 8 N 8 0 56 N 8 0 56 Sentnel 25 26 Busc de x = 56 [N] = x; whle ([]!= x) Busc de x = 56 [N] = x; F whle ([]!= x) 8 8 N 8 1 56 N 8 1 56 27 28 Busc de x = 56 [N] = x; Busc de x = [N] = x; whle ([]!= x) whle ([]!= x) 8 8 N 8 1 56 N 8 0 Térno do lço: Se!= N então x fo encontrdo n posção do vetor 29 30 5
Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 0 N 8 0 Sentnel 31 32 Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 1 N 8 1 33 34 Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 2 N 8 2 35 36 6
Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 3 N 8 3 37 38 Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 4 N 8 4 39 40 Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 5 N 8 5 41 42 7
Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 6 N 8 6 43 44 Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; whle ([]!= x) 8 8 N 8 7 N 8 7 45 46 Busc de x = [N] = x; whle ([]!= x) Busc de x = [N] = x; F whle ([]!= x) 8 8 N 8 8 N 8 8 47 48 8
Busc de x = [N] = x; whle ([]!= x) N 8 8 8 Térno do lço: Se!= N então x fo encontrdo n posção do vetor. Coo == N, então x não fo encontrdo (exceto sentnel) 49 Exeplo e C++ #nclude <ostre> usng nespce std; nt busc_sentnel(nt x, nt N, nt []) { nt [N] = x; // sentnel whle ([]!= x) return ( == N)? -1 : ; nt n(vod) { const nt = 8; nt v[+1] ={45,56,12,43,95,19,8,67; Busc de 19 = 5 Busc de 45 = 0 Busc de 8 = 6 Busc de = -1 cout << "Busc de 19 = " << busc_sentnel(19,,v) << endl; cout << "Busc de 45 = " << busc_sentnel(45,,v) << endl; cout << "Busc de 8 = " << busc_sentnel(8,,v) << endl; cout << "Busc de = " << busc_sentnel(,,v) << endl; return 0; 50 Análse d Busc co Sentnel Busc Bnár E éd são efetuds (N+1)/2 coprções pr encontrr u eleento prtculr x no vetor de N eleentos O por cso requerer N+1 coprções Não é possível celerr busc se que se dsponh de ores nforções cerc do eleento ser loclzdo Sbe-se que u busc pode ser s efcente se os ddos estvere ordendos, ou sej: [0] <= [1] <= <= [N-1] A dé prncpl é de teste u eleento sortedo letorente, por exeplo, [], coprndo-o co o eleento de busc x. Se tl eleento for gul x, busc tern. Se for enor que x, conclu-se que todos os eleentos co índces enores ou gus pode ser elndos dos próxos testes. Se for or que x, todos queles eleentos co índces ores ou gus pode ser tbé elndos d busc. 51 52 Busc Bnár Busc de x = 19 Suponh = 3 N = 8 8 12 19 43 45 56 67 95 Coo [] > x, Eleentos co índces ores que pode ser elndos d busc 53 Busc Bnár Algorto: chou = flse; whle ( <= &&! chou) { = qulquer vlor entre e ; f ([] == x) chou = true; f ([] < x) = - 1; 8 12 19 43 45 56 67 95 N = 8 54 9
Busc Bnár Ebor escolh de sej prenteente rbtrár (no sentdo que o lgorto funcon ndependenteente dele) o vlor dest vrável nfluenc n efcênc do lgorto É clro que, cd psso, deve-se elnr o or núero possível de eleentos e futurs buscs A solução ót é escolher edn dos eleentos, porque el eln, e qulquer cso, etde dos eleentos do vetor 55 Busc Bnár A efcênc pode ser lgerente elhord trvés d perutção entre s dus cláusuls de coprção. A condção de guldde deve ser testd e segundo lugr, porque o sucesso ocorre pens u vez e todo o processo Poré, questão s relevnte se refere o fto de, coo n busc lner, se poder ou não encontrr u solução que proporcone u condção s sples pr fnlzção do processo É possível obter tl lgorto rápdo se for bndond et de ternr busc no nstnte exto e que for encontrdo o eleento pesqusdo Isso prece pouco ntelgente à prer vst, s observndo-se s fundo, pode-se perceber fclente que o gnho e efcênc e cd psso será or do que perd ocsond pel coprção de lguns poucos eleentos dcons 56 Busc Bnár ápd Algorto: whle ( < ) f ([] < x) Se o térno do lgorto condção [] == x for verdder, então x fo encontrdo n posção de ; cso contráro x não fo encontrdo. 57 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 58 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 59 60 10
Busc de x = 19 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 61 62 Busc de x = 19 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 63 64 Busc de x = 19 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 65 66 11
Busc de x = 19 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 67 68 Busc de x = 19 Busc de x = 19 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 69 whle ( < ) f ([] < x) N = 8 8 12 19 43 45 56 67 95 Térno do lço: Coo [] == x, x fo encontrdo n posção de 70 Exeplo e C++ Análse d Busc Bnár ápd #nclude <ostre> usng nespce std; nt busc_bnr_rpd(nt x, nt N, nt []) { nt,,; whle ( < ) f ([] < x) return (x == [])? : -1; nt n(vod) { const nt = 8; nt v[+1] ={8,12,19,43,45,56,67,95; Busc de 19 = 5 Busc de 45 = 0 Busc de 8 = 6 Busc de = -1 cout << "Busc de 19 = " << busc_bnr_rpd(19,,v) << endl; cout << "Busc de 45 = " << busc_bnr_rpd(45,,v) << endl; cout << "Busc de 8 = " << busc_bnr_rpd(8,,v) << endl; cout << "Busc de = " << busc_bnr_rpd(,,v) << endl; return 0; 71 E éd são efetuds + log 2 (N)-1 + coprções de chves pr encontrr u eleento prtculr x no vetor de N eleentos O por cso requerer + log 2 N + coprções N 8 128 1.024 32.768 1.048.576 1.073.741.824 Nº Coprções (por cso) 10 15 20 30 1.099.511.627.776 40 10 80 266 3 7 72 12
Coprção Consderndo os lgortos de busc vstos, tbel segunte ostr orde de grndez dos núeros íno (C ín ), édo (C éd ) e áxo (C áx ) de coprções de chves. Coprção Núero de coprções Busc ner Algorto C ín C éd C áx Busc ner O(1) O(N) O(N) Busc ner co Sentnel O(1) O(N) O(N) Busc Bnár O(1) O(log 2 N) O(log 2 N) Busc Bnár ápd O(log 2 N) O(log 2 N) O(log 2 N) Busc Bnár 73 Núero de eleentos (N) 74 esuo Ds nálses dos lgortos de busc, está clro que o étodo de busc bnár te u desepenho tão bo ou elhor do que o étodo de busc lner Entretnto, tulzção dos índces esquerdo, dreto e édo (, e no lgorto, respectvente) requer tepo dconl Ass, pr vetores co poucos eleentos, busc lner é dequd Pr vetores co utos eleentos, busc bnár é s efcente, s sso requer que o vetor estej ordendo 75 13