Unidade I: Introdução - Algoritmos de Pesquisa Instituto de Ciências Exatas e Informática Departamento de Ciência da Computação Algoritmos de Pesquisa Agenda • Pesquisa sequencial • Pesquisa binária ---------------------------- Algoritmos e Estruturas de Dados II (2) Algoritmos de Pesquisa Agenda • Pesquisa sequencial • Pesquisa binária ---------------------------- Algoritmos e Estruturas de Dados II (3) Algoritmos de Pesquisa Pesquisa Sequencial boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } ---------------------------- Algoritmos e Estruturas de Dados II (4) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (5) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (6) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ // n = 16 if (array[i] == x){ // true resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (7) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // false resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (8) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (9) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ // n = 16 if (array[i] == x){ // true resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (10) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // false resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (11) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (12) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ // n = 16 if (array[i] == x){ // true resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (13) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // false resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (14) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (15) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ // n = 16 if (array[i] == x){ // true resp = true; i = n; } } resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (16) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // true resp false 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (17) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // true resp true 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (18) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // true resp true 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (19) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } // true resp true 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (20) Algoritmos de Pesquisa Exemplo da Pesquisa Sequencial • Exemplo: procurar o 7 boolean resp = false; for (int i = 0; i < n; i++){ // n = 16 if (array[i] == x){ // false resp = true; i = n; } } resp true 3 13 5 7 9 11 20 1 6 21 30 4 49 8 2 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (21) Algoritmos de Pesquisa Análise da Pesquisa Sequencial boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } ---------------------------- 1º) Qual é a operação relevante? R: Comparação entre elementos do array 2º) Quantas vezes ela será executada? Algoritmos e Estruturas de Dados II (22) Algoritmos de Pesquisa Análise da Pesquisa Sequencial boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } ---------------------------- 1º) Qual é a operação relevante? R: Comparação entre elementos do array 2º) Quantas vezes ela será executada? R: Em qual dos casos? Algoritmos e Estruturas de Dados II (23) Algoritmos de Pesquisa Análise da Pesquisa Sequencial boolean resp = false; for (int i = 0; i < n; i++){ if (array[i] == x){ resp = true; i = n; } } ---------------------------- 1º) Qual é a operação relevante? R: Comparação entre elementos do array 2º) Quantas vezes ela será executada? R: Melhor caso: f(n) = 1 = Θ(1) Pior caso: f(n) = n = Θ(n) Caso médio: f(n) = (n + 1) = Θ(n) 2 Algoritmos e Estruturas de Dados II (24) Algoritmos de Pesquisa Exercício • Vamos fazer alguns exercícios antes de continuar? ---------------------------- Algoritmos e Estruturas de Dados II (25) Algoritmos de Pesquisa Exercício Resolvido (1) • Quando acontece o melhor e o pior caso do algoritmo de pesquisa sequencial? ---------------------------- Algoritmos e Estruturas de Dados II (26) Algoritmos de Pesquisa Exercício Resolvido (1) • Quando acontece o melhor e o pior caso do algoritmo de pesquisa sequencial? Resposta: Melhor caso: Elemento procurado está na primeira posição Pior caso: Ele está na última posição OR não está no array ---------------------------- Algoritmos e Estruturas de Dados II (27) Algoritmos de Pesquisa Exercício Resolvido (2) • Supondo que temos uma informação extra sobre o array: que ele está ordenado. Conseguimos fazer algo mais eficiente? Como? ---------------------------- Algoritmos e Estruturas de Dados II (28) Algoritmos de Pesquisa Exercício Resolvido (2) • Supondo que temos uma informação extra sobre o array: que ele está ordenado. Conseguimos fazer algo mais eficiente? Como? Resposta: Sim. Pesquisamos a partir da metade do array. ---------------------------- Algoritmos e Estruturas de Dados II (29) Algoritmos de Pesquisa Exercício Resolvido (2) • Supondo que temos uma informação extra sobre o array: que ele está ordenado. Conseguimos fazer algo mais eficiente? Como? Resposta: Sim. Pesquisamos a partir da metade do array. Se o elemento procurado for maior que o da metade, descartamos a primeira metade do array; senão, a segunda metade. Repetimos o processo com a metade não descartada ---------------------------- Algoritmos e Estruturas de Dados II (30) Algoritmos de Pesquisa Exercício Resolvido (2) • Supondo que temos uma informação extra sobre o array: que ele está ordenado. Conseguimos fazer algo mais eficiente? Como? Resposta: Sim. Pesquisamos a partir da metade do array. Se o elemento procurado for maior que o da metade, descartamos a primeira metade do array; senão, a segunda metade. Repetimos o processo com a metade não descartada Essa é a pesquisa binária ---------------------------- Algoritmos e Estruturas de Dados II (31) Algoritmos de Pesquisa Agenda • Pesquisa sequencial • Pesquisa binária ---------------------------- Algoritmos e Estruturas de Dados II (32) Algoritmos de Pesquisa Pesquisa Binária boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } ---------------------------- Algoritmos e Estruturas de Dados II (33) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp false 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (34) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (35) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (0 <= 15): true resp false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (36) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (0 + 15) / 2: 7 resp false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (37) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (35 == 17): false resp false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (38) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp (35 > 17): true false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (39) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } Com uma comparação, reduzimos o espaço de busca pela metade resp meio false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (40) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (8 <= 15): true resp false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (41) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (8 + 15) / 2: 11 resp false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (42) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (35 == 43): false resp false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (43) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp (35 > 43): false false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (44) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp false dir meio esq 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (45) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (8 <= 10): true resp false dir meio esq 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (46) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (8 + 10) / 2: 9 resp false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (47) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (35 == 21): false resp false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (48) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp (35 > 21): true false meio esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (49) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp false esq meio dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (50) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (10 <= 10): true resp false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (51) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (10 + 10) / 2: 10 resp meio false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (52) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (35 == 30): false resp meio false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (53) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp (35 > 30): true meio false esq dir 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (54) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } resp false meio dir esq 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (55) Algoritmos de Pesquisa Exemplo da Pesquisa Binária • Exemplo: procurar o 35 boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } (11 <= 10): false resp dir false esq 2 3 5 7 9 11 15 17 20 21 30 43 49 70 71 82 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ---------------------------- Algoritmos e Estruturas de Dados II (56) Algoritmos de Pesquisa Análise da Pesquisa Binária • Exemplo boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } ---------------------------- 1º) Qual é a operação relevante? R: Comparação entre elementos do array. 2º) Quantas vezes ela será executada? Algoritmos e Estruturas de Dados II (57) Algoritmos de Pesquisa Análise da Pesquisa Binária • Exemplo boolean resp = false; int dir = n - 1, esq = 0, meio; while (esq <= dir) { meio = (esq + dir) / 2; if (x == array[meio]){ resp = true; esq = n; } else if (x > array[meio]){ esq = meio + 1; } else { dir = meio - 1; } } ---------------------------- 1º) Qual é a operação relevante? R: Comparação entre elementos do array. 2º) Quantas vezes ela será executada? Algoritmos e Estruturas de Dados II (58) R:Melhor caso: f(n) = 1 = Θ(1) Pior caso: f(n) = 2 x lg(n) = Θ(lg n) Algoritmos de Pesquisa Exercício Resolvido (3) • Quando acontece o melhor e o pior caso do algoritmo de pesquisa binária? ---------------------------- Algoritmos e Estruturas de Dados II (59) Algoritmos de Pesquisa Exercício Resolvido (3) • Quando acontece o melhor e o pior caso do algoritmo de pesquisa binária? Resposta: Melhor caso: Elemento procurado está na metade do array Pior caso: Está na última posição de procura (lg n) ou não está no array ---------------------------- Algoritmos e Estruturas de Dados II (60) Algoritmos de Pesquisa Exercício (1) • A solução apresentada para pesquisa binária faz duas comparações entre elementos do array em cada execução da repetição, modifique o código para efetuarmos apenas uma ---------------------------- Algoritmos e Estruturas de Dados II (61)