Complexidade de Algoritmos

Documentos relacionados
ALGORITMOS AVANÇADOS UNIDADE I Análise de Algoritmo - Notação O. Luiz Leão

Algoritmos Avançados Análise de Complexidade

ESTRUTURA DE DADOS I AULA I

Análise de Complexidade de Algoritmos. mario alexandre gazziro

Análise e Projeto de Algoritmos

Análise e Projeto de Algoritmos

INF 1010 Estruturas de Dados Avançadas

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

INF 1010 Estruturas de Dados Avançadas

Análise de Algoritmos

ANÁLISE DE ALGORITMOS: PARTE 3

Aula 1. Teoria da Computação III

Análise e Projeto de Algoritmos

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

Complexidade de Algoritmos

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

Análise de complexidade

Análise de Algoritmos Estrutura de Dados II

Técnicas de Projeto de Algoritmos

BCC202 - Estrutura de Dados I

Análise de Algoritmos

Medida do Tempo de Execução de um Programa

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

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

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

Projeto e Análise de Algoritmos

Análise de algoritmos. Parte I

ANÁLISE DE COMPLEXIDADE DOS ALGORITMOS

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

Quantidade de memória necessária

Análise de Complexidade de Algoritmos

Teoria dos Grafos. Valeriano A. de Oliveira Socorro Rangel Departamento de Matemática Aplicada.

Complexidade de algoritmos Notação Big-O

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

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

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

Projeto e Análise de Algoritmos

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

03 Análise de Algoritmos (parte 3) SCC201/501 - Introdução à Ciência de Computação II

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Complexidade de Algoritmos

Elementos de Análise Assintótica

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)

Análise e Complexidade de Algoritmos

Algoritmos 3/17/ Algoritmos como área de estudo e investigação

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

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Refinamentos sucessivos

Teoria dos Grafos Aula 7

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Complexidade de Algoritmos

01 Análise de Algoritmos (parte 2) SCC201/501 - Introdução à Ciência de Computação II

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

Pesquisa Sequencial e Binária. Introdução à Programação SI2

Complexidade de Algoritmos

LISTAS LINEARES. Estrutura de Dados

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Pesquisa Sequencial e Binária

BCC202 - Estrutura de Dados I

Aula 06: Análise matemática de algoritmos recursivos

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

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

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

CIC 110 Análise e Projeto de Algoritmos I

ANÁLISE DE ALGORITMOS

Análise de Algoritmos

Classificação e Pesquisa

BCC202 - Estrutura de Dados I

Análise de Algoritmos

Algoritmos de pesquisa

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Lista 1. 8 de abril de Algorithms: Capítulo 0, exercícios 1 e 2. Tardos: Todos exercícios do cap 2 do livro texto, exceto 7 e 8 letra b.

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

Pesquisa e Ordenação

Análise e Complexidade de Algoritmos

Classes, Herança e Interfaces

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Transcrição:

Complexidade de Algoritmos

Complexidade de Algoritmos Definição A Complexidade de um Algoritmo consiste na quantidade de trabalho necessária para a sua execução, expressa em função das operações fundamentais, as quais variam de acordo com o algoritmo, e em função do volume de dados

Complexidade de Algoritmos Um algoritmo serve para resolver um determinado problema, e todos os problemas têm sempre uma entrada de dados (N) O tamanho desse N afeta sempre diretamente no tempo de resposta de um algoritmo Dependendo do problema, já existem alguns algoritmos prontos, ou que podem ser adaptados O problema é: qual algoritmo escolher?

Complexidade de Algoritmos A complexidade de um algoritmo pode ser dividido em: Complexidade Espacial: Quantidade de recursos utilizados para resolver o problema; Complexidade Temporal: Quantidade de Tempo utilizado. Pode ser visto também como o número de instruções necessárias para resolver determinado problema; Em ambos os casos, a complexidade é medida de acordo com o tamanho dos dados de entrada (N)

Complexidade de Algoritmos Existem três escalas de complexidade: Melhor Caso Caso Médio Pior Caso Nas três escalas, a função f(n) retorna a complexidade de um algoritmo com entrada de N elementos

Complexidade de Algoritmos Melhor Caso Definido pela letra grega Ω (Ômega) É o menor tempo de execução em uma entrada de tamanho N É pouco usado, por ter aplicação em poucos casos. Ex.: Se tivermos uma lista de N números e quisermos encontrar algum deles assume-se que a complexidade no melhor caso é f(n) = Ω (1), pois assume-se que o número estaria logo na cabeça da lista.

