Você está na página 1de 86

Estrutura de Dados I 1 / 86

Complexidade de Algoritmos

Professor: Elton Sarmanho1


E-mail: eltonss@ufpa.br
‡°
1 Faculdade de Sistemas de Informação - UFPA/CUTINS

14 de abril de 2022
Estrutura de Dados I 2 / 86

Roteiro

Análise Assintótica de Algoritmos


Objetivos

Tipos Abstratos de Dados


Conceitos Gerais
Estrutura de Dados I 3 / 86

Roteiro

Crescimento de funções
Conceitos Gerais
Notação O
Notação Ω
Notação Θ
Notação Assintótica
Notações o e ω: notações estritas
Trabalho 1 - Complexidade de Algoritmos

Referências Bibliográficas
Estrutura de Dados I 4 / 86
Análise Assintótica de Algoritmos
Objetivos

I Esta aula apresenta conceitos gerais sobre complexidade de


algoritmos. Ao final, você deverá compreender os seguintes
tópicos:
I Entender e compreender a importância de medir desempenho
do algoritmo.
I Saber medir desempenho de um algoritmo através da
Anotação assintótica.
Estrutura de Dados I 5 / 86
Análise Assintótica de Algoritmos
Objetivos

I Esta aula apresenta conceitos gerais sobre complexidade de


algoritmos:
I Dados e TAD’s
I Crescimento de funções
I Notações
I Funções
Estrutura de Dados I 6 / 86
Tipos Abstratos de Dados
Conceitos Gerais

I Programas possuem tipos de dados que são caracterı́sticos de


cada implementação
I Preciso definir claramente os tipos de dados
I Tipo de dados é um conjunto de valores munido de um
conjunto de operações
I int, float, char e etc
Estrutura de Dados I 7 / 86
Tipos Abstratos de Dados
Conceitos Gerais

I Um Tipo Abstrato de Dados (TAD) especifica um


comportamento definido pelo usuário em termos de suas
propriedades abstratas:
I Descreve o comportamento de um objeto que independe da
sua implementação e linguaguem de programação, unicamente
através dessas propriedades abstratas
Estrutura de Dados I 8 / 86
Tipos Abstratos de Dados
Conceitos Gerais

Caracterı́sticas do TAD

I Define o comportamento de um tipo de dado sem se


preocupar com sua implementação.
I Necessário uma representação concreta:
I Como TAD é implementado
I como seus dados são manipulados com suas operações
I Base da POO
Estrutura de Dados I 9 / 86
Tipos Abstratos de Dados
Conceitos Gerais

Implementação do TAD

I Por exemplo, pode-se definir um TAD chamado pilha.


I Nele os operadores seriam inserção e remoção da pilha,
ocorrendo no topo da estrutura.
I Os dados seriam elementos da pilha
I A implementação é dependente das estruturas disponı́veis na
linguagem utilizada e de opções de modelagem (estruturas
estáticas ou dinâmicas)
Estrutura de Dados I 10 / 86
Tipos Abstratos de Dados
Conceitos Gerais

Implementação do TAD

I Considere uma aplicação que utilize uma lista de inteiros.


Poderı́amos definir TAD Lista, com as seguintes operações
I Faça lista vazia
I obtenha o primeiro elemento da lista; se a lista estiver vazia,
então retorne nulo;
I insira um elemento na lista.
I Há várias opções de estruturas de dados que permitem uma
implementação eficiente para listas (por ex., o tipo
estruturado arranjo).
Estrutura de Dados I 11 / 86
Tipos Abstratos de Dados
Conceitos Gerais

Implementação do TAD

I Cada operação do tipo abstrato de dados é implementada


como um procedimento na linguagem de programação
escolhida
I Qualquer alteração na implementação do TAD fica restrita à
parte encapsulada, sem causar impactos em outras partes do
código.
I Cada conjunto diferente de operações define um TAD
diferente, mesmo atuando sob um mesmo modelo
matemático.
I A escolha adequada de uma implementação depende
fortemente das operações a serem realizadas sobre o modelo.
Estrutura de Dados I 12 / 86
Crescimento de funções
Conceitos Gerais

