1 complexidade de algoritmos complexidade de pior caso complexidade de melhor caso de uso bem menos...

57
1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade de caso médio menos utilizada apesar de importante difícil conhecer a distribuição de probabilidades das diferentes entradas

Upload: internet

Post on 17-Apr-2015

149 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

1

Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso

de uso bem menos freqüente em algumas situações específicas

Complexidade de caso médio menos utilizada apesar de importante difícil conhecer a distribuição de

probabilidades das diferentes entradas

Page 2: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

2

Recursividade um procedimento recursivo é aquele

que contém uma ou mais chamadas a si mesmo

a todo procedimento recursivo corresponde um não recursivo

os programas recursivos são mais concisos

aparente relação direta com a prova por indução matemática

Page 3: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

3

Recursividade Cálculo de fatorialx! = se x <=0 1 senão x * (x-1)!

Implementação não recursivaint fatorial (int N){ int result = 1;

for (i=1; i<=N; i++) result = result * i;

return (result);}

Page 4: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

4

Recursividade Implementação recursiva

int fatorial (int N){

if (N<= 1)return(1);

elsereturn( N * fatorial(N-1));

}

Page 5: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

5

Recursividade X= fatorial (4)

return( 4* fatorial(3) ) return( 3* fatorial(2) ) return( 2* fatorial(1) ) return( 1 )

Page 6: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

6

Análise de Recursividade relação de recorrência – a função é definida em

termos dela própria, recursivamente substituição repetida

1) int fatorial (int N)– { – if (N<= 1)– return(1);– else– return( N * fatorial(N-1));1) }

Page 7: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

7

Análise de RecursividadeT(n)

tempo de processar o algoritmo para entrada n

número de passos ou operações dominantes

FatorialT(n) = 1, se n = 0

= T(n-1) + 1, se n > 0

mas quanto é T(n-1) ?

Page 8: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

8

T(n) - Fatorial

= (T(n-1)) + 1= (T(n-2) + 1) + 1= T(n-2) + 2= (T(n-3) + 1) + 2= T(n-3) + 3..... forma geral, T(n) = T(n-k) + k, 1 k n fazendo n = k, reduzimos a T(n) = n

Page 9: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

9

Maior elemento de uma lista

maior = a[0];for ( i =0; I < N; i++)

if (maior < a[i]) maior = a[i];return (maior);

Page 10: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

10

Resolva as recorrências

T(n) = 1, se n = 0 = 2 T(n-1) + 1, se n

>0 T(n) = 1 se n = 0

= T(n/2) + 1 se n>1 T(n) = 1 se n = 1

= 2T(n/2) - n se n > 1

Page 11: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

11

Qual melhor algoritmo?

Sejam A e B dois algoritmos que o resolvem o problema P, cujos tempos de execução são

TA(n) e TB(n)

comportamento assintótico – tamanho da entrada arbitrariamente grande caracterizado pela notação O (big O)

Page 12: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

12

A notação Sejam f(n) e h(n) funções reais não

negativas da variável inteira n 0 f(n) = O (h(n)) quando existir uma

constante c> 0 e um valor inteiro no tal que

n > no f(n) c.h(n)

Page 13: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

13

A notação f(n) = 8n + 128 é O (n2)?f(n) c.n2 ? Seja c =18n + 128 n2, então0 n2 – 8n – 1280 (n – 16)(n+8) n0 = 16

c =1, no = 16, f (n) c.n2 para todo n n0

Page 14: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

14

A notação Tempo (ou espaço) é contabilizado em

número de passos do algoritmo (unidade de armazenamento)

Análise do algoritmo determina uma função que depende do tamanho da entrada n.

10n3 + 4n -10 à medida que n aumenta, o termo cúbico

começa a dominar A constante do termo cúbico tem relativamente

a mesma importância que a velocidade da CPU

Page 15: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

15

A notação Complexidade

desprezar constantes aditivas ou multiplicativas

número de passos 3n será aproximado para n

interesse assintótico - termos de menor grau podem ser desprezados: n2 + n será aproximado para n2

