Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Documentos relacionados
Teoria da Complexidade Computacional

Filas de Prioridades Letícia Rodrigues Bueno

Quicksort Letícia Rodrigues Bueno

Complexidade de Algoritmos

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

Teoria da Computação Aula 9 Noções de Complexidade

Projeto e Análise de Algoritmos

1 a Lista de Exercícios

ANÁLISE DE ALGORITMOS: PARTE 3

Introdução à Ciência da Computação II

Teoria da Complexidade Computacional

SCC-501 Introdução à Ciência de Computação II

Projeto e Análise de Algoritmos

Aula 03: Análise de algoritmos melhor caso, pior caso e caso médio

Complexidade de Algoritmos

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Complexidade Assintótica

CT-234. Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

SCC-201 Introdução à Ciência de Computação II

Complexidade de Tempo e Espaço

Análise de Complexidade de Algoritmos. mario alexandre gazziro

Teoria da Computação. Aula 3 Comportamento Assintótico 5COP096. Aula 3 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Algoritmos de Ordenação

Classes, Herança e Interfaces

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

7. Introdução à Complexidade de Algoritmos

Análise de algoritmos. Parte I

Análise e Projeto de Algoritmos

André Vignatti DINF- UFPR

Aula 1. Teoria da Computação III

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

Projeto e Análise de Algoritmos

Área que visa determinar a complexidade (custo) de um algoritmo, com isso é possível:

MCTA028 Programação Estruturada Aula 20 Exercícios de custos de um algoritmo

Análise de Algoritmos Estrutura de Dados II

Complexidade de algoritmos Notação Big-O

Introdução à Ciência da Computação II

Módulo 7. Complexidade de Algoritmos. Algoritmos e Estruturas de Dados II C++ Rone Ilídio

7. Introdução à Complexidade de Algoritmos

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

Solução de Recorrências

BC1424 Algoritmos e Estruturas de Dados I Aula 05 Custos de um algoritmo e funções de complexidade

Complexidade assintótica de programas

Elementos de Análise Assintótica

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Análise de complexidade

Análise de Complexidade de Algoritmos

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Comportamento assintótico

Algoritmos e Estruturas de Dados I Aula 06 Custos de um algoritmo

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

Análise de Algoritmos e Estruturas de Dados

Melhores momentos AULA 1. Algoritmos p.38/86

INF 1010 Estruturas de Dados Avançadas

ESTRUTURAS DE DADOS prof. Alexandre César Muniz de Oliveira

Teoria da computabilidade Indecidíveis Decidíveis

Algoritmos e Estruturas de Dados I Prof. Tiago Eugenio de Melo

André Vignatti DINF- UFPR

Técnicas de projeto de algoritmos: Indução

Análise de Algoritmos

MC3305 Algoritmos e Estruturas de Dados II. Aula 00 Apresentação. Prof. Jesús P. Mena-Chalco.

Análise e Projeto de Algoritmos

Comportamento Assintótico. Algoritmos e Estruturas de Dados Flavio Figueiredo (

1 a Lista Professor: Claudio Fabiano Motta Toledo Estagiário PAE: Jesimar da Silva Arantes

2. Ordenação por Seleção

Complexidade de Algoritmos

Análise de Algoritmos

Projeto e Análise de Algoritmos. Introdução. Prof. Ademir Constantino Universidade Estadual de Maringá Departamento de Informática

Construção de Algoritmos II Aula 06

SIN5013 Análise de Algoritmos e Estrutura de Dados - 1o Semestre de 2019

Estruturas de Dados para Conjuntos Disjuntos: Union-find Letícia Rodrigues Bueno

Trabalho Prático 1. Valor: 1,0 pontos (10% da nota total) Data de Entrega: 02/05/2010

Classificação e Pesquisa Aula 6 Métodos de Ordenação: ShellSort e QuickSort. Prof. Esp. Pedro Luís Antonelli Anhanguera Educacional

Algoritmos de ordenação: Inserção e Shellsort

5. Algoritmos de Ordenação

2. Complexidade de Algoritmos

Medida do Tempo de Execução de um Programa

Estruturas de Dados 2

5. Análise de Complexidade de Algoritmos. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2003/2004) Luís Paulo Reis (versão 2005/2006)

