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

Documentos relacionados
Algoritmos Avançados Análise de Complexidade

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

Análise e Projeto de Algoritmos

ANÁLISE DE ALGORITMOS: PARTE 3

Medida do Tempo de Execução de um Programa

Técnicas de Projeto de Algoritmos

Quantidade de memória necessária

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

Projeto e Análise de Algoritmos

Análise de complexidade

Análise de algoritmos. Parte I

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

Aula 1. Teoria da Computação III

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

Análise e Projeto de Algoritmos

Complexidade de Algoritmos

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

BCC202 - Estrutura de Dados I

ANÁLISE DE ALGORITMOS

Complexidade de Algoritmos

Análise de algoritmos

Projeto e Análise de Algoritmos

Complexidade de Algoritmos

Complexidade de algoritmos Notação Big-O

Complexidade de Algoritmos

Técnicas de Programação III Análise de Algoritmos (Continuação)

Paradigmas de Projetos de Algoritmos

Análise e Projeto de Algoritmos

4º 20/10/2003. ÍNDICE

Análise e Projeto de Algoritmos

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Teoria da computabilidade Indecidíveis Decidíveis

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

Análise de Algoritmos Parte 4

Informática I. Aula 14. Aula 14-10/10/2007 1

Capítulo. Análise de Algoritmos. 6.1 Complexidade de Algoritmos 6.1

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Análise e Projeto de Algoritmos P R O F : L O A N A T. N O G U E I R A

ALGORITMOS AVANÇADOS. UNIDADE III Algoritmo de Ordenação por Intercalação (Mergesort) Luiz Leão

Complexidade assintótica de programas

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

Projeto e Análise de Algoritmos

AULA 24. Algoritmos p.856/905

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

Programação II Aula 07

Introdução à Análise de Algoritmos

Análise de Algoritmos

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

BCC202 - Estrutura de Dados I

ANÁLISE DE ALGORITMOS: PARTE 4

a complexidade no desempenho de algoritmos

Complexidade de Algoritmos

Algoritmos Combinatórios: Introdução

COMPLEXIDADE DE ALGORITMOS COMPLEXIDADE DE ALGORITMOS

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Pesquisa Sequencial e Binária

Análise e Projeto de Algoritmos

Recursividade, Tentativa e Erro

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

Algoritmos e Estrutura de Dados. Aula 04 Recorrência Prof. Tiago A. E. Ferreira

Aula 10: Tratabilidade

Princípio da Multiplicação Gerando todas as palavras de um alfabeto. > Princípios de Contagem e Enumeração Computacional 0/18

PLANO DE DISCIPLINA DISCIPLINA: Análise de Algoritmos

Estruturas de Dados 2

Estruturas de Dados 2

Complexidade de Algoritmos. Edson Prestes

Noções de complexidade de algoritmos

Análise empírica de algoritmos de ordenação

Projeto e Análise de Algoritmos

COMPARAÇÃO ENTRE FROTA HOMOGÊNEA E HETEROGÊNEA EM PROBLEMAS DE ROTEAMENTO DE VEÍCULOS CAPACITADOS

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

O que é um jogo digital?

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

Algoritmos e Estrutura de Dados. Aula 01 Apresentação da Disciplina e Introdução aos Algoritmos Prof. Tiago A. E. Ferreira

7. Introdução à Complexidade de Algoritmos

PUC-Rio Departamento de Informática Prof. Marcus Vinicius S. Poggi de Aragão Período: Horário: 4as-feiras de 13 às 16 horas - Sala 520L

Curso Profissional de Nível Secundário

ao paradigma imperativo

Pesquisa: operação elementar

#Conceituação. Algoritmos. Eliezio Soares

FACULDADE CAMPO LIMPO PAULISTA BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto a Análise de Algoritmos I Lista de Exercícios 1

MC102 - Algoritmos e programação de computadores. Aula 16: Busca e Ordenação em vetores

Análise Assintótica de Algoritmos

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

CÁLCULO NUMÉRICO. Profa. Dra. Yara de Souza Tadano

Multiplicação de inteiros

Introdução à Lógica de Programação

Estruturas de Dados 2

COMANDO DE DECISÃO EM LÓGICA DE PROGRAMAÇÃO Decision s Command for Logic Programming

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

Estudo e implementação de heurísticas para determinação do caminho de menor custo para atender a rotas pré estabelecidas. Por: Charles Pereira

Recursão. Prof. Fabrício Olivetti de França. (com inspirações do slide do prof. Rodrigo Hausen)

Resolução De Problemas Em Informática. Docente: Ana Paula Afonso Resolução de Problemas. 1. Analisar o problema

Noções de algoritmos - Aula 1

Algoritimos e Estruturas de Dados III CIC210

Recursividade. Objetivos do módulo. O que é recursividade

Análise de Desempenho da Paralelização do Problema de Caixeiro Viajante

Programação Dinâmica I SCC0210 Algoritmos Avançados (2/2011) Lucas Schmidt Cavalcante

3. Resolução de problemas por meio de busca

3 Aprendizado por reforço

Transcrição:

