Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1
Algoritmos de Pesquisa e de Ordenao. Noes sobre Complexidade Algortmica
Algoritmos de Pesquisa
Dada uma sequncia (vector) de n elementos, pretende-se saber se um determinado elemento pertence ou no a esta sequncia
Algoritmos de Pesquisa
Estrutura de dados para representar a sequncia
um array: por simplicidade vamos supor um array de n elementos inteiros // criar, instanciar e inicializar um array com 9 elementos inteiros int [ ] numero = { 23, 17, 5, 90, 12, 44, 38, 84, 77 };
Pesquisa Sequencial
Algoritmo: verso 1 (ciclo for)
Percorremos o array numero desde a primeira posio at ltima. Para cada ndice i, comparamos numero[i] com o valor a procurar. Se o valor for encontrado, a busca termina com sucesso e retornamos o ndice onde o valor foi encontrado. Se chegarmos ao fim do array e no encontramos o valor, a busca termina sem sucesso e enviamos para fora o valor -1 fun o pesquisaSequencialv1 (int numero, int valor) int funo pesquisaSequencialv1 (int [[ ]] numero int valor int fun fun numero, numero valor) valor { { inicializar indice com NO_ACHOU (-1); inicializar indice com NO_ACHOU (-1); para (i = 0; ii < numero.length; i++) { para (i = 0; < numero.length; i++) { se (numero [i] = valor) se (numero [i] = valor) indice = i; indice = i; } // fim para } // fim para retornar indice; retornar indice; } }
Pesquisa Sequencial
Algoritmo: verso 2 (ciclo while)
Percorremos o array numero at encontrar o primeiro elemento numero[i] cujo valor igual ao valor dado (busca termina com sucesso) ou at chegar ao fim do vector e concluirmos que a busca termina sem sucesso fun o pesquisaSequencialv2 (int numero, int valor) int funo pesquisaSequencialv2 (int [[ ]] numero int valor int fun numero, valor) fun numero valor { { inicializar indice com 0; inicializar indice com 0; enquanto ((indice < numero.length) && numero[indice] != valor) { enquanto ((indice < numero.length) && numero[indice] != valor) { indice++; indice++; } // fim enquanto } // fim enquanto se (indice == numero.length) se (indice == numero.length) retornar (NO_ACHOU); retornar (NO_ACHOU); else else retornar indice; retornar indice; } }
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
5
Pesquisa Sequencial
Algoritmo: verso 2 (ciclo while)
Implementao do mtodo pesquisaSequencial em Java
static int pesquisaSequencial (int[] numero, int valor ){ static int pesquisaSequencial (int[] numero, int valor ){ int indice = 0; int indice = 0; while (indice < numero.length && while (indice < numero.length && numero[indice] != valor ) { numero[indice] != valor ) { indice++; indice++; } } if (indice == numero.length) // sem sucesso if (indice == numero.length) // sem sucesso return NAO_ACHOU; return NAO_ACHOU; else else // Achou, retorna o ndice return indice; // Achou, retorna o ndice return indice; } }
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
Pesquisa Binria
A ideia do algoritmo consiste em utilizar uma sequencia ordenada e uma estratgia de partio sucessiva em duas metades por forma a diminuir o n de elementos a analisar, acelerando assim a pesquisa
min
Exemplo: pesquisaBinaria(77)
max
meio
min
max
A pesquisa comea por seleccionar o elemento central do array (38) e compara-o com o valor procurado. Como 77 > 38, ento 77 tem de estar na 2 metade, pelo que podemos excluir para futuros anlises a 1 metade. Voltamos a seleccionar o elemento que est no meio (77). Como o elemento seleccionado o valor procurado, o algoritmo termina com sucesso e o ndice 6 retornado. Foram realizadas apenas 2 comparaes para encontrar o nmero
8
meio
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
min= 0
max=8
min= 5
max=5
min= 6
max=5
Pesquisa Binria
Algoritmo
Implementao do mtodo pesquisaBinaria em Java
static int pesquisaBinaria (int[] numero, int valor ){ static int pesquisaBinaria (int[] numero, int valor ){ int min = 0, max = numero.length -1, meio; int min = 0, max = numero.length -1, meio; while (min <= max) { while (min <= max) { meio = (min + max) // 2; // clculo da posio mdia meio = (min + max) 2; // clculo da posio mdia if (numero[meio] == valor) if (numero[meio] == valor) return meio; // pesquisa com sucesso return meio; // pesquisa com sucesso // actualizao dos limites do intervalo de pesquisa // actualizao dos limites do intervalo de pesquisa if (numero[meio] > valor) if (numero[meio] > valor) max = meio -1; max = meio -1; else else min = meio + 1; min = meio + 1; } // fecho ciclo } // fecho ciclo return NAO_ACHOU;; // pesquisa sem sucesso return NAO_ACHOU // pesquisa sem sucesso } }
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
10
private static final int NAO_ACHOU = -1; private static final int NAO_ACHOU = -1;
Complexidade Algortmica
Um algoritmo mais eficiente deve exigir menos recursos para resolver um problema complexidade
Complexidade Espacial:
espao de memria utilizado em funo do tamanho Complexidade Temporal: T(n) tempo de execuo utilizado em funo do tamanho
12
Dn domnio das instncias de dados do problema de dimenso n I Dn uma instncia do problema P(I) a probabilidade de ocorrncia de I em Dn T(I) a complexidade temporal
13
14
Complexidade
Algoritmo de Pesquisa Sequencial
T(n) n de comparaes realizadas verso 1 (ciclo for) :
melhor caso, pior caso, caso mdio: B(n) = W(n) = A(n) = n
Calculando: A(n) =
i [1..n]
17
Se n de elementos n2k-1:
rvore incompleta com altura k=log2(n+1) arredondado por excesso ao prximo inteiro os primeiros k-1 nveis contm 2i elementos (0 i k-2) o ltimo nvel k-1 contm entre 1 e 2k-1 1 elementos
O algoritmo faz no mximo k iteraes para pesquisar o valor procurado o que corresponde altura da rvore de deciso
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
18
21 12 7 3 10 15 17 19 23 27 30 35 32 42 44 48 51 53 62 60 66 68
72 87 84 83 85 93 90 98
3 7 10 12 15 17 19 21 23 27 30 32 35 42 44 45 48 51 53 60 62 66 68 72 83 84 85 87 90 93 98
melhor caso: se o valor a procurar se encontra na posio meia apenas 1 comparao B(n) = 1 pior caso: se o valor a procurar se encontra no ltimo nvel da rvore ou no existe k comparaes W(n) = k = log2(n+1)
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
19
20
altura k = 5
10
22
11
23
Algoritmos de Ordenao
A ordenao o processo de organizar um conjunto de elementos de uma sequncia (vector) segundo uma determinada ordem.
12
trocar
25
trocar
min
trocar
trocar
min
min
trocar min
trocar
ordenada
trocar
2007-2008 , Gladys Castillo
trocar
26
13
27
28
14
1 passagem
trocar
trocar
trocar
trocar
trocar
trocar
No final da 1 passagem apenas o valor mximo (90) ocupa a posio correcta. Para a 2 passagem analisamos os restantes elementos no ordenada 2007-2008 , Gladys Castillo
trocar
29
Ordenao Bubble
Algoritmo
int[ static void bubbleSort (int ]] numero){ int int[ static void bubbleSort (int numero){ int int fim= numero.length-2, aux; int fim= numero.length-2, aux; boolean houveTrocas = true; boolean houveTrocas = true; while (houveTrocas) { while (houveTrocas) { // cada iterao corresponde a uma passagem // cada iterao corresponde a uma passagem houveTrocas = false; houveTrocas = false; for (int i=0; ii <= fim; ii ++) { int for (int i=0; <= fim; ++) { int if (numero [i] > numero[i+1]) { if (numero [i] > numero[i+1]) { //Trocar de posio //Trocar de posio aux = numero[i]; aux = numero[i]; numero[i] = numero[i+1]; numero[i] = numero[i+1]; numero[i+1] = aux; numero[i+1] = aux; houveTrocas = true; houveTrocas = true; } } } } fim--; // actualizo o ndice final da sequencia fim--; // actualizo o ndice final da sequencia } } } }
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
A varivel fim inicializada com o ndice do penltimo elemento da sequncia. Para todos os elementos da sequncia desde o 1 elemento at ao elemento com ndice fim, cada elemento comparado com o elemento seguinte, e caso o valor seja menor, trocamse os elementos. Como sempre que termina uma passagem o elemento com ndice fim est na posio correcta, o ndice fim reduzido numa unidade. O processo repete-se at que numa passagem no tiver sido efectuada qualquer troca (houveTrocas = false)
30
15
na (n-1) passagem, o penltimo menor valor fica na penltima posio e o maior valor fica na ltima posio
melhor caso pior caso caso mdio
k 1 =
k =2
n 1
BC(n) = Wc(n) = Ac(n) n2 N de Trocas: melhor caso: (sequncia ordenada) pior caso: (1 troca por passagem)
n(n 1) n2 comparaes 2
Ordenao Bubble
Complexidade
Este algoritmo tem uma complexidade de comparao quadrtica e uma complexidade de trocas quadrtica, ou seja de ordem O(n2)
n de comparaes n de trocas
pior caso: sequncia por ordem inversa caso meio: a anlise bastante complicada
32
16
Bubble:
para uma sequncia de n elementos efectua o n de passagens necessrias para orden-la (dependente do grau de ordenao dos elementos) termina logo que se detecte que, ao longo de uma passagem, no foram efectuadas quaisquer trocas. Neste caso considera-se que a sequncia est ordenada ao fim de cada passagem apenas o ltimo elemento de cada subsequncia est colocado na posio correcta tem uma complexidade de comparao quadrtica e uma complexidade de trocas quadrtica
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
33
O algoritmo por seleco mais indicado para ordenar sequncias que estejam completamente desordenadas (o pior caso)
neste caso o algoritmo de Bubble faz muitas mais trocas ( n2) do que o algoritmo de seleco ( n)
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
34
17
Bibliografia
C. Thomas Wu: An introduction to Object-Oriented Programming with Java, third edition. Chapter 11: Sorting and Searching
slides online:
http://highered.mcgraw-hill.com/sites/0072518847/student_view0/chapter11/powerpoint.html
Roslia Rodrigues: Introduo Anlise e Desenvolvimento de Algoritmos. Captulo 2. Complexidade. Pesquisa e Ordenao
on-line em: http://www2.mat.ua.pt/rosalia/cadeiras/ADA/Cap2Complexidade.pdf
Antnio Adrego da Rocha: Programao Avanada usando C. Tecnologias da Informao. FCA Editora de Informtica, 2006 Captulo 6. Pesquisa e Ordenao Joo Faria. Anlise da Complexidade de Algoritmos
acetatos on-line em: http://paginas.fe.up.pt/~jpf/teach/AED/slides3.pdf
Nota: Algumas das figuras usadas nos acetatos foram extradas destas fontes
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
35
18