Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São...
Transcript of Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São...
Programação IILaboratório II
Prof. Mateus Raeder
Universidade do Vale do Rio dos Sinos- São Leopoldo -
Transparências baseadas nos originais da Prof. Patrícia Jaques
Programação II – Prof. Mateus Raeder
• Métodos para localizar entradas em tabelas, dado o valor de uma chave primária como argumento de pesquisa
– Localizar: informações relativa às chaves: 35, 12
Pesquisa de Dados em Tabelas
Chave Primária Info
1 7 ...
2 9 ...
3 14 ...
4 35 ...
5 78 ...
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 emTabela 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
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
Pesquisa Serial emTabela ordenada
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: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 C: 002 015 017 030 032 034 040 050 080 090 095 097 099 101 105
O:
2ª
4ª
3ª
1ª
E: endereços C: chaves O: ordem de exame das entradas
Programação II – Prof. Mateus Raeder
Argumento de pesquisa: 54
E: 1 2 3 4 5 6 7 8 9 10 C: 21 32 43 54 65 76 87 98 109 200
O: 2ª 3ª 4ª 1ª
0 1 2 3 4 5 6 7 8 9
Exemplo pesquisa binária (2)
Programação II – Prof. Mateus Raeder
Argumento de pesquisa: 100
E: 1 2 3 4 5 6 7 8 9 10 C: 21 32 43 54 65 76 87 98 109 200
O: 1ª 2ª 3ª
0 1 2 3 4 5 6 7 8 9
Exemplo pesquisa binária (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; }
1º
0 1 2 3 4 5 6 7 8 9inf sup
2º
infsup
Exemplo: busca da chave 43
1º
infinf
3º3º
Programação II – Prof. Mateus Raeder
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); }