A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Prof. Alessandro Gonçalves

Apresentações semelhantes


Apresentação em tema: "Prof. Alessandro Gonçalves"— Transcrição da apresentação:

1 Prof. Alessandro Gonçalves
UNDB ESTRUTURAS DE DADOS Prof. Alessandro Gonçalves 1 1 1

2 Complexidade de Algoritmos
Conceituação Complexidade no pior caso, melhor caso e caso médio Exemplos 2 2 2

3 Complexidade de Algoritmos
Avaliação de tempo na história: 1) Algoritmos primitivos 2) A avaliação do tempo na matemática. Ex: tábuas de Log 3) O aparecimento do computador O tempo como fator primordial 3 3 3

4 Complexidade de Algoritmos
Avaliação de espaço na história: 1) No início era fundamental Ex: quanto de memória tenho ? Eniac: 200 bits 2) Hoje já não é tão importante Era da fartura 4 4 4

5 Complexidade de Algoritmos
Dois métodos para avaliar o tempo: Empírico e Analítico Empírico 1) Medição do tempo de execução do algoritmo 2) Dependentes do hardware (memória, computador...) e software (compilador, linguagem...) 3) Permitem tratamento estatístico 4) Mais simples de ser implementado 5 5 5

6 Complexidade de Algoritmos
Dois métodos para avaliar o tempo: Empírico e Analítico Analítico 1) Expressões matemáticas para determinar o tempo 2) Independentes do hardware (memória, computador...) e software (compilador, linguagem...) 3) Permitem tratamento estatístico 4) Mais complexo de ser implantado 6 6 6

7 Complexidade de Algoritmos
Implantação do método Analítico 1) Considera-se grande quantidade de dados 2) Valores assintóticos 3) Desconsiderar constantes aditivas e multiplicativas Ex: 2*n² + 10x + 5 é equivalente a n² + x. As duas expressões acima são da ordem n² 4) Baseado em uma variável independente, na entrada do algoritmo(caixa preta) 5) Mais complexo de ser implantado 7 7 7

8 Complexidade de Algoritmos
Definindo uma expressão matemática 1) Divide-se o algoritmo em passos 2) Cada passo é composto de número fixo de operações básicas 3) A operação básica de maior frequência é conhecida como “operação dominante”. 4) O número de passos do algoritmo é a frequência da operação dominante. 5) Em algoritmos de ordenação, geralmente a operação dominante é a comparação. 8 8 8

9 Complexidade de Algoritmos
Exemplo em C – inverte.c Resumo: void inverte() { int x, temp; for (x = 0; x<5; x++) { temp = vet[x]; vet[x] = vet[9-x]; vet[9-x] = temp; } Cada passo corresponde a troca entre dois elementos Variável independente: número de elementos (n) Número de passos: número de execuções do bloco 9 9 9

10 Soma de matrizes (para a turma resolver)
Complexidade de Algoritmos Soma de matrizes (para a turma resolver) Algoritmo: Variável independente ? Número de passos ? Para i = 1 até n faça Para j = 1 até n faça Cij = Aij + Bij Fim Para J Fim Para i Número de linhas da matriz 10 10 10

11 Multiplicação de matrizes (para a turma resolver)
Complexidade de Algoritmos Multiplicação de matrizes (para a turma resolver) 5 2 Algoritmo: Variável independente ? Número de passos ? Para i = 1 até n faça Para j = 1 até n faça Dij = 0 Para k = 1 até n faça Dij = Dij + Aik * Bkj ... Número de colunas da matriz A 11 11 11

12 Complexidade de Algoritmos
Definindo uma expressão matemática Nos exemplos anteriores, o número de passos dependia sempre do tamanho da entrada, não do seu valor. Mas isso nem sempre ocorre. Em geral, o número de passos depende do valor da entrada. Considere: Duas matrizes A e B e uma variável X. Se X = 0, faça C = A+B Se X <>0, faça D = A.B Número de passos ? N² ou N³ 12 12 12

13 Complexidade de Algoritmos
Definindo uma expressão matemática para Complexidade de Tempo Ideal seria sempre conhecer o número de passos, conforme a entrada Difícil de ser atingido na prática Alternativa: determinar o número de passos para entradas específicas e representativas 13 13 13

14 Complexidade de Algoritmos
Determinando entradas representativas A = Algoritmo E = {E1, E2..., En} T1 = número de passos de A, quando a entrada for Ei 14 14 14

15 Complexidade de Algoritmos
Complexidade do Pior Caso Número de passos da entrada mais desfavorável A mais utilizada Quase sempre é relevante(Ex: aplicações de segurança) Quando falo que um algoritmo tem uma Complexidade “X”, estamos falando da Complexidade do Pior Caso Complexidade do Melhor Caso Número de passos da entrada mais favorável Pouco utilizada Pouco relevante Aplicações específicas Complexidade do Caso Médio Número de passos da entrada média Relevante Tratamento matemático e geralmente, complexo pois depende da probabilidade 15 15 15

16 Complexidade de Algoritmos
q = 0.5 ou 50% 16 16 16

17 Complexidade de Algoritmos
Exercícios (20 minutos) 1) Calcule a complexidade do algoritmo para calcular n! 2) Sejam duas matrizes: (aij) e (bkj) tais que: 1 < i < n; 1 <= k<= n; 1<= j <= m, escrever os algoritmos para fazer C = A + B D = A * B Determinar as complexidades 17 17 17

