Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de...

25
Conceitos Fundamentais de Algoritmia Estruturas de Dados e Algoritmos Rui Camacho Programa¸ ao 2

Transcript of Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de...

Page 1: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Estruturas de Dadose

Algoritmos

Rui Camacho Programacao 2

Page 2: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Algoritmos — conceitos basicos

Algoritmo:Sequencia de passos simples, clara-mente especificada, para resolverum determinado problema.Uma receita.

Rui Camacho Programacao 2

Page 3: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Problemas e Algoritmos — exemplos

Problema 1:Dada uma sequencia de N numeros, indicar o k-esimo maior. Designado por problema da seleccao(selection problem)

Rui Camacho Programacao 2

Page 4: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Solucao “imediata”

Solucao 1:Ler os N numeros guardando-os num vector. Or-denar o vector por ordem decrescente usando porexemplo o bubblesort. Devolver o numero na k-esima posicao do vector.

Rui Camacho Programacao 2

Page 5: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Melhorando a Solucao “imediata”

Solucao 2:Ler os k primeiros numeros guardando-os num vec-tor de tamanho k. Ordenar o vector por ordemdecrescente. Ler os restantes numeros e inserirordenadamente no vector so se for maior que onumero na ultima posicao. Se inserir um elementodeitar fora o ultimo. No final devolver o ultimoelemento do vector.

Rui Camacho Programacao 2

Page 6: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Problemas e Solucoes

I Para uma simulacao de 1 milhao de numeros geradosaleatoreamente e k = 500 mil, os 2 algoritmos demorariamalguns dias a dar a resposta. O que nao e aceitavel.

I Existe uma solucao 3 (mais elaborada) que demora algunssegundos.

I Conclusao: Solucoes simples, faceis de implementar nemsempre sao as mais eficientes e ate execuıveis!!

Rui Camacho Programacao 2

Page 7: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Analise de Algoritmos

I Tempo e Espaco

I Exemplos

I Notacao O()

Rui Camacho Programacao 2

Page 8: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Analise de Algoritmos

I Como obter a solucao de um problema?I Especificacao do problema: descricao da relacao entre os

valores de entrada e os de saıdaI Algoritmo: procedimento computacional que toma os valores

de entrada e os transforma nos de saıda

I Analise de algoritmosI Recursos necessarios para executar o procedimento respectivo

I Tempo de processamentoI Espaco de armazenamento

I Avaliacao independente da maquinaI Baseada no crescimento dos recursos com a entrada

Rui Camacho Programacao 2

Page 9: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Analise de AlgoritmosConsideracoes gerais

I Geralmente compromisso entre Espaco ocupado/Tempo deexecucaoex: se quero mais rapido uso estruturas de dados auxiliares

I Estruturas de Dados e Algoritmos essencialmente paraproblemas complexos. Para problemas simples qq serveex: espaco de solucoes pequeno uso “gerar e testar”

I Perspectiva pragmatica:se existe feito entao use (referindo a fonte ;-))senao se existe feito parecido entao adapte (referindo a fonte ;-))

senao desenvolva

I Adopte sempre a solucao mais simples. Nao complicardesnecessariamente

Rui Camacho Programacao 2

Page 10: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Crescimento de funcoes

I Comparar crescimento

I Comparacao de funcoes em pontosparticulares: muito dependente doscoeficientes

I Comparacao relevante: taxas decrescimento

I Avaliar taxa de crescimento

I em funcoes com varios termos ocrescimento e determinado pelotermo de crescimento mais rapido

I Coeficientes constantes influenciamo andamento inicial

Funcao Designacao

c Constantelog N Logaritmolog2 N Logaritmo

QuadradoN LinearN log N N log NN2 QuadraticaN3 Cubica2N Exponencial

Rui Camacho Programacao 2

Page 11: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Notacao O(*)

Notacao para o crescimento relativo de funcoes

I T(n) = O(f(n)) se existem constantes c e n’ tais que T(n) ≤ c f(n)para n ≥ n’

I T(n) = Ω(f(n)) se existem constantes c e n’ tais que T(n) ≥ c f(n)para n ≥ n’