I Normalmente baseada em uma descrição em pseudo-código


I Caracteriza a complexidade de tempo em função do
tamanho da entrada (n)
I um algoritmo assintoticamente mais eficiente é a melhor
escolha para todas as entradas, exceto as de tamanho
pequeno.
I permite analisar a complexidade de um algoritmo
independente do ambiente computacional utilizado
Estrutura de Dados I 13 / 86
Crescimento de funções
Notação O

Definição
I Para uma dada função g (n), denotamos O(g (n)) o conjunto
de funções como:
O(g (n)) = {f (n) : existem constantes positivas c e n0 tais
que 0 ≤ f (n) ≤ c · g (n) para todo n ≥ n0 }
I uma função f (n) pertence ao conjunto O(g (n)) se existe uma
constante positiva c de forma que ela possa estar limitada por
c · g (n) para um valor de n suficienemente grande.
I Dizemos que f (n) ∈ O(g (n)), porém podemos adotar
f (n) = O(g (n)) (Abuso da notação de igualdade)
I Na maiora dos casos estamos interessados no limite superior,
pois queremos saber no pior caso, qual a complexidade de
tempo
Estrutura de Dados I 14 / 86
Crescimento de funções
Notação O

I Para todos os valores de n à


direita de n0 , o valor de f (n)
reside em c.g(n) ou abaixo desse
I A função g (n) estabele um limite
Assintótico superior para f (n)
I Exemplo: an + b = O(n2 )
I Podemos pensar nessa
equação como sendo
an + b ≤ O(n2 ) ou
an + b ∈ O(n2 )
I Pois a taxa de
Crescimento linear é
menor ou igual a taxa
quadrática
Estrutura de Dados I 15 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Estrutura de Dados I 16 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
Estrutura de Dados I 17 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
Estrutura de Dados I 18 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
n + 5 ≤ c.n
Estrutura de Dados I 19 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
n + 5 ≤ c.n
5 ≤ c.n − n
Estrutura de Dados I 20 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
n + 5 ≤ c.n
5 ≤ c.n − n
c.n − n ≥ 5
Estrutura de Dados I 21 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
n + 5 ≤ c.n
5 ≤ c.n − n
c.n − n ≥ 5
n(c − 1) ≥ 5
Estrutura de Dados I 22 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
n + 5 ≤ c.n
5 ≤ c.n − n
c.n − n ≥ 5
n(c − 1) ≥ 5
5
n≥
c −1
Estrutura de Dados I 23 / 86
Crescimento de funções
Notação O

Exemplos

1. n + 5 é O(n)
Vamos encontrar c e n0
f (n) ≤ c.n
n + 5 ≤ c.n
5 ≤ c.n − n
c.n − n ≥ 5
n(c − 1) ≥ 5
5
n≥
c −1
c = 2 e n0 = 5
Estrutura de Dados I 24 / 86
Crescimento de funções
Notação O

Exemplos - Aluno

2. 2n + 10 é O(n) Qual valor de c e n0 ?


Estrutura de Dados I 25 / 86
Crescimento de funções
Notação O

Exemplos

3. 2n2 + 1 é O(n2 ) Qual valor de c e n0 ?


Estrutura de Dados I 26 / 86
Crescimento de funções
Notação O

Exemplos

3. 2n2 + 1 é O(n2 ) Qual valor de c e n0 ?


Estrutura de Dados I 27 / 86
Crescimento de funções
Notação O

Exemplos

3. 2n2 + 1 é O(n2 ) Qual valor de c e n0 ?


Preciso encontrar c > 0 e n0 ≥ 1 tais que 2n2 + 1 ≤ c.n2 para
n ≥ n0
Estrutura de Dados I 28 / 86
Crescimento de funções
Notação O

Exemplos

3. 2n2 + 1 é O(n2 ) Qual valor de c e n0 ?


