Está en la página 1de 18

Captulo 3.

1
Algoritmos de Pesquisa e de Ordenao. Noes sobre Complexidade Algortmica

Algoritmos e Estruturas de Dados

2007-2008 , Gladys Castillo

Algoritmos de Pesquisa
Dada uma sequncia (vector) de n elementos, pretende-se saber se um determinado elemento pertence ou no a esta sequncia

Algoritmos e Estruturas de Dados

2007-2008 , Gladys Castillo

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

Duas possveis sadas:


se o elemento for encontrado, a busca termina com sucesso o ndice do elemento retornado caso contrrio: a busca termina sem sucesso o valor -1 retornado
Pesquisa sem sucesso: pesquisa(45) NAO_ACHOU (-1) Pesquisa com sucesso: pesquisa(12) 4 (ndice)
numero

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

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

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

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 Sequencial. Programa de Teste Mtodo: main


class Cap2Top1PesquisaSequencial Cap2Top1PesquisaSequencial{ class Cap2Top1PesquisaSequencial{ Cap2Top1PesquisaSequencial private static final int VAZIO = 0; // esta constante usada para preencher o array private static final int VAZIO = 0; // esta constante usada para preencher o array private static final int NAO_ACHOU = -1; private static final int NAO_ACHOU = -1; public static void main (String[] args) { public static void main (String[] args) { int[ numero = new int[100]; int ]] numero = new int[100]; int[ int int num, indice; int num, indice; preencherAleatorio(numero); // preencher o array aleatoriamente (ver programa) preencherAleatorio preencherAleatorio(numero); // preencher o array aleatoriamente (ver programa) preencherAleatorio imprimir(numero); // imprimir tabela com nmeros gerados (ver programa) imprimir imprimir(numero); // imprimir tabela com nmeros gerados (ver programa) imprimir do { do { num = lerNumIntNoNeg (Valor a procurar: ); Valor num = lerNumIntNoNeg (Valor a procurar: ); Valor if (num == 0) break break; if (num == 0) break; break indice = pesquisaSequencial indice = pesquisaSequencial(numero, num); pesquisaSequencial(numero, num); pesquisaSequencial if (indice != NAO_ACHOU NAO_ACHOU) if (indice != NAO_ACHOU) NAO_ACHOU System.out.println( "O valor + num + "encontra-se na posio + (indice+1) ); encontraO valor encontra System.out.println( "O valor" + num + "encontra-se na posio + (indice+1) ); encontraposio O valor" encontra posio else else System.out.println("O valor + num + "no foi achado O valor no System.out.println("O valor" + num + "no foi achado); achado); O valor" no achado } while (true); } while (true); } }
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
7

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

Pesquisa Binria sem Sucesso


Exemplo: pesquisaBinaria(45) O valor 45 no foi encontrado ao fim de 3 comparaes

min= 0

meio=4 min = meio + 1

max=8

min= 5

max=5

meio=5 min = meio + 1

max=8 min= 5 meio=6 max = meio - 1


Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo

min= 6

max=5

min > max

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;

Noes sobre Complexidade

Algoritmos e Estruturas de Dados

2007-2008 , Gladys Castillo

Complexidade Algortmica
Um algoritmo mais eficiente deve exigir menos recursos para resolver um problema complexidade
Complexidade Espacial:

S(n) n da entrada n da entrada

espao de memria utilizado em funo do tamanho Complexidade Temporal: T(n) tempo de execuo utilizado em funo do tamanho

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

12

Complexidade Temporal (I)


Na prtica, o tempo de execuo pode ser medido como o nmero de operaes realizadas por um algoritmo, na resoluo de um determinado problema
Seja:

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

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

13

Complexidade Temporal (II)


Definies: B(n) = min t(I) melhor caso para o Algoritmo
I Dn

W(n) = max t(I) pior caso para o Algoritmo


I Dn

A(n) = p(I) t(I) - caso mdio


I Dn

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

14

Algoritmo de Pesquisa Sequencial


Verso 1 vs. Verso 2
Quanto tempo que cada verso do algoritmo demora a executar? Depende do n de comparaes realizadas: Verso 1 (com ciclo for): o n de comparaes sempre o mesmo e igual ao n de elementos do array (n) para qualquer instncia do problema Verso 2 (com ciclo while): o n de comparaes depende da instncia do problema:
se busca sem sucesso: n vezes se busca com sucesso:
1 vez no melhor caso (quando valor est na primeira posio) n vezes no pior caso (quando valor est na ltima posio) n/2 vezes no caso mdio (em mdia metade dos elementos so analisados)
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
15

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

verso 2 (ciclo while) :


melhor caso: se o valor a procurar est na 1 posio B(n) = 1 pior caso: se o valor a procurar est na ltima posio ou no pertence ao array W(n) = n caso mdio: em mdia metade dos elementos so analisados A(n) = n/2
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo
16

Anlise do Caso Mdio (v.2)


A(n) = n/2
Devemos identificar o n de casos possveis, e respectivas operaes: Ii com i [1..n], representa o caso quando numero[i]=valor Se no existir qualquer informao sobre a localizao do valor:
P(Ii) = P(numero[i] = valor) = 1/ n, para todo i [1..n]

Calculando: A(n) =
i [1..n]

p(Ii) t(Ii) = i/n = (n +1) /2 n/2


i [1..n]

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

17

Algoritmo de Pesquisa Binria


Complexidade (I)
Podemos estudar a complexidade do algoritmo de pesquisa binria atravs de uma rvore de deciso binria: Se n de elementos n=2k-1:
rvore completa com altura k=log2(n+1) cada nvel da rvore contm 2i elementos (0 i k-1)

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

Algoritmo de Pesquisa Binria


Complexidade (II)
Exemplo: Para um vector com n =25 1 = 31 elementos, a rvore de deciso binria completa com altura k = log2 (32) = 5
<45 45 >45

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

Pesquisa Sequencial vs. Binria


O algoritmo da pesquisa sequencial da ordem de n ou linear em n O(n) O algoritmo da pesquisa binria da ordem de log2n ou logartmico em n O(log2n)
Comparao da ordem de crescimento dos tempos de execuo, entre um algoritmo logartmico e um algoritmo linear

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

20

altura k = 5

10

Ordem Algortmica (I)


T(n) de ordem f(n) ( denotadoO(f(n)) sse existem constantes positivas c e n0 tal que T(n) c f(n) para todo n> n0
Tempos de execuo de programas em funo da dimenso n da instancia do problema f(n) Tempo de execuo

Log n 1 sec 3 sec 5 sec 6 sec

n 2 sec 8 sec 32 sec 64 sec

n2 4 sec 64 sec 17 min 1.14 hrs

n3 8 sec 8.5 min 9.1 hrs 3 days

2n 4 sec 4.3 min 1.4 centuries 5 x109 Centuries


21

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

Ordem Algortmica (II)


Exemplos: se f(n)- constante O(1) (ordem constante)
se f(n) = log2n O(log n) (ordem logartmica) se f(n) = ck nk+ ck-1 nk-1 +...+c0 O(nk) (ordem polinomial)

So os algoritmos mais eficientes

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

22

11

Ordem Algortmica (III)


Algoritmos de complexidade logartmica so os mais eficientes Algoritmos de complexidade exponencial so os menos eficientes se necessita de um tempo imenso para executar o algoritmo este tipo de algoritmo no vivel Um algoritmo s vivel se pode ser implementado em tempo til Algoritmos de ordem polinomial e inferior

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

23

Algoritmos de Ordenao
A ordenao o processo de organizar um conjunto de elementos de uma sequncia (vector) segundo uma determinada ordem.

Algoritmos e Estruturas de Dados

2007-2008 , Gladys Castillo

12

Ordenao por Seleco


Algoritmo para ordenao crescente: fazer passagens sucessivas sobre todos os elementos da parte da sequncia que ainda no estiver ordenada em cada passagem, o menor valor trocado com o primeiro elemento
(caso o elemento da 1 posio seja maior do que o menor)
ordenada no ordenada ini min

trocar

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

25

Ordenao por Seleco


Exemplo
8 passagens so necessrias para ordenar esta sequncia
passagem min passagem
min

trocar

min

trocar

trocar

min

min

trocar min

trocar

ordenada

trocar
2007-2008 , Gladys Castillo

trocar
26

Algoritmos e Estruturas de Dados,

13

Ordenao por Seleco


Algoritmo
static void selectionSort (int[] numero ){ electionSort static void selectionSort (int[] numero ){ electionSort int ini, min, aux; int ini, min, aux; for (ini =0; ini < numero.length -1; ini ++){ for (ini =0; ini < numero.length -1; ini ++){ // cada iterao do ciclo corresponde a uma passagem // cada iterao do ciclo corresponde a uma passagem // determinar o valor mnimo da sequencia // determinar o valor mnimo da sequencia min = ini; min = ini; for (int i=ini + 1; ii < numero.length; ii ++) { int for (int i=ini + 1; < numero.length; ++) { int if (numero [i] < numero[min]) min = i; if (numero [i] < numero[min]) min = i; } } if (min != ini) { //Trocar de posio if (min != ini) { //Trocar de posio aux = numero[ini]; aux = numero[ini]; numero[ini] = numero[min]; numero[ini] = numero[min]; numero[min] = aux; numero[min] = aux;
} } } } } }
Cada elemento da sequncia comparado com os elementos debaixo dele. A varivel min representa o ndice do elemento com menor valor detectado e inicializada a ini. Se o elemento de menor valor (com ndice min) for menor do que o elemento actual (com ndice i), ento esse elemento com ndice i o menor valor detectado, pelo que min actualizado a i. No final da passagem, se min diferente de ini, ento, sinal que o elemento de menor valor no est na posio inicial e, portanto, preciso trocar os elementos

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

27

Trocar os valores de duas variveis


Para poder trocar o valor de duas variveis precisamos usar uma varivel auxiliar que armazena temporariamente o valor de uma delas
//Trocar valores de a com b //Trocar valores de a com b int a =2, b =3, aux; int a =2, b =3, aux; // antes da troca a=2, b=3 // antes da troca a=2, b=3 aux = a; aux = a; a = b; a = b; b = aux; b = aux; // depois da troca a=3, b=2 // depois da troca a=3, b=2
2. a toma o valor de b 3. b toma o valor de aux

1. aux toma o valor de a

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

28

14

Ordenao Bubble BubbleSort


Algoritmo para ordenao crescente: fazer passagens sucessivas sobre todos os elementos da parte da sequncia que ainda no estiver ordenada em cada passagem, cada elemento comparado com o elemento atrs dele. Caso o valor seja menor, trocam-se os elementos. O algoritmo termina logo que se detecte que ao longo de uma passagem no foram efectuadas quaisquer trocas a sequncia est ordenada
O valor mximo (90) vai deslocando-se para a ltima posio. Em contrapartida, os elementos de menor valor vo deslocandose para a esquerda

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

Algoritmos e Estruturas de Dados,

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

Ordenao por Seleco


Complexidade
Este algoritmo tem uma complexidade de comparao quadrtica e uma complexidade de trocas linear , no entanto de ordem O(n2).
N de Comparaes: n-1 passagens para uma sequncia de n elementos
na 1 passagem: o menor valor fica na 1 posio na 2 passagem: o 2 menor valor fica na 2 posio

n-1 comparaes n-2 comparaes 1 comparao

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

BT(n) = 0 WT(n) = n-1 n AT(n) = (n-1)/2 n


31

caso meio: (igualmente provvel a ocorrncia ou


no de um troca por passagem)
Algoritmos e Estruturas de Dados, 2007-2008 , Gladys Castillo

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

melhor caso: sequncia ordenada


faz apenas uma passagem, n-1 comparaes e 0 trocas

BC(n) = n-1 WC(n) n2 AC(n) n2

BT(n) = 0 WT(n) n2 AT(n) n2

pior caso: sequncia por ordem inversa caso meio: a anlise bastante complicada

faz n-1 passagem, n(n-1) / 2 comparaes e n(n-1)/2 trocas

prova-se que faz n(n-1)/4 comparaes e n(n-1)/4 trocas

Algoritmos e Estruturas de Dados,

2007-2008 , Gladys Castillo

32

16

Ordenao por Seleco vs. Bubble (I)


Seleco:
para uma sequncia de n elementos efectua sempre n-1 passagens ao fim de cada passagem apenas o primeiro elemento de cada subsequncia est colocado na posio correcta tem uma complexidade de comparao quadrtica e uma complexidade de trocas linear

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

Ordenao por Seleco vs. Bubble (II)


Ambos algoritmos so simples e tm uma grande aplicabilidade na prtica, sobretudo se a dimenso da sequncia no muito elevada O algoritmo Bubble mais indicado para ordenar sequncias que estejam parcialmente desordenadas
no caso mdio deve terminar mais rapidamente que o algoritmo por seleco pois so realizadas muito mais trocas de elementos numa nica passagem usando o mesmo n de comparaes. Como aps cada passagem possvel determinar se a sequncia est ou no ordenada, o n de passagens deve ser menor.

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

También podría gustarte