Transcrição:

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Análise de Algoritmos 1. Introdução;

Análise de Algoritmos 1. Introdução; 2. Conceitos básicos;

Análise de Algoritmos 1. Introdução; 2. Conceitos básicos; 3. Notação assintótica: notação O;

Análise de Algoritmos 1. Introdução; 2. Conceitos básicos; 3. Notação assintótica: notação O; 4. Notação assintótica: notações Ω, Θ, o e ω; 5. Métodos de análise de algoritmos; 6. Teoria da complexidade.

Introdução Objetivo: possibilitar medir eficiência de algoritmos; Fonte: GAREY, M. R. e JOHNSON, D. S. Computers and Intractability. A guide to the theory of NP-Completeness, W.H. Freeman and Company: New York, 1979.

Introdução Objetivo: possibilitar medir eficiência de algoritmos; Analisar um algoritmo: prever os recursos que serão necessários; Fonte: GAREY, M. R. e JOHNSON, D. S. Computers and Intractability. A guide to the theory of NP-Completeness, W.H. Freeman and Company: New York, 1979.

Introdução Objetivo: possibilitar medir eficiência de algoritmos; Analisar um algoritmo: prever os recursos que serão necessários; A 1 A 2 A 3 A 4 A 5 P 1 Fonte: GAREY, M. R. e JOHNSON, D. S. Computers and Intractability. A guide to the theory of NP-Completeness, W.H. Freeman and Company: New York, 1979.

Introdução Objetivo: possibilitar medir eficiência de algoritmos; Analisar um algoritmo: prever os recursos que serão necessários; Busca: Sequencial ou Binária? A 1 = Sequencial A 2 = Binária P 1 = busca Fonte: GAREY, M. R. e JOHNSON, D. S. Computers and Intractability. A guide to the theory of NP-Completeness, W.H. Freeman and Company: New York, 1979.

Introdução Objetivo: possibilitar medir eficiência de algoritmos; Analisar um algoritmo: prever os recursos que serão necessários; Busca: Sequencial ou Binária? Ordenação: Inserção, Seleção, Bolha, Quicksort, Heapsort, Mergesort ou Shellsort? A 1 = Inserção A 2 = Mergesort A 3 = Quicksort P 2 = ordenação Fonte: GAREY, M. R. e JOHNSON, D. S. Computers and Intractability. A guide to the theory of NP-Completeness, W.H. Freeman and Company: New York, 1979.

Conceitos Básicos: definições modelo assumido: instruções executadas uma após a outra, sem operações concorrentes (ou simultâneas);

Conceitos Básicos: definições modelo assumido: instruções executadas uma após a outra, sem operações concorrentes (ou simultâneas); execução de uma operação toma uma unidade de tempo;

Conceitos Básicos: definições modelo assumido: instruções executadas uma após a outra, sem operações concorrentes (ou simultâneas); execução de uma operação toma uma unidade de tempo; a memória é infinita;

Conceitos Básicos: definições modelo assumido: instruções executadas uma após a outra, sem operações concorrentes (ou simultâneas); execução de uma operação toma uma unidade de tempo; a memória é infinita; problema com entrada de tamanho n: função de custo ou função de complexidade f(n);

Conceitos Básicos: definições modelo assumido: instruções executadas uma após a outra, sem operações concorrentes (ou simultâneas); execução de uma operação toma uma unidade de tempo; a memória é infinita; problema com entrada de tamanho n: função de custo ou função de complexidade f(n); função de complexidade de tempo: número de execuções de determinada operação considerada relevante;