Preciso encontrar c > 0 e n0 ≥ 1 tais que 2n2 + 1 ≤ c.n2 para
n ≥ n0
Estabelecendo que 2n2 + 1 ≤ (2 + 1).n2 , podemos tomar
c = 3 e qualquer n0 ≥ 1
Estrutura de Dados I 29 / 86
Crescimento de funções
Notação O

Exemplos - Aluno

4. 3n3 + 20n2 + 6 é O(n3 ) Qual valor de c e n0 ?


Estrutura de Dados I 30 / 86
Crescimento de funções
Notação O

Exemplos

5. 3 log n + 3 é O(log n) Qual valor de c e n0 ?


Estrutura de Dados I 31 / 86
Crescimento de funções
Notação O

Exemplos

5. 3 log n + 3 é O(log n) Qual valor de c e n0 ?


Vamos encontrar c > 0 e n0 ≥ 1 tais que 3 log n + 3 ≤ c. log n
para todo n ≥ n0
Estrutura de Dados I 32 / 86
Crescimento de funções
Notação O

Exemplos

5. 3 log n + 3 é O(log n) Qual valor de c e n0 ?


Vamos encontrar c > 0 e n0 ≥ 1 tais que 3 log n + 3 ≤ c. log n
para todo n ≥ n0
Note que 3 log n + 3 ≤ (3 + 3). log n é verdade se n > 1
(log 1 = 0)
Estrutura de Dados I 33 / 86
Crescimento de funções
Notação O

Exemplos

5. 3 log n + 3 é O(log n) Qual valor de c e n0 ?


Vamos encontrar c > 0 e n0 ≥ 1 tais que 3 log n + 3 ≤ c. log n
para todo n ≥ n0
Note que 3 log n + 3 ≤ (3 + 3). log n é verdade se n > 1
(log 1 = 0)
Basta tomar c = 6 e qualquer n0 ≥ 2
Estrutura de Dados I 34 / 86
Crescimento de funções
Notação O

Exemplos

6. 2n+4 é O(2n ) Qual valor de c e n0 ?


Estrutura de Dados I 35 / 86
Crescimento de funções
Notação O

Exemplos

6. 2n+4 é O(2n ) Qual valor de c e n0 ?


Preciso que c > 0 e n0 ≥ 1 tais que 2n+4 ≤ c.2n para todo
n ≥ n0
Estrutura de Dados I 36 / 86
Crescimento de funções
Notação O

Exemplos

6. 2n+4 é O(2n ) Qual valor de c e n0 ?


Preciso que c > 0 e n0 ≥ 1 tais que 2n+4 ≤ c.2n para todo
n ≥ n0
Veja que 2n+4 = 2n .24 = 2n .16
Estrutura de Dados I 37 / 86
Crescimento de funções
Notação O

Exemplos

6. 2n+4 é O(2n ) Qual valor de c e n0 ?


Preciso que c > 0 e n0 ≥ 1 tais que 2n+4 ≤ c.2n para todo
n ≥ n0
Veja que 2n+4 = 2n .24 = 2n .16
Basta tomar c = 16 e qualquer n0 ≥ 1
Estrutura de Dados I 38 / 86
Crescimento de funções
Notação O

Notação assintótica em equações e desigualdades

I Temos que igualdade nesses casos é usda no sentido de


“representatividade”.
I Um conjunto em uma fórmula representa uma função
anônima naquele conjunto

I f (n) = n2 + O(n)
Significa que existe uma função h(n) ∈ O(n) de forma que
f (n) = n2 + h(n)
Estrutura de Dados I 39 / 86
Crescimento de funções
Notação Ω

Definição
I Para uma dada função g (n), denotamos Ω(g (n)) o conjunto
de funções como:
Ω(g (n)) = {f (n) : existem constantes positivas c e n0 tais
que 0 ≤ c · g (n) ≤ f (n) para todo n ≥ n0 }
I uma função f (n) pertence ao conjunto Ω(g (n)) se existe uma
constante positiva c de forma que ela possa estar limitada por
c · g (n) para um valor de n suficienemente grande.
I Dizemos que f (n) ∈ Ω(g (n)), porém podemos adotar
f (n) = Ω(g (n)) (Abuso da notação de igualdade)
Estrutura de Dados I 40 / 86
Crescimento de funções
Notação Ω

