Vous êtes sur la page 1sur 21

MC-102 Aula 16 Busca binria e sequencial a

Instituto de Computao Unicamp ca

Segundo Semestre de 2011

Aula passada Busca

Roteiro

Aula passada

Busca

MC-102 Aula 16

Aula passada Busca

Vetores Denio ca

Coleo de variveis do mesmo tipo referenciada por um nome ca a comum. (Herbert Schildt) acesso por meio de ndice posies cont co guas na memria o tamanho pr-denido e ndices fora dos limites podem causar comportamento anmalo do cdigo o o

MC-102 Aula 16

Aula passada Busca

Busca - Denio do problema ca

Problemas Dada uma coleo de n elementos, pretende-se saber se um ca determinado elemento (valor) est presente nessa coleo. a ca Determinar a posio desse elemento (valor) em um conjunto ca de elementos.

MC-102 Aula 16

Aula passada Busca

Busca - Denio do problema ca

v= (3, 5, 7, 11, 21, 35, 42, 59, 72) Problemas Como encontrar o valor 82 Como determinar a posio do valor 21 ca

MC-102 Aula 16

Aula passada Busca

Busca - Tipos

Busca sequencial ou linear Busca binria a

MC-102 Aula 16

Aula passada Busca

Busca Sequencial

Sequencial Percorrer o vetor desde a primeira posio at a ultima. Para ca e cada posio i, comparamos vetor[i] com valor. ca
Se forem iguais dizemos que valor existe. Se chegarmos ao m do vetor sem sucesso dizemos que valor no existe. a

MC-102 Aula 16

Aula passada Busca

Busca Sequencial
1 Inicializao ca i = 0; encontrado = 0; //falso 2 Busca while (i < TAMANHO && !encontrado) { if (vetor[i] == valor) { encontrado = 1; /*Verdadeiro*/ } else { i++; } }

MC-102 Aula 16

Aula passada Busca

Busca Sequencial

3 Tratamento do Resultado if (encontrado) { printf ("Valor %d est na posicao %d\n", a vetor[i], i); } else { printf ("Valor %d n~o encontrado\n", valor); a } Veja o programa completo em sequencial.c.

MC-102 Aula 16

Aula passada Busca

Busca Sequencial - Ecincia e

Quanto tempo a busca sequencial demora para executar? Em outras palavras, quantas vezes a comparao vetor[i] == valor ca e executada? Caso valor no esteja presente no vetor, n vezes. a Caso valor esteja presente no vetor:
1 vez no melhor caso (valor est na primeira posio). a a n vezes no pior caso (valor est na ultima posio). a ca n/2 vezes no caso mdio. e

Veja exemplos em seq-random.c e seq-random2.c.

MC-102 Aula 16

Aula passada Busca

Busca Sequencial

Implemente uma verso recursiva para este algoritmo. a Qual o caso base? E o recursivo? e Veja o exemplo em sequencial-rec.c.

MC-102 Aula 16

Aula passada Busca

Busca Binria a

Agora vamos supor que o vetor est ordenado (crescente). a Sera que poss resolver o problema de modo mais e vel eciente? Ser que podemos fazer algo melhor do que vericar cada a posio do vetor? ca Que tal vericarmos se a posio do meio do vetor contem x. ca O que podemos concluir?

MC-102 Aula 16

Aula passada Busca

Busca Binria a
Se x for menor do que o elemento do meio, ento x deve estar a na metade inferior do vetor. Se x for maior do que o elemento do meio, ento x deve estar a na metade superior do vetor. Em outras palavras
Caso a lista esteja ordenada, sabemos que, para qualquer i e j, i < j, se, e somente se, A[i] <= A[j]. Portanto, comparando um determinado elemento com o elemento procurado, saberemos:
Se o elemento procurado o elemento comparado; e Se ele est antes do elemento comparado ou depois; a

MC-102 Aula 16

Aula passada Busca

Busca Binria a

Soluo: busca binria ca a Se zermos isso sempre com o elemento do meio da lista, a cada comparao dividiremos a lista em duas, reduzindo nosso ca tempo de busca. Se em um determinado momento o vetor, aps sucessivas o divises, tiver tamanho zero, ento o elemento no est no o a a a vetor.

MC-102 Aula 16

Aula passada Busca

Busca Binria a

1 Inicializao ca int direita, esquerda, meio; encontrado = 0; /*Falso*/ esquerda = 0; direita = TAMANHO - 1;

MC-102 Aula 16

Aula passada Busca

Busca Binria a
2 Busca while(esquerda<=direita && !encontrado){ meio=(direita+esquerda)/2; if (vetor[meio] == valor) encontrado = 1; /*Verdadeiro*/ else if (valor < vetor[meio]) direita = meio - 1; else esquerda = meio + 1; }

MC-102 Aula 16

Aula passada Busca

Busca Sequencial

3 Tratamento do Resultado if(encontrado){ printf ("Valor %d encontrado na posicao %d\n", vetor[meio], meio); } else{ printf ("Valor %d n~o encontrado\n", valor); a } Veja o programa completo em binaria.c.

MC-102 Aula 16

Aula passada Busca

Busca Binria - Ecincia a e

Quanto tempo a busca binria demora para executar? Em outras a palavras, quantas vezes a comparao vetor[i] == valor ca e executada? Caso valor no exista no vetor, log2 (n) vezes. a Caso valor exista no vetor:
1 vez no melhor caso (valor a mediana do vetor). e log2 (n) vezes no caso m ?dio.

O logaritmo de base 2 aparece porque sempre dividimos o intervalo ao meio. Veja um exemplo em bin-random.c.

MC-102 Aula 16

Aula passada Busca

Comparao entre Busca sequencial e binria ca a

Para n = 1000, o algoritmo de busca sequencial ir executar a 1000 comparaes no pior caso, 500 operaes no caso mdio. co co e Por sua vez, o algoritmo de busca binria ir executar 10 a a comparaes no pior caso, para o mesmo n. co O algoritmo de busca binria supe que o vetor est a o a ordenado. Ordenar um vetor tambm tem um custo, superior e ao custo da busca sequencial.

MC-102 Aula 16

Aula passada Busca

Busca Binrio a

Implemente uma verso recursiva para este algoritmo. a Qual o caso base? E o recursivo? Veja o exemplo em e binario-rec.c.

MC-102 Aula 16

Aula passada Busca

Busca Binrio a

Faa uma funo que realize uma busca binria c ca a Faa uma funo que realize uma busca sequencial c ca

MC-102 Aula 16