6n3 + 4n - 9 será aproximado para n3

Page 16: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

16

A notação A função atua como um limite superior

assintótico da função f f = n2 -1 f = (n2) f = n2 -1 f = (n3) f = 403 f = (1) f = 5+2logn +3log2n f = (log2n) f = 5+2 log n +3log2n f = (n) f = 5.2n +5n10 f = (2n)

Page 17: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

17

A notação g(n), h(n) - funções reais positivas k - constante f1(n) = g(n) e f2(n) = h(n)

O(g+h) = O(g) + O(h) O(k*g) = k O(g) = O(g) f1(n) + f2(n) = O(max {g(n), h(n)}) f1(n) * f2(n) = O(g(n) * h(n))

Page 18: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

18

A notação O algoritmo de inversão de uma

seqüência: o número de passos se mantém o

mesmo para o mesmo valor de n variável independente é n as complexidades de pior, melhor e

pior casos são iguais

Page 19: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

19

A notação Para a inversão

efetua sempre n/2 passos então sua complexidade é (n)

Para a soma e o produto de matrizes n x n verifica-se complexidades (n2) e (n3) respectivamente

Page 20: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

20

A notação Para procedimentos recursivos pode-se

aplicar a seguinte técnica determina-se o número total de

chamadas ao procedimento recursivo calcula-se a complexidade de

execução de uma única chamada complexidade

número de chamadas complexidade de uma chamada

Page 21: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

21

A notação por outro lado, um outro exemplo:

duas matrizes A e B de dimensões n x n

um parâmetro x, com valores 0 ou 1 dependendo do valor de x

calcula a soma: se x =0 A + B ou o produto das matrizes: se x = 1 A

* B

Page 22: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

22

A notação entrada: n2+1 informações - tamanho

O(n2) se x =0 então complexidade: O(n2)

complexidade do melhor caso se x = 1 então complexidade: O(n3)

complexidade do pior caso

Page 23: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

23

Alguns conceitos T (n) = O (1) : constante T (n) = O (log log n) : super-rápido T (n) = O (log n) : logarítmico – muito bom T (n) = O (n) : linear – toda a entrada é visitada T (n) = O (n log n) : limite de muitos problemas T (n) = O (n2) : quadrático T (n) = O (nk) : polinomial no tamanho da entrada T (n) = O (kn), O (n!), O (nn) : exponencial – ruim!

Page 24: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

24

Estrutura de Dados Listas lineares

estática dinâmicas

Como manipulá-las: pilhas filas

Page 25: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

25

Listas Lineares fácil manipulação

agrupa informações referentes a um conjunto de elementos que se relacionam entre si

Uma lista linear ou tabela é um conjunto de n elementos L[0], L[1], ......, L[n-1] tais que

n>0, e L[0] é o primeiro elemento para 0 < k < n, L[k] é precedido por L[k-

1]

Page 26: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

26

Listas Lineares Operações: busca, inclusão e remoção

outras operações: alteração de um elemento na lista combinação de duas ou mais listas ordenação

Casos particulares: remoção e inserção apenas nas extremidades -

deque inserção/remoção em um único extremo - pilha inserções e um extremo e remoções no outro -

fila Alocação: seqüencial ou encadeada

Page 27: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

27

 Listas Sequenciais Alocação seqüencial de memória

endereço do (j+1) ésimo elemento se encontra a uma unidade de armazenamento j-ésimo elemento

Representação e acesso i-ésimo elemento: L[i]

Cada elemento pode ser formado por campos uma chave k[i] está associada ao nó L[i] a lista é dita classificada ou ordenado por chave

quando:

se i < j então k[i] precede k[j]

Page 28: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

28

Busca Seqüencial busca em uma lista seqüencial

ordenada pelas suas chaves não ordenada

Problema: busca pelo valor v em um conjunto de N elementos. O procedimento retorna o valor da posição da lista sequencial se encontrar e N, caso contrário

Page 29: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

29

Busca Seqüencial1

5

3

2

9

7

1

5

3

2

9

7

Page 30: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

30

Busca Seqüencial1

5

3

2

9

7