Complexidade de Algoritmos Caso Médio Definido pela letra grega θ (Theta) Dos três, é o mais difícil de se determinar Deve-se obter a média dos tempos de execução de todas as entradas de tamanho N, ou baseado em probabilidade de determinada condição ocorrer No exemplo anterior: A complexidade média é P(1) + P(2) +... + P(N) Para calcular a complexidade média, basta conhecer as probabilidades de Pi; Pi = 1/N, 1 <= i <= N Isso resulta em P(1/N) + P(2/N) +... + P(N/N) Que resulta em 1/N(1+2+...+N) Que resulta em 1 N(N+1) N 2 Que resulta em f(n) = θ (N+1) 2

Complexidade de Algoritmos Pior Caso Será o caso utilizado durante esse curso Representado pela letra grega O (O maiúsculo. Trata-se da letra grega ômicron maiúscula) É o método mais fácil de se obter. Baseia-se no maior tempo de execução sobre todas as entradas de tamanho N Ex.: Se tivermos uma lista de N números e quisermos encontrar algum deles, assume-se que a complexidade no pior caso é O (N), pois assume-se que o número estaria, no pior caso, no final da lista. Outros casos adiante

Complexidade de Algoritmos Mas como saber qual é a complexidade de um determinado algoritmo implementado? Para resolver esse problema, dividiu-se os algoritmos em Classes de Problemas, de acordo com o parâmetro que afeta o algoritmo de forma mais significativa

Classes de Algoritmos São elas: 1. Complexidade Constante 2. Complexidade Linear 3. Complexidade Logarítmica 4. NlogN 5. Complexidade Quadrática 6. Complexidade Cúbica 7. Complexidade Exponencial

Complexidade Constante São os algoritmos de complexidade O(1) Independe do tamanho N de entradas É o único em que as instruções dos algoritmos são executadas num tamanho fixo de vezes Ex.: Function Vazia(Lista: TipoLista): Boolean; Begin End; Vazia := Lista.Primeiro = Lista.Ultimo;

Complexidade Linear São os algoritmos de complexidade O(N) Uma operação é realizada em cada elemento de entrada, ex.: pesquisa de elementos em uma lista Procedure Busca(Lista: TipoLista; x: TipoElem; Var pos: integer) Var i: integer; Begin End; i:=1; while Lista.Elemento[i] <> x do i := i+1; if i >= Lista.MaxTam then else pos := -1 pos := i;

Complexidade Logarítmica São os algoritmos de complexidade O(logN) Ocorre tipicamente em algoritmos que dividem o problema em problemas menores Ex.: O algoritmo de Busca Binária

Complexidade NLogN Como o próprio nome diz, são algoritmos que têm complexidade O(NlogN) Ocorre tipicamente em algoritmos que dividem o problema em problemas menores, porém juntando posteriormente a solução dos problemas menores A maioria dos algoritmos de ordenação externa são de complexidade logarítmica ou N Log N

Complexidade Quadrática São os algoritmos de complexidade O(N²) Itens são processados aos pares, geralmente com um loop dentro do outro Ex.: Procedure SomaMatriz(Mat1, Mat2, MatRes: Matriz); Var i, j: integer; Begin for i:=1 to n do for j:=1 to n do MatRes[i,j] := Mat1[i, j] + Mat2[i,j];

Complexidade Cúbica São os algoritmos de complexidade O(N³) Itens são processados três a três, geralmente com um loop dentro do outros dois Ex.: Procedure SomaElementos_Vetor_Indices_Matriz Var i, j: integer; Begin for i:=1 to n do for j:=1 to n do (mat: Matriz, vet: Vetor); for k:=1 to n do mat[i, j] := mat[i, j] + vet[k];

Complexidade Exponencial São os algoritmos de complexidade O(2 N ) Utilização de Força Bruta para resolvê-los (abordagem simples para resolver um determinado problema, geralmente baseada diretamente no enunciado do problema e nas definições dos conceitos envolvidos) Geralmente não são úteis sob o ponto de vista prático

Ordens mais comuns 2 n (exponencial) n 2 (quadrática) n log n f n n (linear) log n (logarítmica) 1 (constante)