Conceitos Básicos: definições modelo assumido: instruções executadas uma após a outra, sem operações concorrentes (ou simultâneas); execução de uma operação toma uma unidade de tempo; a memória é infinita; problema com entrada de tamanho n: função de custo ou função de complexidade f(n); função de complexidade de tempo: número de execuções de determinada operação considerada relevante; função de complexidade de espaço: espaço de memória ocupada;

Conceitos Básicos: exemplo Exemplo: calcular o fatorial de um número n. Tamanho da entrada do problema: n; fatorial(n) 1: fat 1; 2: para (i 1; i n; i ++) faça // executa n vezes 3: fat fat i; 4: retorna fat Complexidade de tempo: c 1.n;

Conceitos Básicos: fatorial Exemplo: calcular o fatorial de um número n. Tamanho da entrada do problema: n; fatorial(n) 1: fat 1; 2: para (i 1; i n; i ++) faça // executa n vezes 3: fat fat i; // tempo constante c 1 4: retorna fat Complexidade de tempo: c 1.n;

Conceitos Básicos: melhor caso, pior caso e caso médio Três cenários dependentes da entrada: Melhor caso: menor tempo de execução;

Conceitos Básicos: melhor caso, pior caso e caso médio Três cenários dependentes da entrada: Melhor caso: menor tempo de execução; Pior caso: maior tempo de execução. Geralmente, priorizamos determinar o pior caso;

Conceitos Básicos: melhor caso, pior caso e caso médio Três cenários dependentes da entrada: Melhor caso: menor tempo de execução; Pior caso: maior tempo de execução. Geralmente, priorizamos determinar o pior caso; Caso médio: média dos tempos de execução. Mais difícil de obter;

Conceitos Básicos: melhor caso, pior caso e caso médio Exemplo: busca sequencial. Operação relevante: comparação de x com elementos de V ; buscasequencial(x, V ) 1: i 1; 2: enquanto (i n) e (V[i] x) faça // executa n vezes no máximo 3: i i + 1; 4: se i > n então Busca sem sucesso 5: senão Busca com sucesso Complexidade de tempo: n

Conceitos Básicos: melhor caso Melhor caso da busca sequencial: x está em V[1]! buscasequencial(x, V ) 1: i 1; 2: enquanto (i n) e (V[i] x) faça // executa n vezes no máximo 3: i i + 1; 4: se i > n então Busca sem sucesso 5: senão Busca com sucesso Complexidade de tempo: 1

Conceitos Básicos: pior caso Pior caso da busca sequencial: x está em V[n] ou não está em V! buscasequencial(x, V ) 1: i 1; 2: enquanto (i n) e (V[i] x) faça // executa n vezes no máximo 3: i i + 1; 4: se i > n então Busca sem sucesso 5: senão Busca com sucesso Complexidade de tempo: n

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i;

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ;

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1+2

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1+2+3

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1+2+3+...+n)

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1+2+3+...+n) = 1 n ( n(n+1) 2 )

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1+2+3+...+n) = 1 n ( n(n+1) 2 ) = n+1 2

Conceitos Básicos: caso médio Caso médio da busca sequencial: assumindo que x está em V, f(n) = 1 p 1 + 2 p 2 +...+n p n onde p i é probabilidade de x estar na posição i; probabilidades são iguais: p i = 1 n ; f(n) = 1 n (1+2+3+...+n) = 1 n ( n(n+1) 2 ) = n+1 2 Complexidade de tempo: n+1 2, ou seja, uma pesquisa bem-sucedida examina aproximadamente metade dos registros.

inicializ. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf sup

1a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf meio sup

1a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf sup

2a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf sup

2a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf meio sup

3a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf sup

4a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf sup

5a iter. 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio] então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup] então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado inf sup

Complexidade da Busca Binária Cada iteração (linhas 4 9) divide ao meio a faixa entre inf e sup. Termina quando faixa tem apenas 1 elemento. Quantas iterações, dividindo ao meio, até 1 elemento? i.