I Para todos os valores de n à


direita de n0 , o valor de f (n)
reside em c.g(n) ou acima desse
I A função g (n) estabele um limite
Assintótico inferior para f (n)
I Exemplo: 2n2 + n = Ω(n)
I Podemos pensar nessa
equação como sendo
2n2 + n ≥ Ω(n), ou seja,
a taxa de Crescimento de
2n + n é maior ou igual
a taxa de n
Estrutura de Dados I 41 / 86
Crescimento de funções
Notação Ω

Exemplo 1

I n = Ω(log(n))

I Como n ≤ c · log(n) para
c >0
I Dizemos: “Raiz de n é, pelo
menos, omega de log n” para
um n suficienemente grande
Estrutura de Dados I 42 / 86
Crescimento de funções
Notação Ω

Exemplo 2
Exemplo 1
I 6n2 + n = Ω(n)

I n = Ω(log(n)) I 6n2 + n ≤ c.n

I Como n ≤ c · log(n) para I 6n + 1 ≤ c
c >0 I 6n ≤ c − 1
I Dizemos: “Raiz de n é, pelo c −1
menos, omega de log n” para I n≤
6
um n suficienemente grande I Para n0 = 1 temos de tomar
c=7
Estrutura de Dados I 43 / 86
Crescimento de funções
Notação Θ

Definição
I Para uma dada função g (n), denotamos Θ(g (n)) o conjunto
de funções como:
Θ(g (n)) = {f (n) : existem constantes positivas c1 , c2 e n0
tais que 0 ≤ c1 · g (n) ≤ f (n) ≤ c2 · g (n) para todo n ≥ n0 }
I uma função f (n) pertence ao conjunto Θ(g (n)) se existem
constantes positiva c1 e c2 de forma que ela possa estar
limitada por c1 · g (n) e c2 · g (n) para um valor de n
suficienemente grande.
Estrutura de Dados I 44 / 86
Crescimento de funções
Notação Θ

I Para todos os valores de n à


direita de n0 , o valor de f (n)
reside em c1 .g(n) ou acima dele e
c2 .g(n) ou abaixo dele.
I A função g (n) estabele um limite
Assintótico restrito para f (n)
Estrutura de Dados I 45 / 86
Crescimento de funções
Notação Assintótica

I Como abuso de notação, vamos sempre escrever


f (n) = O(g (n)) ao invés de f (n) ∈ O(g (n))
I Algoritmo 1: f1 (n) = 2n2 + 5n = O(n2 )
Algoritmo 2: f2 (n) = 500n + 400 = O(n)
I Um polinômio de grau d é de ordem O(nd ). Como uma
constante pode ser considerada como um polinômio de grau 0,
logo dizemos que uma constante é O(n0 ) = O(1)
I Podemos descartar os termos de mais baixa ordem e
coeficientes do termo de mais alta ordem
Estrutura de Dados I 46 / 86
Crescimento de funções
Notação Assintótica

limite superior
I Seja dado um problema, multiplicação de duas matrizes
quadradas n × n
I Conhecemos um algoritmo para resolver este problema (pelo
método trivial) de complexidade O(n3 )
I Sabemos que a complexidade deste problema não deve
superar O(n3 ), uma vez que existe um algoritmo que o resolve
com essa complexidade.
I O limite superior (upper bound) deste problema é O(n3 )
I limite superior de um problema pode mudar se alguém
descobrir um outro algoritmo melhor

O(n3 )
Estrutura de Dados I 47 / 86
Crescimento de funções
Notação Assintótica

limite superior

I O algoritmo de Strassen reduziu a complexidade para


O(nlog 7 ). Então um novo limite superior é criado.

O(nlog 7 ) O(n3 )
Estrutura de Dados I 48 / 86
Crescimento de funções
Notação Assintótica

limite superior

I O algoritmo de Strassen reduziu a complexidade para