Cálculo da Complexidade Foi visto que, para calcular a complexidade de um algoritmo, deve-se analisar o pior caso A análise deve ser feita no programa todo, de acordo com a tabela a seguir

Algumas Operações com a Notação O

Alguns Exemplos Procedure Verifica_Item_Lista (Lista: TipoLista; x: TipoItem; pos: integer); Var i: integer; Begin i:=1; O(1) achou := false; while (i <= Lista.Tamanho) and not achou do begin inc(i); if Lista.Item[i] = x then achou := true; end; if achou then pos := i else pos := -1; O(1) O(N) f(n) = O(9 * O(1) + O(N)) = O(O(1) + (O(N)) = O(N)

Alguns Exemplos Procedure Verifica_Item(Lista: TipoLista; x: TipoItem; pos: integer); Var i: integer; Begin i:=1; achou := false; while (i <= Lista.Tamanho) and not achou do if Lista.Item[i] = x then achou := true; if achou then pos := i else for i:= Lista.Tamanho +1 to MaxTam; Lista.Item[i] := x; O(1) O(1) O(N) O(1) O(N) f(n) = O(7 * O(1) + 2*O(N)) = O(O(1) + (O(N)) = O(N)

Alguns Exemplos - Recursividade No caso da recursividade, depende da quantidade de iterações que se pode chegar Ex.: se eu quiser saber os N primeiros termos de um fatorial, a complexidade é N Function Fatorial (N: Integer): Integer; Begin If n=0 then Fatorial := 1 Else Fatorial := N * Fatorial (N-1) End;

Análise de Recursividade Fatorial O(n) = 1, se n = 0 = O(n-1) + 1, se n > 1 mas quanto é O(n-1)?

Fatorial = (O(n-1)) + 1 = (O(n-2) + 1) + 1 = O(n-2) + 2 = (O(n-3) + 1) + 2 = O(n-3) + 3... forma geral, O(n) = O(n-k) + k, 1 k n Como k é o número do fatorial, fazendo n = k, reduzimos a O(n) = n

Complexidade de Algoritmos Essas ordens vistas definem o Limite Superior (Upper Bound) dos Algoritmos, ou seja, qualquer que seja o tamanho da entrada, a execução será aquela determinada pelo algoritmo. Algumas otimizações podem ser feitas para melhorar o limite superior; Existem, porém, os Limites Inferiores (Lower Bound) dos Algoritmos, que são pontos em que não são mais possíveis otimizações

Complexidade de Algoritmos Um Exemplo Prático Dado um problema de Multiplicação de 2 matrizes N X N. Pelo método trivial, a complexidade no pior caso seria O(n 3 ); Sabemos assim que a complexidade deste problema não deve superar O(n 3 ), uma vez que existe um algoritmo desta complexidade que o resolve; Este limite superior de um algoritmo pode mudar se alguém descobrir um algoritmo melhor. Isso de fato aconteceu com o algoritmo de Strassen, que resolveu o problema com uma complexidade de O(nlog 7), que seria o novo limite superior do problema de multiplicação de matrizes; Outros pesquisadores melhoraram ainda mais este resultado. Atualmente o melhor resultado é o de Coppersmith e Winograd de O(n 2.376 ). O limite superior de um algoritmo é parecido com o recorde mundial de uma modalidade de atletismo. Ela é estabelecida pelo melhor atleta ( algoritmo ) do momento. Assim como o recorde mundial, o limite superior pode ser melhorado por um algoritmo (atleta) mais veloz.

Complexidade de Algoritmos Um Exemplo Prático Às vezes é necessário mostrar que, para um dado problema, qualquer que seja o algoritmo a ser usado, requer um certo número de operações: o Limite inferior Para o problema de multiplicação de matrizes de ordem n, apenas para ler os elementos das duas matrizes de entrada leva O(n 2 ). Assim uma cota inferior trivial é Ω(n 2 ). Na analogia anterior, o limite inferior não dependeria mais do atleta. Seria algum tempo mínimo que a modalidade exige, qualquer que seja o atleta. Um limite inferior trivial para os 100 metros seria o tempo que a velocidade da luz leva para percorrer 100 metros no vácuo. Se um algoritmo tem uma complexidade que é igual ao limite inferior do problema então o algoritmo é ótimo. O algoritmo de CopperSmith e Winograd é de O(n 2.376 ) mas o limite inferior é de Ω(n²). Portanto não é ótimo. Este limite superior ainda pode ser melhorado