Luiz Leão luizleao@gmail.com http://www.luizleao.com

Conteúdo Programático 1.1 - Algoritmo 1.2 - Estrutura de Dados 1.2.1 - Revisão de Programas em C++ envolvendo Vetores, Matrizes, Ponteiros, Registros (Struct) e Funções. 1.3 - O que é Analise de Algoritmos 1.4 - Sobre o Elemento da Análise Assintótica - Notação O 1.4.1 - Notação O 1.4.2 - Sobre a função 1.4.3 - Operações com a Notação O

Algoritmo Algoritmo é uma sequência finita de instruções bem definidas e não ambíguas, cada uma das quais devendo ser executadas mecânica ou eletronicamente em um intervalo de tempo finito e com uma quantidade de esforço finita.

Estrutura de Dados É um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente

Revisão Programação Estrutura Condicional Estrutura de Repetição Vetores Matrizes

Analise de Algoritmos A análise de algoritmos estuda a correção e o desempenho de algoritmos. Em outras palavras, a análise de algoritmos procura respostas para perguntas do seguinte tipo: Este algoritmo resolve o meu problema? Quanto tempo o algoritmo consome para processar uma 'entrada' de tamanho n?

Por que analisar a complexidade dos algoritmos? A preocupação com a complexidade de algoritmos é fundamental para projetar algoritmos eficientes. Podemos desenvolver um algoritmo e depois analisar a sua complexidade para verificar a sua eficiência. Mas o melhor ainda é ter a preocupação de projetar algoritmos eficientes desde a sua concepção.

Analise de Algoritmos Além disso, a análise de algoritmos estuda certos paradigmas (como divisão-e-conquista, programação dinâmica, gula, busca local, aproximação, etc.) que se mostraram úteis na criação de algoritmos para vários problemas computacionais. A análise de algoritmos foi inventada e difundida por D.E. Knuth (veja a série de livros The Art of Computer Programming). Knuth foi o pai da ideia de prever o tempo de execução e o consumo de espaço de um algoritmo.

Analise de Algoritmos Um algoritmo serve para resolver um determinado problema, e todos os problemas têm sempre uma entrada de dados O tamanho dessa entrada (n) tem geralmente efeito direto no tempo de resposta de um algoritmo

Analise de Algoritmos (Cont.) Dependendo do problema a ser resolvido, já existem algoritmos prontos ou que podem ser adaptados O problema é: Qual algoritmo escolher?

Como Comparar Duas Soluções Para Um Mesmo Problema? Tomemos duas soluções para localizar um elemento em um vetor: LIN e BIN Temos dois computadores diferentes, A e B, sendo A um Core 2 Duo e B um Celeron. Qual é a melhor solução? LIN ou BIN?

Como Comparar Duas Soluções Para Um Mesmo Problema?

Análise Assintótica Para valores suficientemente pequenos de n, qualquer algoritmo custa pouco para ser executado, mesmo os algoritmos ineficientes; A Análise Assintótica é a análise de algoritmos quando realizada para valores grandes de n considerando-se o devido custo computacional das funções do programa;

Tipos de Complexidade Espacial: Este tipo de complexidade representa, por exemplo, o espaço de memória usado para executar o algoritmo. Temporal: Este tipo de complexidade é o mais usado podendo Dividir-se em dois grupos: Tempo (real) necessário à execução do algoritmo (como podemos medir?) Número de instruções necessárias à execução.

Tipos de Complexidade Em ambos os casos, a complexidade é medida de acordo com o tamanho dos dados de entrada (n) Estamos mais interessados em calcular a Complexidade Temporal de um algoritmo!

Complexidade de Algoritmos Existem três perspectivas para análise de complexidade: Melhor Caso Caso Médio Pior Caso Nas três perspectivas, a função f(n) retorna a complexidade de um algoritmo com entrada de tamanho n

Análise do Melhor Caso Definido pela letra grega Ω (Ômega). Exprime o menor tempo de execução de um algoritmo para uma entrada de tamanho n. É pouco usado, por ter aplicação em poucos casos. Ex: O algoritmo de pesquisa sequêncial em um vetor tem complexidade f(n) = Ω(1) A análise assume que o número procurado seria o primeiro selecionado na lista. Abordagem otimista!

Análise do Caso Médio Definido pela letra grega Θ (Theta) 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 Ex.: O algoritmo de pesquisa sequencial em um vetor tem complexidade f(n) = Θ(n/2) Em média será necessário visitar n/2 elementos do vetor até encontrar o elemento procurado Melhor aproximação Muito difícil de determinar na maioria dos casos

Análise do Pior Caso Representado pela letra grega O O maiúsculo. Trata-se da letra grega ômicron maiúscula Baseia-se no maior tempo de execução sobre todas as entradas de tamanho n É o método mais fácil de se obter. Ex.: O algoritmo de pesquisa sequencial em um vetor tem complexidade f(n) = O(n) No pior caso será necessário visitar todos os n elementos do vetor até encontrar o elemento procurado Abordagem pessimista!

A Notação 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. Ex: 10n³ + 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