I T(n) = Θ(f(n)) se e so se T(n) = O(f(n)) e T(n) = Ω(f(n))

I T(n) = o(f(n)) se T(n) = O(f(n)) e T(n) 6= Θ(f(n))

Rui Camacho Programacao 2

Page 12: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Crescimento de funcao composta

Regras

1. se T1(n) = O( f(n) ) e T2(n) = O( g(n) )

I T1(n) + T2(n) = max( O( f(n) ), O( g(n) ) )I T1(n) * T2(n) = O( f(n) * g(n) )

2. se T(x) e um polinomio de grau n, T(x) = Θ (xn)

3. logk n = O(n), para qualquer k (logaritmos crescem devagar)

I nao usar constantes ou termos de ordem inferior dentro de um O(*)

I crescimento relativo pode ser determinado com limn→∞f (n)g(n)

Rui Camacho Programacao 2

Page 13: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima

Problema:Dada uma sequencia A1, A2, . . . , AN denumeros inteiros (possivelmente com neg-ativos), encontrar o valor maximo para

j∑k=i

Ak

Exemplo:Dada uma sequencia: -2, 11, -4, 13, -5, -2Resposta: 20 (A2 a A4)

Rui Camacho Programacao 2

Page 14: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima

(valores “pequenos” de N do livro do Mark Weiss)

Rui Camacho Programacao 2

Page 15: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima

(valores “grandes” de N do livro do Mark Weiss)

Rui Camacho Programacao 2

Page 16: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima – cubico

/* Algoritmo cubico para a subsequencia de soma maxima.

* seqStart e seqEnd representam a melhor subsequencia ate ao momento. */

int maxSubSum1(int a[N])int maxSum = 0;

for( int i = 0; i < N; i++ )for( int j = i; j < N; j++)

int thisSum = 0;for( int k = i; k <= j; k++ )

thisSum += a[k];

if(thisSum > maxSum)maxSum = thisSum;seqStart = i;seqEnd = j;

return maxSum;

“Data Structures & Algorithm Analysis in Java”, Weiss

*

Rui Camacho Programacao 2

Page 17: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Numero de operacoes

I Operacoes no ciclo interior

I inicializacao k = iI teste k <= jI incremento da soma

thisSum += a[k]I incremento k++

I Operacoes dominantes

I teste e incrementosI inicializacao

Operacoes de incremento da soma:(N - tamanho do vector)

Numero de ternos (i, j, k) com1 ≤ i ≤ j ≤ k ≤ Ne N (N-1) (N-2) /6logo O(N3) para o algoritmo

Ciclos exteriores tem efeito multi-plicativo sobre operacoes no ciclointerior

O(N) operacoes em cada ciclo encaix-ado logo O(N3) para o algoritmo

Rui Camacho Programacao 2

Page 18: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima– quadratico

/**

* Quadratic maximum contiguous subsequence sum algorithm.

* seqStart and seqEnd represent the actual best sequence.

*/

public static int maxSubSum2(int [] a)int maxSum = 0;

for( int i = 0; i < N; i++)int thisSum = 0;for( int j = i; j < N; j++)

thisSum += a[ j ];

if(thisSum > maxSum)maxSum = thisSum;seqStart = i;seqEnd = j;

return maxSum;

“Data Structures & Algorithm Analysis in Java”, Weiss

*

Rui Camacho Programacao 2

Page 19: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Novos Algoritmos

I Quadratico

I Observacao: soma dassubsequencias no ciclointerior e repetida

I Cada soma pode serobtida a partir daanterior

I o ciclo interiorreduz-se a 1operacao - tempoconstante

I passa-se de O(N3)para O(N2)

I Linear

I Requer melhor uso das caracterısticasdo problema

I Observacoes

I Se Ai,j e uma subsequencia comcusto negativo, Ai,q com q>j naoe a subsequencia maxima

I as subsequencias contıguas damaxima tem custo negativo

I quando se encontra umasubsequencia de custo negativopode recomecar-se a pesquisa noelemento seguinte

Rui Camacho Programacao 2

Page 20: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima – linear

/**

* Linear-time maximum contiguous subsequence sum algorithm.

* seqStart and seqEnd represent the actual best sequence.

*/