O(nlog 7 ). Então um novo limite superior é criado.
I Coppersmith e Winograd melhoraram ainda para O(n2.376 )
I Note que limite superior de um problema depende do
algoritmo. Pode diminuir quando aparecer um algoritmo
melhor.

O(n2.376 ) O(nlog 7 ) O(n3 )


Estrutura de Dados I 49 / 86
Crescimento de funções
Notação Assintótica

Análise do uso da notação assintótica

I Para dois algoritmos, considere as funções de eficiência:


I f (n) = 1000n
I g (n) = n2
I f é maior do que g para valores pequenos de n
I g cresce mais rapidamente e podemos observar que no ponto
onde n = 1.000 ocorre a mudança de comportamento g > f
I Conforme as notações vistas, se existe um n0 a partir do qual
c · f (n) é pelo menos tão grande quanto g (n), então,
desprezando os fatores constantes e considerando n0 = 1000 e
c = 1:
I f (n) = O(n2 )
I O que mostra que para n ≥ 1000, n2 é um limitante superior
para f (n)
Estrutura de Dados I 50 / 86
Crescimento de funções
Notação Assintótica

Análise do uso da notação assintótica: Funções


Estrutura de Dados I 51 / 86
Crescimento de funções
Notação Assintótica

Análise do uso da notação assintótica: Funções

Constante: ≈ 1
I Independente do tamanho de n, quantidade de
operações executadas é uma quantidade fixa de
vezes
Logarı́tmica: ≈ logb n
I Tı́pica de algoritmos que resolvem um problema
transformando-o em problemas menores.
Linear: ≈ n
I Uma certa quantidade de operações é
processada sobre cada um dos elementos de
entrada
I Situação ideal para quando é preciso processar
entrada e obter n elementos de saı́da
Estrutura de Dados I 52 / 86
Crescimento de funções
Notação Assintótica

Análise do uso da notação assintótica: Funções


Log Linear(ou n-log-n): ≈ n · logb n
I São algoritmos que resolvem um problema
transformando-o em problemas menores,
resolvem cada um de forma independente e
depois agrupam as soluções.
Quadrática: ≈ n 2

I ocorre quando os dados são processados aos


pares, com laços de repetição aninhados
I São úteis para solucionar problemas de tamanho
relativamente pequeno.
Exponencial e Fatorial: ≈ an e ≈ n!
I Normalmente ocorre quando se usa uma solução
de força bruta
I não são úteis do ponto de vista prático
Estrutura de Dados I 53 / 86
Crescimento de funções
Notação Assintótica

Eficiência Assintótica
Estrutura de Dados I 54 / 86
Crescimento de funções
Notação Assintótica

Eficiência Assintótica
Estrutura de Dados I 55 / 86
Crescimento de funções
Notação Assintótica

Eficiência Assintótica
Estrutura de Dados I 56 / 86
Crescimento de funções
Notação Assintótica

Medida de Complexidade

I 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.)
I Tk (n) é a complexidade ou seja o número de operações que o
algoritmo efetua para n entradas
Estrutura de Dados I 57 / 86
Crescimento de funções
Notação Assintótica

Exercı́cio

I Um algoritmo tradicional e muito utilizado possui


complexidade f (n) = n1.3 enquanto um algoritmo novo
proposto é da ordem de g (n) = n · log n
I Qual o melhor algoritmo ?
Estrutura de Dados I 58 / 86
Crescimento de funções
Notação Assintótica

Exercı́cio
Estrutura de Dados I 59 / 86
Crescimento de funções
Notação Assintótica

Exercı́cio

n1.3
f (n) = = n0.3
n
n log n
g (n) = = log n
n

∀n > 0 temos que g (n) < f (n)


.

Uma vez que f (n) cresce mais rapidamente do que g (n)


Estrutura de Dados I 60 / 86
Crescimento de funções
Notação Assintótica

Dicas de análise na prática

I Se f (n) for um polinômio de grau d então f (n) é O(nd )