A Notação O Desprezar constantes aditivas ou multiplicativas Número de passos 3n será aproximado para n Interesse assintótico Termos de menor grau podem ser desprezados n² + n será aproximado para n² 6n³ + 4n - 9 será aproximado para n³

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 de acordo com a tabela a seguir

Cálculo da Complexidade: Algoritmo Iterativo 1 + 1 + 1 + n * ( n * ( n * ( 1 + 1 + 1 + 3 ) ) ) 1 + 1 + 1

Cálculo da Complexidade: Algoritmo Iterativo 1 + 1 + 1 + n * ( n * ( n * ( 1 + 1 + 1 + 3 ) ) ) 1 + 1 + 1

Cálculo da Complexidade: Algoritmo Recursivo A questão se complica um pouco quando se trata de algoritmos recursivos Embora não haja um método único para esta avaliação, a complexidade de um algoritmo recursivo é definida em função de componentes como: Complexidade da base Complexidade do Núcleo Profundidade da Recursão Número de vezes que o procedimento recursivo é invocado Depende do tamanho do problema e da taxa de redução do tamanho do problema É justamente em sua determinação que reside o problema!

Cálculo da Complexidade: Algoritmo Recursivo A redução se dá de uma em uma unidade, de n até chegar a 0 Logo, a profundidade da recursão é n Tanto o núcleo quando a base executam apenas uma operação A base é executada uma única vez e o núcleo n - 1 vezes Logo, o número de operações executadas é ((n 1) *1) + 1, resultando em uma complexidade O(n)

Ordens de Algoritmos Complexidade Constante Complexidade Linear Complexidade Logarítmica Complexidade Log Linear Complexidade Quadrática Complexidade Cúbica Complexidade Exponencial Complexidade Fatorial

Complexidade Constante O(1) São os algoritmos onde a complexidade independe do tamanho n de entradas É o único em que as instruções dos algoritmos são executadas um número fixo de vezes

Complexidade Linear O(N) Uma operação é realizada em cada elemento de entrada, Ex.: pesquisa de elementos em uma lista

Complexidade Logarítmica O(logn) Ocorre tipicamente em algoritmos que dividem o problema em problemas menores

Complexidade Log Linear O(nLOGn) Ocorre tipicamente em algoritmos que dividem o problema em problemas menores, porém juntando posteriormente a solução dos problemas menores

Complexidade Quadrática O(n²) Itens são processados aos pares, geralmente com um loop dentro do outro

Complexidade Cúbica O(n³) Itens são processados três a três, geralmente com um loop dentro do outros dois

Complexidade Exponencial O(2 n ) Utilização de Força Bruta para encontrar a solução de um problema. A solução geralmente é baseada diretamente no enunciado do problema e nas definições dos conceitos envolvidos Ex: Utilizando apenas números é possível criar 10 n senhas de n dígitos Um algoritmo de força bruta para quebrar uma dessas senhas tem complexidade O(2 n )

Complexidade Fatorial O(n!) Também é baseada na utilização de força bruta para encontrar a solução de um problema Consiste em testar todas as possíveis permutações existentes na solução à procura da solução ótima para o problema Ex.: Problema do Caixeiro Viajante Encontrar a rota mínima para visitar várias cidades sem repetir nenhuma É um problema base para o projeto de microchips, sequenciamento de genoma e muitas outras aplicações Não possui solução exata eficiente (Problema NP) Utilização de heurísticas para aproximar a solução ótima

Ordens de Complexidade Imagine um computador que leva 1ms para executar uma operação. A tabela abaixo indica o tempo aproximado de execução de um algoritmo com diferentes ordens de complexidades para 3 tamanhos de entrada

Limites Superior e Inferior Todas as ordens de complexidade vistas definem o Limite Superior (Upper Bound) dos Algoritmos Qualquer que seja o tamanho da entrada, o tempo de execução crescerá com velocidade igual ou inferior a apontada pela análise de complexidade. Algumas otimizações podem ser feitas para melhorar o limite superior; Existem, porém, os Limites Inferiores (Lower Bound) para certos problemas, que são pontos a partir dos quais não é mais possível otimizar uma solução algorítmica

Limites Superior e Inferior Dado um problema de Multiplicação de 2 matrizes N X N. A solução trivial tem complexidade O(n³); Sabemos assim que a complexidade deste problema não deve superar O(n³), uma vez que existe um algoritmo com está ordem complexidade que o resolve; Este limite superior de um algoritmo pode mudar se alguém descobrir um algoritmo melhor.

Limites Superior e Inferior Strassen resolveu o problema com uma complexidade de O(nlog7) 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. Ele é estabelecida pelo melhor atleta (algoritmo) do momento. Assim como o recorde mundial, o limite superior pode ser melhorado por um algoritmo (atleta) mais veloz.

Limites Superior e Inferior Às vezes é necessário mostrar que, para um dado problema, qualquer que seja o algoritmo a ser usado, requer um certo número mínimo 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²). Assim uma cota inferior trivial é Ω(n²).

Limites Superior e Inferior 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

Exercício Efetuar o cálculo de complexidade dos algoritmos apresentados no início da unidade