1

5

3

2

9

7

4

Se posição igual a N então não existe no array

N = número de elementos

Page 31: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

31

Busca Seqüencial Busca_Seqüencial_1 (v){ pos = 0; while ( (v != L [pos]) && (pos<N) ) pos++; return(pos);}Busca_Seqüencial_2 (v){ L[N] = v; pos = -1; do { pos = pos+1;

} while ( v != L [pos]) return(pos);}

Page 32: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

32

Busca Seqüencial  A complexidade do pior caso é O(n) para os

dois algoritmos O segundo é de execução mais rápida pois o

número de testes é menor a cada iteração

Problema: inserir um novo valor em uma lista seqüencial desordenada, caso não exista na respectiva lista

Page 33: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

33

Insere_seq (int v){ if (N == (maxN -1)) “overflow”; if (N != 0) {

pos = busca_sequencial (v);if ( pos == N) {

L[pos] = v; N++;}

} else { L[0] = v; N++;}}

Complexidade: O (n). Por que?

Inserção

Page 34: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

34

Remoção Problema: remover um valor v existente em

uma lista seqüencial desordenada com N elementos

Page 35: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

35

Remoção if (N != 0) {

indice = busca_sequencial (x);if (indice != N){

elemento = a[indice];for (i = indice; i < (N-1); i ++) L[i] = L[i + 1];N--;

} else “elemento não encontrado”;}else “underflow”

Complexidade: O (n) (?)

Page 36: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

36

Busca em uma Lista Ordenada Problema: buscar um valor v não existente

em uma lista seqüencial ordenada com N elementos

o tempo de busca pode ser reduzido significantemente devido a relação entre os elementos da lista, mesmo para um conjunto de elementos é grande

Page 37: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

37

Busca em uma Lista Ordenada

Busca_Seqüencial_Ord (v){

a[N].chave = v; do {

pos = pos+1; } while ( v < a [pos].chave);if (v != a[pos].chave)

return(pos); return(N);}

complexidade?

Page 38: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

38

Busca Binária Busca baseada em "dividir para conquistar"

divida um conjunto de elementos em duas partes determine a qual dessas duas partes a chave

pertence e se concentre nessa parte use índices do array para delimitar a parte sendo

trabalhada ou seja:

compare com a chave do elemento do meio se a chave comparada for menor, o elemento

está na parte esquerda da lista, se maior, na parte direita

aplique o método recursivamente

Page 39: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

39

Busca Bináriabusca_binaria (v){ e = 0; d = N-1; do {

pos= (e + d)/ 2; if (v < a[pos].chave) d = pos-1; else e=pos+1;

}while ((v!=a[pos].chave) && (e <= d)); if (v== a[pos].chave) return(pos); else return(N); }

Page 40: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

40

Busca Binária

Complexidade: suponha que n = 2k

1o passo: uma lista de n elementos2o passo: uma lista de n/2 elementos 3o passo: uma lista de n/4 elementos ..........k-ésimo passo: uma lista de n/2(k-1) elementos(k+1)-ésimo elemento: uma lista de 1 elemento

log n passos ---- O(log n)

2 5 6 7 9 15 16 23 25 40 52 55

Page 41: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

41

  Inserção em Lista Ordenada Problema: inserção de um valor v em uma lista

de elementos ordenada por chave, caso esse elemento não se encontre na lista

Passos: busca inserção na posição retornada

Complexidade: O(n). Por que? Não foi busca binária?

Obs.: remoção é equivalente

Page 42: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

42

Complexidade Média - Busca Binária

Comportamente médio do algoritmo de busca binária q - probabilidade de sucesso da busca (1-q) - probabilidade de não achar

L[0] L[1] L[2] .... L[n-1]

R[0] R[1] R[2] R[n-1] R[n]

Page 43: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

43

Complexidade Média - Busca Binária

complexidade média = número de passos da busca com sucesso + busca sem sucesso

busca com sucesso são n possibilidades de ter sucesso mesma probabilidade para qualquer elemento:

q/n busca sem sucesso

