Algoritmos de pesquisa

Propaganda
Algoritmos de pesquisa
Programação (Pg)
Centro de Cálculo
Instituto Superior de Engenharia de Lisboa
Pedro Alexandre Pereira ([email protected])
Algoritmo de pesquisa
Método para encontrar um elemento num array de valores.
int findArray(double elem, double[] vals, int min, int max) { ... }
•
•
•
•
elem – o valor a procurar
vals – array onde procurar
min – índice a partir do qual se vai procurar (0 se for a partir do inicio)
max – índice até onde se vai procurar (vals.length-1 se for até ao fim)
• Retorna o índice da posição encontrada
ou -1 (índice negativo) se não encontrou
– Exemplos de utilização:
double[] a = { 2, 4, 0.5, 7, 4.2, 6, 0, -1, 9, 8, 15, 1.7 };
i = findArray(6,a,0,a.length-1);
i = findArray(9.0,a,3,10);
i = findArray(1.5,a,0,11);
i = findArray(8,a,3,8);
CCISEL, 2013
Programação
2
Pesquisa sequencial
Método para encontrar um elemento num array de valores.
int findArray(double elem, double[] vals, int min, int max) { ... }
•
•
•
•
•
•
elem – o valor a procurar
vals – array onde procurar
min – índice a partir do qual se vai procurar (0 se for a partir do inicio)
max – índice até onde se vai procurar (vals.length-1 se for até ao fim)
Retorna o índice da posição encontrada ou -1 se não encontrou
Algoritmo de pesquisa sequencial
int findArray(double elem, double[] vals, int min, int max) {
for( int idx = min ; idx <= max ; ++idx )
if (vals[idx] == elem)
return idx;
return -1;
}
CCISEL, 2013
Programação
3
Pesquisa sequencial com paragem
No caso do array estar ordenado:
double[] a = {-1, 0, 0.5, 1.7, 2, 4, 4.2, 6, 7, 8, 9, 15};
• A pesquisa termina quando encontra um elemento …
– igual ao procurado
– maior que o procurado
• Algoritmo de pesquisa sequencial (com paragem)
int findArray(double elem, double[] vals, int min, int max) {
int idx;
for(idx = min ; idx <= max && elem > vals[idx] ; ++idx )
;
return (idx<=max && vals[idx]==elem) ? idx : -1;
}
CCISEL, 2013
Programação
4
Pesquisa dicotómica recursiva
No caso do array estar ordenado:
• Comparar com o elemento central
– Igual ao procurado ?
– Menor que o procurado ?
– Maior que o procurado ?
retorna o índice
procurar na metade superior
procurar na metade inferior
• Algoritmo recursivo da pesquisa dicotómica / binária
int findArray(double elem, double[] vals, int min, int max) {
if (min>max) return -1;
int idx=(min+max)/2;
if (vals[idx]== elem) return idx;
if (vals[idx] < elem) min=idx+1;
else max=idx-1;
return findArray(elem,vals,min,max);
}
CCISEL, 2013
Programação
5
Pesquisa dicotómica iterativa
No caso do array estar ordenado:
• Comparar com o elemento central
– Igual ao procurado ?
– Menor que o procurado ?
– Maior que o procurado ?
retorna o índice
procurar na metade superior
procurar na metade inferior
• Algoritmo iterativo da pesquisa dicotómica / binária
int findArray(double elem, double[] vals, int min, int max) {
int idx;
while( min <= max ) {
idx = (min+max) / 2;
if (vals[idx] == elem) return idx;
if (vals[idx] < elem) min=idx+1;
else max=idx-1;
}
return -1;
}
CCISEL, 2013
Programação
6
Número de comparações na pesquisa
dim = max-min+1
•
exemplo: (dim = 1024)
Pior caso
Média
elemento encontrado
Média
elemento não encontrado
CCISEL, 2013
Sequencial
Sequencial
(com paragem)
Dicotómica
dim
dim
≈log2(dim)
(1024)
(1024)
(10)
dim / 2
dim / 2
< log2(dim)
(512)
(512)
(< 10)
dim
dim / 2
≈log2(dim)
(1024)
(512)
(10)
Programação
7
Inserção ordenada
Inserir um elemento mantendo o array ordenado:
void insertArray(double elem, double[] vals, int min, int max) { ... }
•
Algoritmo de inserção ordenada
void insertSort(double elem, double[] vals, int min, int max) {
int idx = max;
while( idx>=min && vals[idx] > elem )
vals[idx+1] = vals[idx];
vals[idx] = elem;
}
CCISEL, 2013
Programação
8
Download