Complexidade da Busca Binária Cada iteração (linhas 4 9) divide ao meio a faixa entre inf e sup. Termina quando faixa tem apenas 1 elemento. Quantas iterações, dividindo ao meio, até 1 elemento? Equivalente: quantas vezes devo dobrar até chegar a n? i.

Complexidade da Busca Binária Cada iteração (linhas 4 9) divide ao meio a faixa entre inf e sup. Termina quando faixa tem apenas 1 elemento. Quantas iterações, dividindo ao meio, até 1 elemento? Equivalente: quantas vezes devo dobrar até chegar a n? i. 2 i = (n) i = log 2 (n)

Complexidade da Busca Binária (log 2 n) 1 1 1 1: BuscaBinária(chave, lista[0... n]) 2: inf 1 3: sup n 4: enquanto inf < sup 1 faça 5: meio inf+sup 2 6: se chave lista[meio].chave então 7: sup meio 8: senão 9: inf meio 10: se chave = lista[sup].chave então 11: retorna lista[sup] 12: senão 13: retorna elemento não encontrado Total operações: 1+log 2 n, para n elementos.

Conceitos Básicos: busca sequencial busca binária Problema de busca no pior caso: busca binária leva g(n) = 1+log 2 n passos e busca sequencial leva f(n) = n passos;

Conceitos Básicos: busca sequencial busca binária Problema de busca no pior caso: busca binária leva g(n) = 1+log 2 n passos e busca sequencial leva f(n) = n passos; Vamos comparar f(n) = n e g(n) = 1+log 2 n:

Conceitos Básicos: busca sequencial busca binária Problema de busca no pior caso: busca binária leva g(n) = 1+log 2 n passos e busca sequencial leva f(n) = n passos; Vamos comparar f(n) = n e g(n) = 1+log 2 n:

Notação Assintótica: Notação O Análise assintótica dos programas: mede como f(n) se comporta conforme n aumenta indefinidamente;

Notação Assintótica: Notação O Análise assintótica dos programas: mede como f(n) se comporta conforme n aumenta indefinidamente; Uma função f(n) é O(g(n)) (notação f(n) = O(g(n))) se existem duas constantes positivas c e m tais que f(n) c.g(n), para todo n m; f, g c.g(n) f(n) m n

Notação Assintótica: Notação O Análise assintótica dos programas: mede como f(n) se comporta conforme n aumenta indefinidamente; Uma função f(n) é O(g(n)) (notação f(n) = O(g(n))) se existem duas constantes positivas c e m tais que f(n) c.g(n), para todo n m; f(n) = O(g(n)): g(n) é limite superior para f(n); f, g c.g(n) f(n) m n

Notação Assintótica: Notação O Análise assintótica dos programas: mede como f(n) se comporta conforme n aumenta indefinidamente; Uma função f(n) é O(g(n)) (notação f(n) = O(g(n))) se existem duas constantes positivas c e m tais que f(n) c.g(n), para todo n m; f(n) = O(g(n)): g(n) é limite superior para f(n); f, g c.g(n) f(n) m n

Notação Assintótica: Notação O Qual a complexidade assintótica da busca sequencial e da busca binária?

Notação Assintótica: Notação O Qual a complexidade assintótica da busca sequencial e da busca binária? Busca sequencial: n = O(n), para c 1, m = 1;

Notação Assintótica: Notação O Qual a complexidade assintótica da busca sequencial e da busca binária? Busca sequencial: n = O(n), para c 1, m = 1; Busca binária: 1+log 2 n = O(log 2 n), para c 1, m = 2;

Notação Assintótica: Notação O Qual a complexidade assintótica da busca sequencial e da busca binária? Busca sequencial: n = O(n), para c 1, m = 1; Busca binária: 1+log 2 n = O(log 2 n), para c 1, m = 2; Como 1+log 2 n = O(n), c 1, m = 1, a busca binária é assintoticamente mais eficiente que a busca sequencial!

