Análise de Algoritmos Estrutura de Dados II

Propaganda
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Universidade Federal do Espírito Santo
Centro de Ciências Exatas, Naturais e de Saúde – CCENS-UFES
Departamento de Computação
Análise de Algoritmos
Estrutura de Dados II
Estrutura de Dados II
COM10078 – 2017-I
Prof. Marcelo Otone Aguiar
[email protected]
www.marceloaguiar.pro.br
Universidade Federal do Espírito Santo - CCENS-UFES
Conteúdo Programático da Disciplina
- Análise de Algoritmos
‣Introdução;
‣Contando instruções;
‣Comportamento Assintótico;
‣Tipos de Análise Assintótica;
‣Notação Grande O;
‣Classes de Problemas;
2
C.H. Prevista
2 horas
Universidade Federal do Espírito Santo
CCENS-UFES
1
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
“Análise de Algoritmos”
•
•
Em ciência da computação, é a área de pesquisa
cujo foco são os algoritmos.
Busca responder a seguinte pergunta:
“podemos fazer um algoritmo mais eficiente?”
Universidade Federal do Espírito Santo
CCENS-UFES
3
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
•
Podemos resolver um problema de várias maneiras
diferentes, isto é, podemos utilizar algoritmos diferentes
para um mesmo problema.
•
•
Essas diferenças de eficiência podem ser
•
•
4
Algoritmos diferentes, mas capazes de resolver o
mesmo problema, não necessariamente o fazem com a
mesma eficiência.
“irrelevantes” para um pequeno número de elementos
processados
“crescer proporcionalmente” com o número de
elementos processados
Universidade Federal do Espírito Santo
CCENS-UFES
2
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
•
•
Para comparar a eficiência dos algoritmos foi criada uma
medida chamada de “complexidade computacional”
Basicamente, ela indica o “custo” ao se aplicar um
algoritmo, sendo
“custo = memória + tempo”
Em que o item
•
•
“memória”: quanto de espaço o algoritmo vai consumir
“tempo”: a duração de sua execução
Universidade Federal do Espírito Santo
CCENS-UFES
5
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
•
Para determinar se um algoritmo é o mais eficiente,
podemos utilizar duas abordagens
•
•
6
“Análise empírica”: comparação entre os programas
“Análise matemática”: estudo das propriedades do
algoritmo
Universidade Federal do Espírito Santo
CCENS-UFES
3
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
“Análise empírica”
•
Avalia o custo (ou complexidade) de um algoritmo a partir da
avaliação da execução do mesmo quando implementado
•
Ou seja, um algoritmo é analisado pela execução de seu
programa correspondente
“Vantagens”
•
•
•
•
Avaliar o desempenho em uma determinada configuração de
computador / linguagem
Considerar custos não aparentes (ex: o custo da alocação de
memória)
Comparar computadores
Comparar linguagens
Universidade Federal do Espírito Santo
CCENS-UFES
7
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
“Análise empírica”
“Desvantagens”
•
Necessidade de implementar o algoritmo.
Isso depende da habilidade do programador;
•
•
Resultado pode ser mascarado pelo hardware (computador
utilizado) ou software (eventos ocorridos no momento da
avaliação)
Qual a natureza dos dados:
•
•
•
8
Dados reais
Aleatórios (avaliam o desempenho médio)
Perversos (pior caso)
Universidade Federal do Espírito Santo
CCENS-UFES
4
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
“Análise matemática”
•
•
•
Permite um estudo formal de um algoritmo ao nível “ideia”
por trás do algoritmo
Faz uso de um computador idealizado e simplificações
que buscam considerar somente os custos dominantes do
algoritmo
A medição do tempo gasto é feita de maneira
independente do “hardware” ou da “linguagem” usada na
sua implementação
Universidade Federal do Espírito Santo
CCENS-UFES
9
Universidade Federal do Espírito Santo - CCENS-UFES
Análise de Algoritmos
“Análise matemática”
“Vantagens”
•
•
10
Detalhes de baixo nível, como a linguagem de
programação utilizada, o hardware no qual o algoritmo é
executado, ou o conjunto de instruções da CPU, são
ignorados
Permite entender como um algoritmo se comporta à
medida que o conjunto de dados de entrada cresce.
Assim, podemos expressar a relação entre o conjunto de
dados de entrada.
Universidade Federal do Espírito Santo
CCENS-UFES
5
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
CONTANDO INSTRUÇÕES
Universidade Federal do Espírito Santo
CCENS-UFES
11
Universidade Federal do Espírito Santo - CCENS-UFES
Contando Instruções
“Análise matemática”
“Contando instruções de um algoritmo”
•
Este algoritmo procura o maior valor presente em um
array “A” contendo “n” elementos e o armazena na
variável “M”
int M = A[0];
for (i = 0; i < n; i++) {
if (A[i] >= M) {
M = A[i];
}
}
12
Universidade Federal do Espírito Santo
CCENS-UFES
6
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Contando Instruções
•
•
•
•
Vamos contar quantas “instruções simples” ele executa
Uma “instrução simples” é uma instrução que pode ser executada
diretamente pelo CPU, ou algo muito perto disso
Tipos de instruções:
Atribuição de um valor a uma variável
Acesso ao valor de um determinado elemento do array
Comparação de dois valores
Incremento de um valor
Operações aritméticas básicas, como adição e multiplicação
•
•
•
•
•
Vamos assumir que:
As instruções possuem o mesmo “custo”
“comandos de seleção” possuem custo zero
•
•
Universidade Federal do Espírito Santo
CCENS-UFES
13
Universidade Federal do Espírito Santo - CCENS-UFES
Contando Instruções
/*1*/ int M = A[0];
/*2*/ for (i = 0; i < n; i++) {
/*3*/
if (A[i] >= M) {
/*4*/
M = A[i];
/*5*/
}
/*6*/}
O custo da “linha 1” é de “1 instrução”
Na “linha 1”, o valor da primeira posição do array é
copiado para a variável “M”
Acessar o valor “A[0]” é atribuir a “M”
•
•
•
14
Universidade Federal do Espírito Santo
CCENS-UFES
7
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Contando Instruções
/*1*/ int M = A[0];
/*2*/ for (i = 0; i < n; i++) {
/*3*/
if (A[i] >= M) {
/*4*/
M = A[i];
/*5*/
}
/*6*/}
O custo da inicialização do laço “for” (“linha 2”) é de “2
instruções”
O comando “for” precisa ser inicializado:
“1 instrução” (“i = 0”)
Mesmo que o array tenha tamanho zero, ao menos uma
comparação será executada (“i < n”), o que custa mais “1
instrução”
•
•
•
Universidade Federal do Espírito Santo
CCENS-UFES
15
Universidade Federal do Espírito Santo - CCENS-UFES
Contando Instruções
•
•
O custo para executar o comando de laço “for” (“linha 2”) é de “2n
instruções”
Ao final de cada iteração do laço “for”, precisamos executar uma
instrução de
Incremento (“i++”)
Comparação para verificar se vamos continuar no laço “for” (“i
< n”)
O laço “for” será executado “n” vezes. Assim, essas “2” instruções
também serão executadas “n” vezes: “2n” instruções
•
•
•
/*1*/ int M = A[0];
/*2*/ for (i = 0; i < n; i++) {
/*3*/ if (A[i] >= M) {
/*4*/
M = A[i];
/*5*/
}
/*6*/}
16
Universidade Federal do Espírito Santo
CCENS-UFES
8
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
•
Custo Dominante ou Pior caso do
Algoritmo
Ignorando os comandos contidos no corpo do laço “for”,
teremos que o algoritmo precisa executar “3 + 2n”
instruções:
3 instruções antes de iniciar o laço “for”
2 instruções ao final de cada laço “for”, o qual é
executado “n” vezes
•
•
•
17
Assim, considerando um “laço vazio”, podemos definir
uma função matemática que representa o custo do
algoritmo em relação ao tamanho do array de entrada:
“f(n) = 2n + 3”
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Custo Dominante ou Pior caso do
Algoritmo
“Contando as instruções restantes do for”
Comando “if”. “1 instrução”: acesso ao valor do array e a
sua comparação (“A[i] >= M”)
Dentro do “if”. “1 instrução”: acessa o valor do array e o
atribui a outra variável (“M = A[i]”). Porém, sua execução
depende do resultado da comparação feita pelo “if”.
•
•
“Problema”
As instruções vistas anteriormente eram sempre
executadas
As instruções dentro do “for” podem ou não ser
executadas
•
•
18
Universidade Federal do Espírito Santo
CCENS-UFES
9
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
•
•
•
•
Custo Dominante ou Pior caso do
Algoritmo
Antes, bastava saber o tamanho do array, “n”, para definir
a função de custo “f(n)”.
Agora temos que considerar também o conteúdo do array.
Exemplo: dois arrays de mesmo tamanho
A1 = {1, 2, 3, 4}
A2 = {4, 3, 2, 1}
Array “A1”: mais instruções -> o comando “if” é sempre
“verdadeiro”
Array “A2”: atribuição nunca é executada pois o comando
“if” é sempre “falso”
Universidade Federal do Espírito Santo
CCENS-UFES
19
Universidade Federal do Espírito Santo - CCENS-UFES
•
•
•
Custo Dominante ou Pior caso do
Algoritmo
Ao analisarmos um algoritmo, é muito comum considerarmos o
“pior caso” possível
“Pior caso”: maior número de instruções executadas
No nosso algoritmo o “pior caso” ocorre quando o array possui
valores em ordem crescente.
O valor de “M” é sempre substituído:
Maior número de instruções
O laço “for” sempre executa as 2 instruções
•
•
•
Assim, a função custo do algoritmo será
“f(n) = 3 + 2n + 2n” ou “f(n) = 4n + 3”.
Essa função representa o custo do algoritmo em relação ao tamanho
do array (“n”) de entrada no “pior caso”
20
Universidade Federal do Espírito Santo
CCENS-UFES
10
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
COMPORTAMENTO
ASSINTÓTICO
21
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
Vimos que o custo para o algoritmo abaixo é dado pela
função:
“f(n) = 4n + 3”
/*1*/ int M = A[0];
/*2*/ for (i = 0; i < n; i++) {
/*3*/ if (A[i] >= M) {
/*4*/
M = A[i];
/*5*/
}
/*6*/}
•
Essa é a função de complexidade de tempo.
Ela nos dá uma ideia do custo de execução do algoritmo para
um problema de tamanho “n”.
22
Universidade Federal do Espírito Santo
CCENS-UFES
11
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
“Dúvida”
Será que todos os termos da função “f” são necessários
para termos noção do custo?
•
•
•
•
De fato, nem todos os termos são necessários
Podemos descartar certos termos na função e manter
apenas os que nos dizem o que acontece com a função
quando o tamanho dos dados de entrada (“n”) cresce
muito.
Se um algoritmo é mais rápido do que outro para um
grande conjunto de dados de entrada, é muito provável
que ele continue sendo também mais rápido em um
conjunto de dados menor
Universidade Federal do Espírito Santo
CCENS-UFES
23
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
•
•
•
•
•
24
Podemos descartar todos os termos que crescem
lentamente e manter apenas os que crescem mais rápido
à medida que o valor de “n” se torna maior
A função, “f(n) = 4n + 3”, pois dois termos:
“4n”
“3”
•
•
O termo “3” é uma “constante de inicialização”
Não se altera à medida que “n” aumenta
Assim, nossa função pode ser reduzida para
“f(n) = 4n”
Universidade Federal do Espírito Santo
CCENS-UFES
12
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
Constantes que multiplicam o termo “n” da função também
devem ser descartadas
Isso faz sentido se pensarmos em diferentes linguagens
de programação. Por exemplo, a seguinte linha de código
em Pascal
M := A[i];
Equivale ao seguinte código em linguagem C
if (i >= 0 && i < n)
M = A[i];
•
•
25
O acesso a um elemento do array
Pascal: 3 instruções (etapa de verificação)
C: 1 instrução (sem etapa de verificação)
•
•
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
Ignorar essas constantes de multiplicação equivale a
ignorar as particularidades de cada linguagem e
compilador e analisar apenas a ideia do algoritmo
•
Assim, nossa função pode ser reduzida para
“f(n) = n”
Descartando todos os termos constantes e mantendo
apenas o de maior crescimento, obtemos o
“comportamento assintótico”
Trata-se do comportamento de uma função “f(n)” quando
“n” tende ao infinito
Isso acontece porque o termo que possui o maior
expoente domina o comportamento da função “f(n)”
quando “n” tende ao infinito
•
•
•
26
Universidade Federal do Espírito Santo
CCENS-UFES
13
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
Para entender melhor, considere duas funções:
“g(n) = 1000n + 500”
“h(n) = n^2 + n + 1”
Apesar da função “g(n)” possuir constantes maiores
multiplicando seus termos, existe um valor de “n” a partir
do qual o resultado de “h(n)” é sempre maior do que
“g(n)”, tornando os demais termos e constantes pouco
importantes
27
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
1000n + 500
n^2 + n + 1
28
Universidade Federal do Espírito Santo
CCENS-UFES
14
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
Podemos então suprimir os termos menos importantes da
função e considerar apenas o termo de maior grau
Assim, podemos descrever a complexidade usando
somente o seu custo dominante:
“n” para a função “g(n)”
“n^2” para a função “h(n)”
•
29
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
•
Abaixo podemos ver alguns exemplos de função de custo
juntamente com o seu comportamento assintótico
Se a função não possui nenhum termo multiplicativo por
“n”, seu comportamento assintótico é constante (1)
Função de custo
f(n) = 105
f(n) = 15n+2
f(n) = n2+5n+2
f(n) = 5n3+200n2+112
30
Comportamento Assintótico
f(n) = 1
f(n) = n
f(n) = n2
f(n) = n3
Universidade Federal do Espírito Santo
CCENS-UFES
15
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Comportamento Assintótico
•
De modo geral, podemos obter a função de custo de um
programa simples apenas contando os comandos de
laços aninhados
“Exemplos”
Algoritmo sem laço: número constante de instruções
(exceto se houver recursão), ou seja, “f(n) = 1”
Com um laço indo de 1 a “n” será “f(n) = n” (ou seja, um
conjunto de instruções constantes antes e/ou depois do
laço e um conjunto de instruções constantes dentro do
laço)
Dois comandos de laço aninhados será “f(n) = n2”, e
assim por diante
•
•
•
31
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
TIPOS DE ANÁLISE
ASSINTÓTICA
32
Universidade Federal do Espírito Santo
CCENS-UFES
16
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Tipos de Análise Assintótica
•
A seguir, são matematicamente descritas outras formas
de análise assintótica
•
•
•
•
•
33
“Notação Grande-Omega”
“Notação Grande-O”
“Notação Grande-Theta”
“Notação Pequeno-o”
“Notação Pequeno-omega”
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Notação Grande-Omega
•
•
•
•
34
Descreve o “limite assintótico inferior”
de um algoritmo
É a notação utilizada para analisar o “melhor caso” do
algoritmo.
A notação (n2) nos diz que o custo do algoritmo é,
assintoticamente, maior ou igual a n2
Em outras palavras, o custo do algoritmo original é no
“mínimo” tão ruim quanto n2
Universidade Federal do Espírito Santo
CCENS-UFES
17
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Notação Grande-O
•
•
•
•
35
Descreve o “limite assintótico superior” de um algoritmo
É a notação utilizada para analisar o “pior caso” do
algoritmo.
A notação O(n2) nos diz que o custo do algoritmo é,
assintoticamente, menor ou igual a n2
Em outras palavras, o custo do algoritmo original é no
“máximo” tão ruim quanto n2
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Notação Grande-Theta
•
•
•
•
36
Descreve o “limite assintótico firme” ou “estreito” de um
algoritmo
É a notação utilizada para analisar o limite “inferior” e
“superior” do algoritmo.
A notação (n2) nos diz que o custo do algoritmo é,
assintoticamente, igual a n2
Em outras palavras, o custo do algoritmo original é n2
dentro de um fator constante “acima” e “abaixo”
Universidade Federal do Espírito Santo
CCENS-UFES
18
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Notação Pequeno-o e Pequeno-omega
•
•
•
Parecidas com as notações “Grande-O” e “GrandeOmega”
As notações “Grande-O” e “Grande-Omega” possuem
uma relação de “menor ou igual” e “maior ou igual”
As notações “Pequeno-o” e “Pequeno-omega” possuem
uma relação de “menor” e “maior”
•
Ou seja, não representam limites próximos da função,
mas apenas estritamente
•
•
37
“Superiores”: sempre maior
“Inferiores”: sempre menor
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
NOTAÇÃO GRANDE-O
38
Universidade Federal do Espírito Santo
CCENS-UFES
19
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Notação Grande-O
•
•
•
•
•
39
Universidade Federal do Espírito Santo - CCENS-UFES
•
•
•
Existem várias formas de análise assintótica
A mais conhecida e utilizada é a notação “Grande-O”, “O”
Representa o custo (seja de tempo ou de espaço) do
algoritmo no pior caso possível para todas as entradas de
tamanho “n”
Ou seja, ela analisa o limite superior de entrada
Desse modo, podemos dizer que o comportamento do
nosso algoritmo não pode nunca ultrapassar um certo
limite
Universidade Federal do Espírito Santo
CCENS-UFES
Exemplo: ordenação usando
SelectionSort
Dado um array “y” de tamanho “n”, procurar o menor valor
(posição “me”) e colocar na primeira posição
Repetir processo para a segunda posição, depois para a terceira,
etc.
Para quando o array estiver ordenado
void selectionSort(int *V, int n) {
int i, j, me, troca;
for (i=0; i<n-1; i++) {
me = i;
for (j=i+1; j<n; j++) {
if (V[j] < V[me])
me = j;
}
if (i != me) {
troca = V[i];
V[i] = V[me];
V[me] = troca;
}
}
}
Universidade Federal do Espírito Santo
40
CCENS-UFES
20
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Exemplo: ordenação usando
SelectionSort
•
•
•
Temos dois comandos de laço
Laço externo: executando “n” vezes
Laço interno: número de execuções
Depende do valor do índice do laço externo (n-1, n-2..., 2, 1)
void selectionSort(int *V, int n) {
int i, j, me, troca;
for (i=0; i<n-1; i++) {
me = i;
for (j=i+1; j<n; j++) {
if (V[j] < V[me])
me = j;
}
if (i != me) {
troca = V[i];
V[i] = V[me];
V[me] = troca;
}
}
}
Universidade Federal do Espírito Santo
41
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Exemplo: ordenação usando
SelectionSort
•
Para calcularmos o custo do “selection sort” temos que
calcular o resultado da soma
“1 + 2 + .... + (n – 1) + n”
Essa soma representa o número de execuções do laço
interno, algo que não é tão simples de se calcular
•
•
Dependendo do algoritmo, calcular o seu custo exato
pode ser uma tarefa muito complicada
No nosso caso, a soma
“1 + 2 + .... + (n – 1) + n”
equivale a soma dos “n” termos de uma “progressão
aritmética” de razão 1
n(1+n)
“1 + 2 + .... + (n – 1) + n” =>
•
2
42
Universidade Federal do Espírito Santo
CCENS-UFES
21
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
•
•
•
•
Exemplo: ordenação usando
SelectionSort
Sabemos agora que o número de execuções do laço
interno é “(n(1 + n))/2”
Uma alternativa mais simples seria estimar um “limite
superior”
A ideia é alterar o algoritmo para algo “menos eficiente” do
que temos
Assim, saberemos que o algoritmo original é no máximo
tão ruim, ou talvez melhor, que o novo algoritmo
Universidade Federal do Espírito Santo
CCENS-UFES
43
Universidade Federal do Espírito Santo - CCENS-UFES
•
•
•
Exemplo: ordenação usando
SelectionSort
Podemos diminuir a eficiência do “selection sort” trocando
o laço interno (que muda de tamanho a cada execução do
laço externo) por um laço que seja executado sempre “n
vezes”
Isso simplifica a análise do custo do algoritmo e também
piora o seu desempenho já que algumas execuções do
laço interno serão inúteis.
Agora temos dois comandos de laço aninhados sendo
executados “n” vezes cada
A função de custo passa a ser f(n) = n2
Utilizando a notação “grande-O”, podemos dizer que o
custo do algoritmo no pior caso é O(n2)
•
•
44
Universidade Federal do Espírito Santo
CCENS-UFES
22
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Exemplo: ordenação usando
SelectionSort
“Notação Grande-O”
A notação O(n2) nos diz que o custo do algoritmo não é,
assintoticamente, pior do que n2
Em outras palavras, o custo do algoritmo original é no
máximo tão ruim quanto n2
Pode ser melhor, mas nunca pior
•
•
•
•
•
45
Assim, com a notação “grande-O” podemos estabelecer o
“limite superior” para a complexidade real de um algoritmo
Isso significa que o nosso programa nunca vai ser mais
lento do que um determinado limite
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
CLASSES DE PROBLEMAS
46
Universidade Federal do Espírito Santo
CCENS-UFES
23
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Classes de Problemas
•
•
•
•
Algumas classes de complexidade de problemas são mais
comumente usadas.
“O(1): ordem constante”
•
As instruções são executadas um número fixo de
vezes. Não depende do tamanho dos dados de entrada
“O(log(n)): ordem logarítmica”
•
Típica de algoritmos que resolvem um problema
transformando-o em problemas menores
“O(n): ordem linear”
•
Em geral, uma certa quantidade de operações é
realizada sobre cada um dos elementos de entrada
Universidade Federal do Espírito Santo
CCENS-UFES
47
Universidade Federal do Espírito Santo - CCENS-UFES
Classes de Problemas
•
•
48
“O(nlog(n)): ordem log linear”
•
Típica de algoritmos que trabalham com
particionamento dos dados. Esses algoritmos resolvem
um problema transformando-o em problemas menores,
que são resolvidos de forma independente e depois
unidos (ex: Quicksort)
“O(n2): ordem quadrática”
•
Normalmente ocorre quando os dados são processados
aos pares. Uma característica deste tipo de algoritmos
é a presença de um aninhamento de dois comandos de
repetição
Universidade Federal do Espírito Santo
CCENS-UFES
24
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Classes de Problemas
•
•
•
“O(n3): ordem cúbica”
•
É caracterizado pela presença de três estruturas de
repetição aninhadas
“O(2n): ordem exponencial”
•
Geralmente ocorre quando se usa uma solução de
“força bruta”. Não são úteis do ponto de vista prático
“O (n!): ordem fatorial”
•
Geralmente ocorre quando se usa uma solução de
“força bruta”. Não são úteis do ponto de vista prático.
Possui um comportamento muito pior que o
exponencial
Universidade Federal do Espírito Santo
CCENS-UFES
49
Universidade Federal do Espírito Santo - CCENS-UFES
Classes de Problemas
•
Comparação no tempo de execução. Considerando que o
computador hipotético seja capaz de executar um milhão
de operações por segundo
f(n)
n
n log n
n2
n3
2n
3n
50
n = 10
1,0E-05
segundos
3,3E-05
segundos
1,0E-04
segundos
1,0E-03
segundos
1,0E-03
segundos
5,9E-02
segundos
n = 20
2,0E-05
segundos
8,6E-05
segundos
4,0E-04
segundos
8,0E-03
segundos
1,0 segundo
n = 30
4,0E-05
segundos
2,1E-04
segundos
1,6E-03
segundos
6,4E-02
segundos
2,8 dias
n = 50
5,0E-05
segundos
2,8E-04
segundos
2,5E-03
segundos
0,13
segundos
35,7 anos
58,1 minutos
3855,2
séculos
2,3E+08
séculos
n = 100
6,0E-05
segundos
3,5E-04
segundos
3,6E-03
segundos
0,22
segundos
365,6
séculos
1,3E+13
séculos
Universidade Federal do Espírito Santo
CCENS-UFES
25
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Classes de Problemas
•
•
Na análise assintótica as constantes de multiplicação são
consideradas irrelevantes e descartadas. Porém, elas podem ser
relevantes na prática, principalmente se o tamanho da entrada é
pequeno
“Exemplo”
f(n) = 10100n
•
•
•
51
e
g(n) = 10n log n
Análise assintótica: o primeiro é mais eficiente, complexidade
“O(n)” enquanto o outro é “O(n log n)”
No entanto, 10100 é um número muito grande.neste caso, 10n
log n > 10100n apenas para n > 210 99
Para qualquer valor menor de “n” o algoritmo de complexidade
“O(n\log n)” será melhor
Universidade Federal do Espírito Santo
CCENS-UFES
Universidade Federal do Espírito Santo - CCENS-UFES
Exercício
•
•
52
Forneça uma descrição em pseudocódigo de
um algoritmo de tempo O(n) para calcular a
função potência p(x, n).
Desenhe também o rastreamento recursivo
deste algoritmo para o cálculo de p(2, 5).
Universidade Federal do Espírito Santo
CCENS-UFES
26
28/03/2017
Universidade Federal do Espírito Santo - CCENS-UFES
Exercício
função p(x, n)
se (n = 0) entao
retorna 1
senao
retorna x * p(x, n-1)
X
2
2
2
2
2
2
N
5
4
3
2
1
0
Retorno
32
16
8
4
2
1
Universidade Federal do Espírito Santo
CCENS-UFES
53
Universidade Federal do Espírito Santo - CCENS-UFES
Próximo Conteúdo
- Busca em memória primária
‣Busca sequencial;
‣Busca binária;
54
C.H. Prevista
4 horas
Universidade Federal do Espírito Santo
CCENS-UFES
27
Download