Programação II Laboratório II Prof. Mateus Raeder Transparências baseadas nos originais da Prof. Patrícia Jaques Universidade do Vale do Rio dos Sinos - São Leopoldo - Pesquisa de Dados em Tabelas • Métodos para localizar entradas em tabelas, dado o valor de uma chave primária como argumento de pesquisa Chave Primária Info 1 7 ... 2 9 ... 3 14 ... 4 35 ... 5 78 ... – Localizar: informações relativa às chaves: 35, 12 Programação II – Prof. Mateus Raeder Técnica para Pesquisa Sequencial • Fazer uma varredura serial da tabela, comparando o argumento de pesquisa com a chave de cada entrada, até ser encontrada uma que seja igual (sucesso) ou até que seja atingido o final da tabela (não foi encontrado). Programação II – Prof. Mateus Raeder Pesquisa Serial em Tabela não ordenada public static int pesquisaSequencial (int tab[], int arg) { int i = 0; while (i < tab.length) { if (tab[i] == arg) return i; else i = i + 1; } return -1; } Exemplo: procurando chave 4 Programação II – Prof. Mateus Raeder Pesquisa Serial em Tabela ordenada public static int pesquisaSequencialOrdenada (int tab[], int arg) { int i = 0; while ((i < tab.length) && (tab[i]<= arg)) { if (tab[i] == arg) return i; else i = i + 1; } return -1; } Exemplo: procurando chave 11 Programação II – Prof. Mateus Raeder Pesquisa Sequencial • Método mais simples • Intuitivo Programação II – Prof. Mateus Raeder Exercício: • Fazer um algoritmo para Pesquisa Sequencial de uma tabela (ordenada e não ordenada), considerando a tabela como uma lista encadeada. Programação II – Prof. Mateus Raeder Pesquisa Binária • Método para ser aplicado em tabelas ordenadas • Reduz o nro. de elementos a serem considerados pela metade • Exemplo: Pesquisa de chave com valor 17 1 2 Programação II – Prof. Mateus Raeder Pesquisa Binária • Técnica – Consiste na comparação do argumento de pesquisa (arg) com a chave da entrada localizada no endereço médio da tabela. – Se arg for maior do que a chave contida naquele endereço, o processo é repetido para a metade superior da tabela, e – se for menor, para a metade inferior. – Se for igual, a busca se encerra com sucesso. • A área de pesquisa é reduzida à metade do número de elementos a cada vez Programação II – Prof. Mateus Raeder Exemplo pesquisa binária (1) Argumento de pesquisa: 032 E: C: O: 0 002 1 015 2 017 3 030 4 032 5 034 6 040 7 050 2ª 1ª 4ª 3ª 8 080 9 090 10 095 11 097 12 099 13 101 E: endereços C: chaves O: ordem de exame das entradas Programação II – Prof. Mateus Raeder 14 105 Exemplo pesquisa binária (2) Argumento de pesquisa: 54 E: C: 0 1 21 21 32 32 43 43 54 4 5 5 6 6 7 7 8 8 9 9 10 65 76 87 98 109 200 O: 2ª 3ª 4ª 1ª Programação II – Prof. Mateus Raeder Exemplo pesquisa binária (3) Argumento de pesquisa: 100 E: C: O: 01 12 23 34 4 5 5 6 67 7 8 21 32 43 54 65 76 87 98 8 9 9 10 109 200 1ª 2ª 3ª Programação II – Prof. Mateus Raeder Algoritmo Pesquisa Binária • Localizar, por busca binária, a posição ocupada pela chave de valor arg em um vetor tab, ordenado com reorganização física Parâmetros: tab: tabela onde será feita a pesquisa arg: argumento de pesquisa Retorno : -1 não encontrou -1 chave está na posição Programação II – Prof. Mateus Raeder Algoritmo Pesquisa Binária public static int pesquisaBinaria (int tab[], int arg) { int inf, sup, med; inf = 0; sup = tab.length-1; while (inf <= sup) { med = (inf + sup)/2; //divisão inteira if (arg == tab[med]) return med; else if (arg > tab[med]) inf = med + 1; // procura na 2a. metade else if (arg < tab[med]) sup = med - 1; // procura na 1ª metade } return -1; } Exemplo: busca da chave 43 inf E: C: O: inf sup sup inf 01 1 2 2 3 3 4 4 5 56 6 7 78 21 32 43 54 65 76 87 98 2º 3º 3º 89 9 10 109 200 Programação II – Prof. Mateus Raeder 1º Procedimento Recursivo para Pesquisa Binária public static int pesquisaBinariaR (int tab[], int arg) { return pesquisaBinariaR (tab, arg, 0, tab.length-1); } private static int pesquisaBinariaR (int tab[], int arg, int inf, int sup) { int med; if (inf > sup) return -1; med = (inf + sup)/2; //divisão inteira if (arg == tab[med]) return med; else if (arg > tab[med]) return pesquisaBinariaR(tab, arg, med + 1, sup); else return pesquisaBinariaR (tab, arg, inf, med - 1); } Programação II – Prof. Mateus Raeder