18 Complexidade de Algoritmos
Solução dos exercícios Soma := 0 Para i = n até 1 passo -2 faça Soma := Soma + n*(n-1); Fim Para Complexidade: n 18 18 18

19 Complexidade de Algoritmos
Solução dos exercícios Algoritmo: soma de matrizes Para i := 1 até n faça Para j := 1 até p faça Cij := aij + bij Complexidade = n.p 19 19 19

20 Complexidade de Algoritmos
Solução dos exercícios Algoritmo: multiplicação de matrizes Para i := 1 até n faça (linhas da matriz A) Para j := 1 até p faça (colunas da matriz B) Dij = 0 Para k := 1 até p faça Dij := Dij + aik * bkj Complexidade = n.p.k 20 20 20

21 Complexidade de Algoritmos
Análise de algoritmo Demo (A,n) { Entrada: um array A[] com n elementos inteiros Saída: o maior elemento em A[]; Int c; C = A[0]; For (i = 1; i < n; i ++) { If (c < A[i]) c = A[i]; } Return c; Quantas operações primitivas são necessárias para a execução ? 21 21 21

22 Complexidade de Algoritmos
Análise de algoritmo 1) inicializar a variável array como A[0]. Duas operações primitivas 2) o contador i é inicializado com o valor 1 no início do laço for. Corresponde a uma operação primitiva 3) a condição i < n é verificada antes de entrar no laço for. Uma operação primitiva de comparar dois números; 4) o contador i é inicializado em 0 e incrementado em 1 no fim de cada iteração do laço, a comparação i < n é feita n vezes, assim a condição contribui com n unidades para a contagem 22 22 22

23 Complexidade de Algoritmos
Análise de algoritmo 5) o laço for é executado n-1 vezes. A cada iteração, A[i] é comparado com c (duas operações primitivas indexação e atribuição). O contador i é incrementado. Duas operações primitivas, soma e atribuição. Assim, a cada iteração do laço quatro ou seis operações são realizadas, dependendo se A[i] < c ou A[i] > c. Desta forma, o corpo do laço contribui para a contagem variando de 4(n-1) ou 6(n-1) 6) retorna o valor da variável que corresponde a uma operação primitiva e é executada apenas uma vez. Resumo Melhor caso: n + 4(n-1) + 1 = 5n Pior caso: n + 6(n-1) + 1 = 7n - 2 23 23 23

24 Complexidade de Algoritmos
Notação O (Omicron) Refere-se ao pior caso Melhor caso: n + 4(n-1) + 1 = 5n => n Pior caso: n + 6(n-1) + 1 = 7n – 2 => n O(n) = f(x) = 7n -2 Para calcularmos O, consideramos sempre o valor mais relevante, em termos de “n” ou outras variáveis envolvidas 24 24 24

25 Complexidade de Algoritmos
Exercícios 1) n³ -1 2) n² + 2.log n n n 3) 3.n + 5.2 n n - 1 4) (n-1) + n n n² 5) 6) n 7) 5.n n! 8) 3n + 7m + 2 9) 5n² + 9m + 4 10) 3n + 5m + n.m 25 25 25

26 Complexidade de Algoritmos
Respostas 1) O(n³) 2) O(n²) n 3) O(n) 4) O(n) 5) O(2) 6) O(1) 7) O(n!) 8) O(n + m) 9) O(n² + m) 10) O(n.m) 26 26 26

27 Complexidade de Algoritmos
Escalas N log2n n n.log2n 2n n! 1 2 10 3.32 33 100 1000 1024 3x10 6 6.64 664 10.000 1,28 x 1030 3x10157 9.97 9970 109 1,072 x 1031 3x102567 n! 2n n.log2n O(n) n log2n n 27 27 27

28 Complexidade de Algoritmos
Propriedades da notação O O(g + h) = O(g) + O(h) O(g . h) = O(g) . O(h) O(k . g) = k . O(g) = O(g) 28 28 28

29 Programa Torre de Hanoi em C
Complexidade de Algoritmos Video Torre de Hanoi Programa Torre de Hanoi em C Para solucionar um Hanói de 64 discos, são necessários movimentos 29 29 29