I despreze os termos de menor ordem
I despreze os fatores constantes
I Use a menor classe de funções possı́vel
I 3n é O(n) , ao invés de 3n é O(3n)
I Use a expressão mais simples
I 3n + 5 é O(n) , ao invés de 3n + 5 é O(3n)
Estrutura de Dados I 61 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo

Repetições : o tempo de execução é pelo menos o tempo dos


comandos dentro da repetição multiplicada pelo
número de vezes que é executada.
I Veja pseudo código abaixo é O(n)
z = 1
Para x de 1 Ate n Faca:
z = z * x
Estrutura de Dados I 62 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo

Repetições aninhadas : O processo de análise é realizado do


processo mais interno ao externo
I o tempo total é o tempo de execução dos
comandos multiplicado pelo produto do
tamanho de todas as repetições
I Veja o exemplo a seguir em que é O(n2 )
matriz = [n,n]
Para linha de 1 Ate n Faca:
Para coluna de 1 Ate n Faca:
printa(matriz[linha,coluna])
Estrutura de Dados I 63 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo

Condições : o tempo nunca é maior do que o tempo do teste


entretanto considere o tempo do maior entre os
comandos dentro do bloco do “então” e do “senão”.
I Veja o exemplo a seguir em que é O(n). Devido
segundo bloco ser maior Tempo de execução
Se (x < y):
x = y + 1
Senao:
Para x de 1 Ate n Faca:
y = y + x * 2
Estrutura de Dados I 64 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo

Chamadas à subrotinas : a subrotina deve ser analisada


primeiro e depois ter suas unidades de tempo
incorporadas ao programa que a chamou.
Estrutura de Dados I 65 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo - Exercı́cio


Estrutura de Dados I 66 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo - Exercı́cio


Estrutura de Dados I 67 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo - Exercı́cio


Estrutura de Dados I 68 / 86
Crescimento de funções
Notação Assintótica

Analisando Algoritmo - Exercı́cio - Aluno


Estrutura de Dados I 69 / 86
Crescimento de funções
Notação Assintótica

Relações e Teorema
Estrutura de Dados I 70 / 86
Crescimento de funções
Notação Assintótica

Relações e Teorema
Estrutura de Dados I 71 / 86
Crescimento de funções
Notação Assintótica

Relações e Teorema
Estrutura de Dados I 72 / 86
Crescimento de funções
Notações o e ω: notações estritas

I Similares com as notações O e Ω. Porém, a desigualdade deve


valer para qualquer constante c.
I Para g (n), denotamos o(g (n)) o conjunto de funções:
o(g (n)) : {f (n) para qualquer c > 0 e n0 > 0 tais que
0 ≤ f (n) < c · g (n) para todo n ≥ n0 }
I Para g (n), denotamos ω(g (n)) o conjunto de funções:
ω(g (n)) : {f (n) para qualquer c > 0 e n0 > 0 tais que
0 ≤ c · g (n) < f (n) para todo n ≥ n0 }
I f (n) ∈ ω(g (n)) se e somente se g (n) ∈ o(f (n))
Estrutura de Dados I 73 / 86
Crescimento de funções
Notações o e ω: notações estritas

I Intuitivamente, na notação o, a função f (n) torna-se


insignificante em relação a g (n) à medida que n se aproxima
do infinito, isto é:
f (n)
lim =0
n→∞ g (n)
Estrutura de Dados I 74 / 86
Crescimento de funções
Notações o e ω: notações estritas

I Intuitivamente, na notação ω, a função f (n) torna-se


arbitrariamente grande em relação a g (n) à medida que n se
aproxima do infinito, isto é:

f (n)
lim =∞
n→∞ g (n)
Estrutura de Dados I 75 / 86
Crescimento de funções
Notações o e ω: notações estritas

I Intuitivamente, na notação ω, a função f (n) torna-se


arbitrariamente grande em relação a g (n) à medida que n se
aproxima do infinito, isto é:

f (n)
lim =∞
n→∞ g (n)
Estrutura de Dados I 76 / 86
Crescimento de funções
Notações o e ω: notações estritas

I Exemplo: 3n2 é o(n3 )