public static int maxSubSum3(int [] a)int maxSum = 0;int thisSum = 0;

for( int i = 0, j = 0; j < N; j++)thisSum += a[j];

if(thisSum > maxSum)maxSum = thisSum;seqStart = i;seqEnd = j;

else if(thisSum < 0)

i = j + 1;thisSum = 0;

return maxSum;

“Data Structures & Algorithm Analysis in Java”, Weiss

Rui Camacho Programacao 2

Page 21: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima – recursivo

/**

* Recursive maximum contiguous subsequence sum algorithm.

* Finds maximum sum in subarray spanning a[left..right].

* Does not attempt to maintain actual best sequence.

*/

private static int maxSumRec(int [] a, int left, int right)int maxLeftBorderSum = 0, maxRightBorderSum = 0;int leftBorderSum = 0, rightBorderSum = 0;int center = ( left + right ) / 2;

if(left == right) // Base casereturn a[left] > 0 ? a[left] : 0;

int maxLeftSum = maxSumRec(a, left, center);int maxRightSum = maxSumRec(a, center + 1, right);

Rui Camacho Programacao 2

Page 22: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima – recursivo (cont.)

for(int i = center; i >= left; i–) leftBorderSum += a[ i ];

if(leftBorderSum > maxLeftBorderSum)maxLeftBorderSum = leftBorderSum;

for(int i = center + 1; i <= right; i++)rightBorderSum += a[i];

if(rightBorderSum > maxRightBorderSum)maxRightBorderSum = rightBorderSum;

return max3(maxLeftSum, maxRightSum,maxLeftBorderSum + maxRightBorderSum);

“Data Structures & Algorithm Analysis in Java”, Weiss

Rui Camacho Programacao 2

Page 23: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima– recursivo (metodos auxiliares)–

/* Return maximum of three integers. */

private static int max3(int a, int b, int c)return a > b ? a > c ? a : c : b > c ? b : c;

/* Driver for divide-and-conquer maximum contiguous

* subsequence sum algorithm. */

public static int maxSubSum4(int [] a)return maxSumRec(a, 0, N - 1);

“Data Structures & Algorithm Analysis in Java”, Weiss

Rui Camacho Programacao 2

Page 24: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Subsequencia de Soma Maxima– recursivo (teste)–

public final class MaxSumTeststatic private int seqStart = 0;static private int seqEnd = 0;

public static void main(String [] args)int a[] = 4, -3, 5, -2, -1, 2, 6, -2;int maxSum;

maxSum = maxSubSum1(a);System.out.println(”Max sum is ” +maxSum+ ”; it goes”

+ ” from ” + seqStart + ” to ” +seqEnd);maxSum = maxSubSum2(a);System.out.println(”Max sum is ” +maxSum+ ”; it goes”

+” from ” + seqStart + ” to ” + seqEnd );maxSum = maxSubSum3(a);System.out.println(”Max sum is ” + maxSum + ”; it goes”

+” from ” + seqStart + ” to ” + seqEnd );maxSum = maxSubSum4(a);System.out.println(”Max sum is ” + maxSum);

Rui Camacho Programacao 2

Page 25: Estruturas de Dados Algoritmosprog2/docs/analiseAlgoritmos.pdf · Conceitos Fundamentais de Algoritmia Problemas e Solu˘c~oes I Para uma simula˘c~ao de 1 milh~ao de numeros gerados

Conceitos Fundamentais de Algoritmia

Eficiencia de Estruturas de Dados

Acesso Comentario

Pilha Apenas ao elemento mais recente Muito rapidoO(1)

Fila Apenas ao elemento menos recente Muito rapidoO(1)

Lista Ligada Qualquer item O(N)

Arvore de Qualquer item por nome ou ordem Caso medio; em arvoresPesquisa O(log N) especiais e pior caso

Tabela de Qualquer item por nome Quase garantidoDispersao O(1)

Fila de Acesso ao mınimo: O(1) Insercao: O(1) caso medio,Prioridade Apagar mınimo: O(log N) O(log N) pior caso

Rui Camacho Programacao 2