30 Complexidade de Algoritmos
Propriedades da notação O Cota superior – menor complexidade de um algoritmo conhecido Nos exemplos anteriores, a complexidade de multiplicação de matrizes era O(n³) O algoritmo de Strassen diminuiu a complexidade para O(n2,807) O algoritmo de Coppersmith e Winograd melhoraram para O (n2,376) O(n³) O(n2,807) O(n³) O (n2,376) O(n2,807) O(n³) 30 30 30

31 Complexidade de Algoritmos
Notação Ɵ (Teta) Refere-se ao caso médio Este é o caso que é o mais difícil de ser determinado, pois, necessita de análise estatística e em conseqüência de muitos testes, contudo é muito utilizado, pois é o que representa mais corretamente a complexidade do algoritmo. Exemplo: Procurar uma palavra em um dicionário. Pode-se iniciar a busca de uma palavra na metade do dicionário. Imediatamente se sabe se foi encontrada a palavra ou, no caso contrário, em qual das duas metades deve se repetir o processo (é um processo recursivo) até se chegar ao resultado. Em cada busca (ou sub-busca), o problema (as páginas em que a palavra pode estar) vão se reduzindo à metade, o que corresponde com a função logarítmica. Este procedimento de busca (conhecido como busca binária) em uma estrutura ordenada têm complexidade logarítmica. Ɵ(log2n) 31 31 31

32 Complexidade de Algoritmos
Notação Ω (ômega) Refere-se ao melhor caso Pouco utilizado porque sempre precisamos saber como o algoritmo se comporta em situações difíceis (pior caso). Exemplo: Exemplo 1: Em uma lista telefônica queremos encontrar um número, assume-se que a complexidade do caso melhor é Ω (1), pois está pressupondo-se o número desejado está na primeira posição. Exemplo 2: Extrair qualquer elemento de um vetor. A indexação em um vetor ou array, leva o mesmo tempo seja qual for o índice que se queira buscar. Portanto é uma operação de complexidade constante Ω (1). 32 32 32

33 Complexidade de Algoritmos
Conclusão Nas complexidades algorítmicas temos: Ω( ) <= θ( ) <= O() Algoritmos ótimos podem ser obtidos de duas formas: 1) melhoramento interno do código OU 2) comparação dos algoritmos entre si, escolhendo o de menor complexidade. exemplo 33 33 33

34 Complexidade de Algoritmos
34 34 34

35 Árvores Definição São estruturas de dados com uma relação hierárquica entre os dados que a compõem. Muito utilizadas em banco de dados, organização de dados para a pesquisa... 35 35 35

36 Árvores A Raiz B C D Nós E F G H I J Folhas Nó(nodo) Grau Nível A 3 B
B 1 C 2 36 36 36

37 Árvores A Raiz B C C D Nós E F F G G H I J Folhas SUBÁRVORE 37 37 37

38 Árvore BINÁRIA Para ser binária: cada nó <= 2 graus (filhos)
Raiz B C Nós D E F Folhas Para ser binária: cada nó <= 2 graus (filhos) Se a árvore binária tiver m nós no nível l, terá no máximo 2m nós no nível l+1 altura – tamanho do percurso mais distante da raiz até a folha (nível máximo da folha). Uma árvore com somente um nó, h=1 38 38 38

39 Árvore BINÁRIA Para ser binária: cada nó <= 2 graus (filhos)
Raiz B C Nós D E F Folhas Para ser binária: cada nó <= 2 graus (filhos) 1A; 1.1B; 1.1.1D; 1.1.2E; 1.2 C; F OU (A(B(D)(E))(C(F))) 39 39 39

40 Árvore (que NÃO É BINÁRIA)
Exercício 1 A Raiz B C D Nós E F G H Folhas Represente a árvore acima na notação 1, 1.1, 40 40 40

41 Árvore BINÁRIA Desenhe a árvore binária representada por:
Exercício 2 Desenhe a árvore binária representada por: 1A; 1.1B; 1.1.1E; F A Arvore DEGENERADA hmax = nós Árvore de altura máxima B E F 41 41 41

42 Árvore BINÁRIA - tipos Estritamente binária – todo nó que não é folha tem uma subárvore esquerda e direita não vazias (todo nó tem 0 ou 2 filhos) Binária completa – se N é um nó com subárvores vazias, estas devem estar no último ou penúltimo nível Binária cheia – se um nó tem subárvores vazias, este nó está no último nível 42 42 42

43 Árvore BINÁRIA - tipos Exercícios – quais os tipos das árvores abaixo ? Estritamente binária + binária completa + binária cheia Estritamente binária + binária completa 43 43 43

44 Árvore BINÁRIA de busca (ABB)
Árvores ordenadas, facilitando a busca de dados. Os elementos menores que o nó estão à esquerda. Os maiores ou iguais, à direita EX: (M, C, A, A, C, V, P , M) M C V A C P A M 44 44 44

