Analise de Algoritmos e Notação Assintótica

Slides:



Advertisements
Apresentações semelhantes
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Advertisements

Introdução a Algoritmos
Parte 1: Organização de Computadores
Estruturas de Dados e Algoritmos II
Organização de Computadores I
CES-10 INTRODUÇÃO À COMPUTAÇÃO
gerador de código intermediário
Complexidade de Algoritmos
Amintas engenharia.
Tipos Primitivos, Variáveis e Operadores Aritméticos
Amintas engenharia.
Análise e Projeto de Algoritmos
Análise de Complexidade
Engenharia de Computação.
Organização e Recuperação da Informação (ORI)
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.
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
CISC e RISC.
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
Medida do Tempo de Execução de um Programa
INTRODUÇÃO À PROGRAMAÇÃO
Algoritmos Escher.
Introdução a Análise de Complexidade de Algoritmos
Estruturas de Dados e Complexidade de Algoritmos
Crescimento de Funções
Complexidade de Algoritmos
Linguagens de Programação
1 4.6 – Variáveis - introdução Nesta altura (ao nível da programação) interessa saber que um computador tem: Nesta altura (ao nível da programação) interessa.
Introdução a Programação
Complexidade de Algoritmos
FACENS – Engenharia da Computação Lógica Computacional I
Representação de Instruções
Sistemas Operacionais
Sistemas Operacionais
Fundamentos de programação CUDA
Estrutura de dados, pseudocódigo
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
Desenvolvimento de Jogos e Entretenimento Digital
Introdução a Programação
Aula T06 – BCC202 Análise de Algoritmos (Parte 4) Túlio Toffolo
Algoritmos e Programação de Computadores
Algoritmos 1º Semestre Materia: Informática Profº: Cristiano.
MapReduce Conceitos e Aplicações
Estruturas de Dados, Algoritmos e Complexidade
Mergesort Katia Guimarães.
DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 DESIGN E COMUNICAÇÃO MULTIMÉDIA 2011 / 2012 FORMADOR Gonçalo Miguel MÓDULO 25. Introdução ao ActionScript 3.0.
Campus de Caraguatatuba Licenciatura em Matemática Semestre de 2013
ALGORITMOS Intensivo Janeiro e Fevereiro de 2011
SISTEMAS OPERACIONAIS I
Programação de PIC em C Exposição das funções básicas para
Complexidade em Tempo de um Algoritmo
Como analisar um algoritmo
Complexidade de Computação Katia Guimarães. Avaliando a Qualidade de um Algoritmo É preciso ter bem definido –O que é dado de entrada e –O que é esperado.
Programação de Computadores - 1
Analise de Algoritmos e Notação Assintótica
Linguagem Técnica de Programação
Estruturas de Dados, Algoritmos e Complexidade Katia Guimarães.
Algoritmo e Estrutura de Dados I Introdução ao conceito de algoritmo Márcia Marra
Berilhes Borges Garcia Algoritmos Uma ferramenta para resolver um problema de computação bem- especificado (O espírito da computação) Exemplo: ordenação.
INTRODUÇÃO THOBER CORADI DETOFENO, MSC. Aula 01 JOINVILLE 2015 Universidade do Estado de Santa Catarina – CCT/UDESC.
Algoritmos e Programação Aula 01 Computadores e seus componentes.
Análise e Complexidade de Algoritmos
Curso Programadores de Informática
COMPILADORES 02 Prof. Marcos. COMPILADORES Do Programa à Execução Computadores das mais variadas arquiteturas têm funcionamento:
Disciplina: Estrutura de dados e Algoritmos Docentes: MSc. Manuel Zunguze.
Lógica de Programação Aula 06 Prof. Marcelo Marcony.
Analise de Algoritmos e Notação Assintótica
Transcrição da apresentação:

Analise de Algoritmos e Notação Assintótica Alex Fernandes da Veiga Machado alexcataguases@hotmail.com

Algoritmo Algoritmo é uma sequencia ordenada e finita de operações bem definidas e eficazes que, quando executadas por um computador, sempre termina num determinado período de tempo, produzindo uma solução ou indicando que a solução não pode ser obtida. (Procedimento passo a passo para obtenção de um fim)

Análise de Algoritmos Análise de Algoritmo tempo de processamento em função dos dados de entrada; espaço de memória total requerido para os dados; comprimento total do código; correcta obtenção do resultado pretendido (convervência); robustez (como comporta-se com as entradas inválidas ou não previstas). Análise de Algoritmos é medição de complexidade de algoritmo 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 Porquê o estudo da Complexidade? Performance Escolher entre vários algoritmos o mais eficiente para implementar; Desenvolver algoritmos mais eficientes (melhorar os algoritmos), devido ao aumento constante do "tamanho" dos problemas a serem resolvidos. Complexidade Computacional - torna possível determinar se a implementação de determinado algoritmo é viável.

