1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos...

Preview:

Citation preview

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

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

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

4

Recursividade Implementação recursiva

int fatorial (int N){

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

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

}

5

Recursividade X= fatorial (4)

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

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

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) ?

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

9

Maior elemento de uma lista

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

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

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

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)

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)

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

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

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

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)

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))

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

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

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

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

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

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!

24

Estrutura de Dados Listas lineares

estática dinâmicas

Como manipulá-las: pilhas filas

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]

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

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]

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

29

Busca Seqüencial1

5

3

2

9

7

1

5

3

2

9

7

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

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

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

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

34

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

uma lista seqüencial desordenada com N elementos

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) (?)

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

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?

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

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

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

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

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]

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)

44

Complexidade Média - Busca Binária

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

(n-q+2)/2

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

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]

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

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

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]

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

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?

52

Bubble Sort percorrer a lista trocando elementos

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

percorrer toda a lista está classificada

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

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

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

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?

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

Recommended