intervalo R[i] – L[i-1] < v < L[i] a probabilidade é a mesma para qualquer

intervalo = (1- q)/(n+1)

Page 44: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

44

Complexidade Média - Busca Binária

(q/n)k + [(1-q)/(n+1)] (k+1)

(n-q+2)/2

Page 45: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

45

Algoritmos de Ordenação Problema: encontrar um número de telefone em

uma lista telefônica simplificado pelo fato dos nomes estarem em ordem

alfabética e se estivesse sem uma ordem?

Problema: busca de um livro em uma biblioteca a cada livro é atribuída uma posição relativa a outros

e portanto pode ser recuperado em um tempo hábil

Page 46: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

46

Algoritmos de Ordenação

Terminologia básica seqüência de n ítens ou elementos

(registros) r[0], r[1], ……….r[n-1]

a chave a[i] está associada ao elemento r[i] usualmente a chave é um campo do registro os elementos estão classificados por pela chave

se i < j então a[i] precede a[j]

Page 47: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

47

Terminologia básica a ordenação tem por objetivo rearrumar as

chaves de forma que obedeçam a uma regra (ex.: ordem numérica ou alfabética)

se os elementos representam registros de um arquivo, sendo representado por uma lista sequencial em memória principal a ordenação é interna

se o arquivo estiver em memória secundária a ordenação é externa

Page 48: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

48

  Terminologia básica a ordenação é estável se preserva a ordem

relativa das chaves iguais (senão, instável)

os algoritmos podem operar sobre o elemento ou sobre uma tabela de ponteiros registro é muito grande: ordenação indireta os registros não são rearrumados e sim os

índices as chaves tanto podem ficar armazenadas com

os registros ou com os ponteiros

Page 49: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

49

Ordenação por Seleção Um dos algoritmos de sort mais simples:

ache primeiro o menor elemento da lista e troque sua posição com o primeiro elemento

ache o segundo menor elemento e troque sua posição com o segundo elemento

continue até que toda lista esteja ordenada para cada i de 0 a n-2, troca o menor elemento da

sub-lista que vai de i a N-1 com a[i]

Page 50: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

50

9 2 6 3 5 7inicial

2 9 6 3 5 7

2 3 6 9 5 7

2 3 5 9 6 7

2 3 5 6 9 7

2 3 5 6 7 9

Cada passo acha o menor e o coloca em sua posição

Ordenação por Seleção

Page 51: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

51

Sort por SeleçãoOrd_Seleção(){ int t, i, j,min; for (i=0;i< n-2; i++){ min = i; for (j=i+1; i< n-1; i++)

if (a[j]<a[min]) min = j;/* troca */

t = a[min]; a[min]=a[i]; a[i] = t; } } complexidad

e?

Page 52: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

52

Bubble Sort percorrer a lista trocando elementos

adjacentes, se necessário quando nenhuma troca for efetuada ao

percorrer toda a lista está classificada

Page 53: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

53

Bubble Sort

9 2 6 3 5 7

2 9 6 3 5 7

2 6 9 3 5 7

2 6 3 9 5 7

2 6 3 5 9 7

2 6 3 5 7 9

Page 54: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

54

Bubble Sort

2 6 3 5 7 9 2 3 5 6 7 9

2 3 5 6 7 92 6 3 5 7 9

2 3 6 5 7 9

Page 55: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

55

Bubble Sort

2 3 5 6 7 9

2 3 5 6 7 9

2 3 5 6 7 9

Não ocorreram trocas

Page 56: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

56

Bubble Sort(){

int i, j, t, trocas; for (i = n-1; i>0; i--) {

trocas = 0; for (j = 1; j <= i; j++){

if (a[j-1] > a[j]){ /* troca */

t = a[j-1]; a[j-1] = a[j]; a[j] = t; trocas++;

} }

if (trocas == 0) break; }

}complexidade?

Page 57: 1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade

57

Pensar escreva um algoritmo de merge de duas

listas sequenciais ordenadas, analisando sua complexidade

escreva um algoritmo que some dois polinômios, sendo estes, representados por listas sequenciais. especifique as listas a complexidade