45 Árvore BINÁRIA de busca (ABB)
Características 1) Todos os itens da subárvore esquerda são menores do que a raiz 2) Todos os itens da subárvore direita são maiores ou iguais do que a raiz 3) Cada subárvore é também uma árvore binária 45 45 45

46 Árvore BINÁRIA de busca (ABB)
Exercício A partir da sequência, construa a sua ABB: (14,15,4,9,7,18,3,5,16,14,20,17,9,14,5) 14 4 15 3 9 14 18 x 7 9 16 20 5 17 4 5 46 46 46

47 Árvore BINÁRIA de busca (ABB)
Operações básicas 1) Criar árvore 2) Inserção de nó 3) remoção 4) Caminhamento 5) Finalizar (destruir) árvore 47 47 47

48 Árvore BINÁRIA de busca (ABB)
Operações básicas - inserção Antes de implementar deve-se perguntar: itens duplicados são aceitos ? Depois, através de vetores ou lista encadeada, percorre-se a estrutura. Se o nó a ser inserido for menor que o nó atual, procura na sua subárvore esquerda. Se for maior (ou igual), procura na subárvore da direita. Faça isto iterativamente. Ao achar uma subárvore vazia, inclua nesta posição. 48 48 48

49 Árvore BINÁRIA de busca (ABB)
Operações básicas - remoção É uma operação mais complexa porque existem mais considerações a ser observadas. Na raiz, o nó a ser procurado é menor que a raiz ? Procure na subárvore da esquerda. Se não, procure na subárvore da direita. Ao encontrar, irá remover considerando: 1) O nó não possui filhos. Remova-o e o nó que apontava para ele apontará para vazio (null) 2) O nó possui filhos. O nó anterior passa a apontar para o(s) nós que o nó removido apontava. Alternativa: no lugar da remoção física, considerar o nó como inativo, marcando este status nele. Ao buscarmos, desprezamos os nós inativos. Caso seja acrescentado novamente, basta mudar seu status 49 49 49

50 Árvore BINÁRIA de busca (ABB)
Operações básicas – caminhamento em árvore binária de busca É a forma em que se percorre os nós. Podem variar, dependendo do propósito da árvore. Gera uma lista com os nós resultantes. Existem quatro caminhamentos: 1) Prefixado – visita a raiz, percorre a subárvore da esquerda, percorre a subárvore da direita e assim sucessivamente para todas as subárvores da árvore (profundidade) 2) Central ou infixa – percorre a subárvore da esquerda completa, a partir das folhas , visita raiz, percorre a subárvore da direita e continua enquanto houver subárvores para leitura 3) Pós-ordem ou pós-fixa: percorre a subárvore da esquerda, percorre a subárvore da direita e por último as partir das folhas, visita a raiz 4) Por nível: percorre todos os nós de um nível, da esquerda para a direita 50 50 50

51 Árvore BINÁRIA de busca (ABB)
Caminhamentos A Prefixada: A, B, G, C, D, E, F Central: G, B, A, E, F, D, C B Pós-fixada: G, F, E, D, C, B, A Nível: A, B, G, C, D, E F G C D E F 51 51 51

52 Árvore BINÁRIA de busca (ABB)
Aplicação da pós-fixada: Em calculadoras 5 + (10*2) Primeiramnente, todos os operandos Depois, os operadores: * + + 5 * 10 2 52 52 52

53 Árvore binária balanceada AVL
Proposta na década de 60 pelos russo G.M. Adelson-Velskki e E.M.Landis Uma árvore AVL é uma árvore binária de busca (ABB) construída de tal modo que a altura (h) de sua subárvore direita difere da altura da subárvore esquerda de no máximo 1 B A árvore binária ao lado está balanceada ? G C D E 53 53 53

54 Árvore binária balanceada AVL
Exercício: a) se adicionar o item “9”, a árvore fica balanceada ? b) se adicionar o item”5”, a árvore fica balanceada ? Sim Não 54 54 54

55 Árvore binária balanceada AVL
A operação de inserção em uma árvore AVL se torna mais complicada do que em uma árvore binária não balanceada Dada uma raiz r com subárvores L (left) e R (right), e supondo que a inserção deve ser feita na sub-árvore da esquerda. Ex: item “5” Podemos distriguir 3 casos: Se hL = hR, então L e R ficam com alturas diferentes mas continuam balanceadas. Se hL < hR, então L e R ficam com alturas iguais e balanceamento foi melhorado. Se hL > hR, então L fica ainda maior e balanceamento foi violado. 55 55 55

56 Prof. Alessandro Gonçalves
UNDB ESTRUTURAS DE DADOS Prof. Alessandro Gonçalves 56 56 56


Carregar ppt "Prof. Alessandro Gonçalves"

Apresentações semelhantes


Anúncios Google