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