Complexidade Tipos de Complexidade Espacial Temporal 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.

Analise de Algoritmos Medidas de Análise Devem ser independentes da tecnologia (hardware/software) Modelos Matemáticos simplificados baseados nos factores relevantes: Tempo de Execução Uma função que relaciona o tempo de execução com o tamanho de entrada: t = F(n) Conjunto de operações a serem executadas. Custo associado à execução de cada operação. Ocupação de Espaço em Memória

Complexidade Exemplo A1 A2 A3 A4 A5 Sejam 5 algoritmos A1 a A5   para resolver um mesmo problema, de complexidades diferentes. (Supomos que uma operação leva 1 ms para ser efetuada.)   Tk(n) é a complexidade ou seja o número de operações que o algoritmo efectua para n entradas n A1 T1(n)= n A2 T2(n)=nlog n A3 T3(n)=n2 A4 T4(n)=n3 A5 T5(n)=2n 16 0.016s 0.064s 0.256s 4s 1m4s 32 0.032s 0.16s 1s 33s 46 Dias 512 0.512s 9s 4m22s 1 Dia 13h 10137 Séculos   tempo necessário para o algoritmo em função de n entradas

Operações primitivas Atribuição de valores a variáveis Chamadas de métodos Operações aritméticas Comparação de dois números Acesso a elemento de um array Seguir uma referência de objeto (acesso a objeto) Retorno de um método

Algoritmo do exemplo em pseudocódigo arrayMax(A, n): Entrada: array A com n>=1 elementos inteiros Saida: o maior elemento em A tmpMax <- A[0] for i<-1 to n-1 do if tmpMax < A[i] then tmpMax <- A[i] return tmpMax

Algoritmo em operações primitivas tmpMax <- A[0] 2 for i <- 1 to n-1 do 1+n (comparação i<n) Corpo do ciclo if tmpMax < A[i] then 4(n-1) ou 6 (n-1), se trocar max tmpMax <- A[i] return tmpMax 1 Total1= 2+1+n+4(n-1)+1= 5n (melhor caso) Total2= 2+1+n+6(n-1)+1= 7n -2 (pior caso)

Simplificamos a análise Este nível de detalhe é necessário? Na analise de algoritmos é importante concentrar-se na taxa de crescimento do tempo de execução como uma função do tamanho de entrada n, obtendo-se um quadro geral do comportamento. Assim para o exemplo basta saber que o tempo de execução de algoritmo cresce proporcionalmente a n. (O tempo real seria n*factor constante, que depende de SW e HW).

Notação Assintótica Notação O (big O) Definição: Considere uma função f(n) não negativa para todos os inteiros n≥0. Dizemos que “f(n) é O(g(n))” e escrevemos f(n) = O(g(n)), se existem um inteiro n0 e uma constante c>0, tais que para todo o inteiro n≥n0, f(n) ≤ cg(n) Caracteriza o comportamento assintótico de uma função, estabelecendo um limite superior quanto à taxa de crescimento da função em relação ao crescimento de n. Permite ignorar fatores constantes e termos de menor ordem, centrando-se nos componentes que mais afetam o crescimento de uma função.

Diagrama Definição do Grande O

Notação Assintótica Terminologia de classes mais comuns de funções: Logarítmica - O(log n) Linear - O(n) Quadrática - O(n2) Polinomial – O(nk), com k≥1 Exponencial – O(an), com a>1

Ordens mais comuns 2n (exponencial) n2 (quadrática) n log n f n (linear) log n (logarítmica) 1 (constante) n Fonte: Sahni, "Data Structures, Algorithms and Applications in C++"

Teoremas Comportamento assintótico da soma de duas funções cujos comportamentos assintóticos particulares são conhecidos: Se f1(n) = O(g1(n)) e f2(n) = O(g2(n)), então: f1(n) + f2(n) = O(max(g1(n)) , g2(n))) O(k f(n)) = O(f(n)) O(f(n)) O(g(n)) = O(f(n) g(n))

Eficiência de um Algoritmo, mais um exemplo Três algoritmo para calcular 1 + 2 + … n para um n > 0

Eficiência de um Algoritmo O(n) O(n2) O(1) Número de operações necessárias

Eficiência de um Algoritmo O número de operações em função de n

Eficácia O(n)

Eficácia O(n2)

Outro algoritmo de O(n2) Eficácia Outro algoritmo de O(n2)

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

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

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;