Funciona com qualquer tipo de dado ordenado
Simples
Algoritmos e Estruturas de Dados:
Pesquisa Binária
Ineficiente se muitas inserções e remoções
– Precisa manter ordenado
– Neste caso melhor usar uma árvore ou hash
Rômulo Silva de Oliveira
Departamento de Automação e Sistemas – DAS – UFSC
Também todos os elementos precisam estar cont íguos na memória
Muito bom quando os dados são estáticos (read-only)
[email protected]
http://www.das.ufsc.br/~romulo
Maio/2011
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
1
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
4
Referências
Repetidamente divide o conjunto e inspeciona o elemento do meio
– Busca 47
Mastering Algorithms with C
Kyle Loudon
O´Reilly, 1999
10
14
21
38
45
47
53
81
87
99
Livros de algoritmos e estruturas de dados em geral
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
2
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
5
Pesquisa Binária – Introdução 1/9
Pesquisa binária inicia com um conjunto de dados que est á ordenado
Para iniciar a pesquisa, inspeciona-se o elemento do meio
Se o elemento do meio é maior do que o buscado
Repetidamente divide o conjunto e inspeciona o elemento do meio
– Busca 47
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
– Repete a pesquisa na metade inferior
Se o elemento do meio é menor do que o buscado
– Repete a pesquisa na metade superior
Repete até que
– Localizar o elemento buscado
– Não ser mais possível dividir o conjunto
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
3
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
6
Repetidamente divide o conjunto e inspeciona o elemento do meio
Repetidamente divide o conjunto e inspeciona o elemento do meio
– Busca 47
– Busca 47
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
7
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
10
Pesquisa Binária – Interface 1/1
bisearch
Repetidamente divide o conjunto e inspeciona o elemento do meio
– Busca 47
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
– int bisearch(void *sorted, void *target, int size, int esize,
int (*compare)(const void *key1, const void *key2);
Retorno
– Indice do elemento alvo quando encontrado, ou -1 caso contr ário.
Descrição
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
– Usa pesquisa binária para localizar target em sorted, um array ordenado de
elementos. O número de elementos em sorted é especificado por size. O tamanho
de cada elemento é especificado por esize. O pointer para função compare
especifica uma função definida por usuário para comparar elementos. Esta fun ção
deve retornar 1 se key1 > key2, 0 se key1 = key2, e -1 se key1 < key2.
8
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
11
Pesquisa Binária – Implementação 1/2
#include <stdlib.h>
#include <string.h>
Repetidamente divide o conjunto e inspeciona o elemento do meio
– Busca 47
10
14
21
38
45
47
53
81
87
99
#include "search.h"
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
10
14
21
38
45
47
53
81
87
99
int bisearch(void *sorted, const void *target, int size, int esize,
int (*compare)(const void *key1, const void *key2)) {
int left, middle, right;
// Continue searching until the left and right indices cross.
left = 0;
right = size - 1;
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
9
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
12
Pesquisa Binária – Implementação 2/2
while (left <= right) {
middle = (left + right) / 2;
switch (compare(((char *)sorted + (esize * middle)), target)) {
case -1:
// Prepare to search to the right of the middle index
left = middle + 1;
break;
case 1:
// Prepare to search to the left of the middle index
right = middle - 1;
break;
case 0:
// Return the exact index where the data has been found
return middle;
}
}
return -1;
}
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
13
Pesquisa Binária – Sumário
Simples
– Baixo overhead
Eficiente
Precisa manter os dados ordenados
Excelente para tabelas read-only
Rômulo Silva de Oliveira, DAS-UFSC, maio/2011
14
Download

Pesquisa Binária - Rômulo Silva de Oliveira