I Desprezando os coeficientes, n2 é sempre menor que n3 para
um n suficientemente grande, é preciso apenas determinar n0
em função de c.
Estrutura de Dados I 77 / 86
Crescimento de funções
Notações o e ω: notações estritas

I Exemplo: 3n2 é o(n3 )


I Desprezando as constantes, n2 é sempre menor que n3 para
um n suficientemente grande, é preciso apenas determinar n0
em função de c.
3n2 < c.n3
3 < c.n
3
<c
c
A desigualdade vale para n0 ≥ 3 e c = 3
Estrutura de Dados I 78 / 86
Crescimento de funções
Notações o e ω: notações estritas

I 2n3 é o(n3 )
Estrutura de Dados I 79 / 86
Crescimento de funções
Notações o e ω: notações estritas

I 2n3 é o(n3 )
I (Desprezando as constantes) não podemos dizer que n3 é
sempre menor que n3 para um n suficientemente grande.
Estrutura de Dados I 80 / 86
Crescimento de funções
Notações o e ω: notações estritas

Exercı́cios de Anotação

Questão 1 Escrever as seguintes funções em notação O:


n3 –1; n2 + 2 log n; 3nn + 5 · 2n ; (n–1)n + nn–1 .
Estrutura de Dados I 81 / 86
Crescimento de funções
Trabalho 1 - Complexidade de Algoritmos

1. Implemente e calcule a complexidade dos seguintes algoritmos


a) Escreva um algoritmo para encontrar o maior
elemento do Array de tamanho n.
b) Escreva um algoritmo para calcular
exponenciação de x y .
c) Escreva um algoritmo para verificar se palavra é
palı́ndromo.
2. Prove 2n+1 = O(2n ) ? 22n = O(2n ) ?
Estrutura de Dados I 82 / 86
Crescimento de funções
Trabalho 1 - Complexidade de Algoritmos

3. Dois algoritmos A e B possuem complexidade n5 e 2n ,


respectivamente. Você utilizaria o algoritmo B ao invés do A.
Em qual caso? Exemplifique.
Estrutura de Dados I 83 / 86
Crescimento de funções
Trabalho 1 - Complexidade de Algoritmos

4. Podemos dizer que o algoritmo abaixo é O(n2 )? Justifique.


Estrutura de Dados I 84 / 86
Referências Bibliográficas

Referências I

Lee K.D., Hubbard S. (2015) Trees. In: Data Structures and


Algorithms with Python. Undergraduate Topics in Computer
Science. Springer, Cham. Retrieved from
https://doi.org/10.1007/978-3-319-13072-9_6
Hubbard, J. (2007). Schaum’s Outline sof Data Structures
with Java. Retrieved from http://www.amazon.com/
Schaums-Outline-Data-Structures-Java/dp/
0071476989
Cormen, T. H., Leiserson, C. E., & Stein, R. L. R. E. C.
(2012). Algoritmos: teoria e prática. Retrieved from
https://books.google.com.br/books?id=6iA4LgEACAAJ.
Estrutura de Dados I 85 / 86
Referências Bibliográficas

Referências II

Ascenio, Ana Fernanda Gomes. Estrutura de dados:


Algoritmos, análise da complexidade e implementações em
Java e C++. São Paulo: Pearson Prentice Hall, 2010.
Szwarcfiter, Jayme Luiz. Estruturas de dados e seus algoritmos
/ Jayme Luiz Szwarcfiter, Lilian Markenzon. 3.ed. [Reimpr.]. -
Rio de Janeiro : LTC, 2015.
Capı́tulo 20: Árvores — documentação Aprenda Computação
com Python 3.0 2009.1. Retrieved from
https://mange.ifrn.edu.br/python/aprenda-com-py3/
capitulo_20.html
Estrutura de Dados I 86 / 86

Complexidade de Algoritmos

Professor: Elton Sarmanho1


E-mail: eltonss@ufpa.br
‡°
1 Faculdade de Sistemas de Informação - UFPA/CUTINS

14 de abril de 2022

Você também pode gostar