Notação Assintótica: Notação O Vamos analisar o trecho de código abaixo: 1: sum1 0; 2: para (i = 1; i n; i ++) faça

Notação Assintótica: Notação O Vamos analisar o trecho de código abaixo: 1: sum1 0; 2: para (i = 1; i n; i ++) faça // n vezes 3: para (j = 1; j n; j ++) faça

Notação Assintótica: Notação O Vamos analisar o trecho de código abaixo: 1: sum1 0; 2: para (i = 1; i n; i ++) faça // n vezes 3: para (j = 1; j n; j ++) faça // n vezes 4: sum1 sum1+1;

Notação Assintótica: Notação O Vamos analisar o trecho de código abaixo: 1: sum1 0; 2: para (i = 1; i n; i ++) faça // n vezes 3: para (j = 1; j n; j ++) faça // n vezes 4: sum1 sum1+1; // n 2 vezes

Notação Assintótica: Notação O Vamos analisar o trecho de código abaixo: 1: sum1 0; 2: para (i = 1; i n; i ++) faça // n vezes 3: para (j = 1; j n; j ++) faça // n vezes 4: sum1 sum1+1; // n 2 vezes Complexidade assintótica: O(n 2 )!

Notação Assintótica: Notação O Outro trecho de código: 1: sum2 0; 2: para (i = 1; i n; i ++) faça 3: para (j = 1; j i; j ++) faça 4: sum2 sum2+1; Complexidade assintótica:

Notação Assintótica: Notação O Outro trecho de código: 1: sum2 0; 2: para (i = 1; i n; i ++) faça 3: para (j = 1; j i; j ++) faça 4: sum2 sum2+1; Complexidade assintótica: 1+2+3+...+n = n j=1 j = n(n+1) 2 = n2 + n 2 = O(n 2 ), c 1, m = 1.

Notação Assintótica: Notação O Apenas mais um trecho de código: 1: sum3 0; 2: para (i = 1; i n; i ++) faça 3: para (j = i; j n; j ++) faça 4: sum3 sum3+1;

Notação Assintótica: Notação O Apenas mais um trecho de código: 1: sum3 0; 2: para (i = 1; i n; i ++) faça 3: para (j = i; j n; j ++) faça 4: sum3 sum3+1; Complexidade assintótica:

Notação Assintótica: Notação O Apenas mais um trecho de código: 1: sum3 0; 2: para (i = 1; i n; i ++) faça 3: para (j = i; j n; j ++) faça 4: sum3 sum3+1; Complexidade assintótica: n+(n 1)+...+1 = n j=1 j = n(n+1) 2 = n2 + n 2 = O(n 2 ), c 1, m = 1.

Ordenação por inserção - Exemplo O R D E N A

Ordenação por inserção - Exemplo O R D E N A O R D E N A

Ordenação por inserção - Exemplo O R D E N A O R D E N A O R D E N A

Ordenação por inserção - Exemplo O R D E N A O R D E N A O R D E N A D O R E N A

Ordenação por inserção - Exemplo O R D E N A O R D E N A O R D E N A D O R E N A D E O R N A

Ordenação por inserção - Exemplo O R D E N A O R D E N A O R D E N A D O R E N A D E O R N A D E N O R A

Ordenação por inserção - Exemplo O R D E N A O R D E N A O R D E N A D O R E N A D E O R N A D E N O R A A D E N O R

