Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São...

15
Programação II Laborató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

Transcript of Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São...

Page 1: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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

Page 2: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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 ...

Page 3: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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).

Page 4: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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

Page 5: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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

Page 6: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

Programação II – Prof. Mateus Raeder

Pesquisa Sequencial

• Método mais simples• Intuitivo

Page 7: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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.

Page 8: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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

Page 9: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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

Page 10: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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:

E: endereços C: chaves O: ordem de exame das entradas

Page 11: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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)

Page 12: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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)

Page 13: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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

Page 14: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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; }

0 1 2 3 4 5 6 7 8 9inf sup

infsup

Exemplo: busca da chave 43

infinf

3º3º

Page 15: Programação II Laboratório II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Transparências baseadas nos originais da Prof.

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); }