Ordenação por Inserção - Algoritmo 1: Ordenação-Inserção(A); 2: for (j = 2; j n; j ++) do 3: key A[j]; // Insere A[j] na sequência ordenada A[1..j 1] 4: i (j 1); 5: while (i > 0) and (A[i] > chave) do 6: A[i + 1] A[i]; 7: i (i 1); 8: A[i + 1] chave;

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j];

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j]; n 1 4: i (j 1);

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j]; n 1 4: i (j 1); n 1 5: while (i > 0) and (A[i] > chave) do

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j]; n 1 4: i (j 1); n 1 5: while (i > 0) and (A[i] > chave) do n j=2 t j 6: A[i + 1] A[i];

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j]; n 1 4: i (j 1); n 1 5: while (i > 0) and (A[i] > chave) do n 6: A[i + 1] A[i]; 7: i (i 1); j=2 t j n j=2 (t j 1)

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j]; n 1 4: i (j 1); n 1 5: while (i > 0) and (A[i] > chave) do n 6: A[i + 1] A[i]; 7: i (i 1); 8: A[i + 1] chave; j=2 t j n j=2 (t j 1) n j=2 (t j 1)

Ordenação por Inserção - Complexidade Local 1: Ordenação-Inserção(A); Frequência 2: for (j = 2; j n; j ++) do (n 1)+1 3: key A[j]; n 1 4: i (j 1); n 1 5: while (i > 0) and (A[i] > chave) do n 6: A[i + 1] A[i]; 7: i (i 1); j=2 t j n j=2 (t j 1) n j=2 (t j 1) 8: A[i + 1] chave; n 1 onde t j é o número de vezes que o teste do laço while é executado para cada valor de j.

Ordenação por Inserção - Análise Assintótica Operação relevante: comparações entre chaves 1: Ordenação-Inserção(A); 2: for (j = 2; j n; j ++) do 3: key A[j]; // Insere A[j] na sequência ordenada A[1..j 1] 4: i (j 1); 5: while (i > 0) and (A[i] > chave) do 6: A[i + 1] A[i]; 7: i (i 1); 8: A[i + 1] chave;

Ordenação por Inserção - Análise Assintótica 1: Ordenação-Inserção(A); 2: for (j = 2; j n; j ++) do 3: key A[j]; // Insere A[j] na sequência ordenada A[1..j 1] 4: i (j 1); 5: while (i > 0) and (A[i] > chave) do 6: A[i + 1] A[i]; 7: i (i 1); 8: A[i + 1] chave; Melhor caso: sequência já ordenada; Linha 2 executa n 1 vezes: O(n)!

Ordenação por Inserção - Análise Assintótica 1: Ordenação-Inserção(A); 2: for (j = 2; j n; j ++) do 3: key A[j]; // Insere A[j] na sequência ordenada A[1..j 1] 4: i (j 1); 5: while (i > 0) and (A[i] > chave) do 6: A[i + 1] A[i]; 7: i (i 1); 8: A[i + 1] chave; Pior caso: sequência invertida; Linha 2 executa n 1 vezes e linha 5 executa: 2+3+...+n = n j=2 j = (n 1)(n+2) 2 = n2 + n 2 2 = O(n 2 ).

Ordenação por Inserção - Análise Assintótica 1: Ordenação-Inserção(A); 2: for (j = 2; j n; j ++) do 3: key A[j]; // Insere A[j] na sequência ordenada A[1..j 1] 4: i (j 1); 5: while (i > 0) and (A[i] > chave) do 6: A[i + 1] A[i]; 7: i (i 1); 8: A[i + 1] chave; Pior caso: sequência invertida; n 2 + n 2 2 = O(n 2 ), c 1, m = 2.

Funções de complexidade frequentes

Funções de complexidade frequentes

Bibliografia CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L. e STEIN, C. Introduction to Algorithms, 3 a edição, MIT Press, 2009. GAREY, M. R. e JOHNSON, D. S. Computers and Intractability. A guide to the theory of NP-Completeness, W.H. Freeman and Company: New York, 1979. SZWARCFITER, J. L. e MARKENZON, L. Estruturas de Dados e seus Algoritmos, LTC, 1994. ZIVIANI, N. Projeto de Algoritmos: com implementações em Pascal e C, 2 a edição, Cengage Learning, 2009.