Você está na página 1de 15

DESENVOLVIMENTO DE SISTEMAS

Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMPLEXIDADE DE ALGORITMOS

BIBLIOGRAFIA

Recomenda-se a leitura do livro intitulado “Análise da Complexidade de Algoritmos”, do


Professor Antônio Adrego da Rocha:

Este livro traz a possibilidade de aprofundar os estudos sobre algoritmos.

Algoritmo – Definição

Trata-se de um “conjunto das regras e procedimentos lógicos perfeitamente definidos que


levam à solução de um problema em um número finito de etapas.”
Desta forma há:
ANOTAÇÕES

www.grancursosonline.com.br 1
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Entrada → Processamento → Saída

A título exemplificativo, imagine o processamento de um bolo.


Um bolo, por exemplo, é um algoritmo, pois com uma série de procedimentos é possível
obtê-lo como resultado.

Análise da Complexidade de Algoritmos – Definição

A complexidade algoritmo está relacionada à ideia de desempenho.


Às vezes, para uma mesma função, considerando o exemplo do bolo, é possível haver
vários processos, com resultados mais rápidos e alguns mais demorados.
A complexidade tenta identificar quais são os processos mais rápidos e quais são os pro-
cessos mais demorados, como no gráfico a seguir:

O que faz a Análise da Complexidade de Algoritmos?

Avalia a eficiência do algoritmo em termos dos recursos (memória e tempo de exe-


cução) utilizados.

Deste modo, analisa-se o quanto os algoritmos gastarão de memória e de execução.


Fornece uma medida objetiva de desempenho proporcional ao tempo de execução do
algoritmo.
ANOTAÇÕES

www.grancursosonline.com.br 2
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Neste sentido, a análise visa identificar qual é o melhor algoritmo para resolver um deter-
minado problema.
Exemplos de problemas: fabricar um bolo, ordenar uma lista, achar um elemento de uma
árvore etc.
A análise, portanto, pode ter vários processos para identificação dos problemas, com
possibilidade de haver um processo que seja mais rápido e outro que seja mais lento.

Análise da Complexidade de Algoritmos – Empírica

Consiste em executar os vários algoritmos possíveis (para resolver um problema) em


certo número de vezes e cronometrar o tempo da execução.
Trata-se de uma forma de analisar qual é o melhor algoritmo.

Dificuldades da análise da complexidade de algoritmos:

• Obtenção de dados para a execução;


• Diferenças entre o ambiente de testes e o de execução;
• Consumo de tempo.

Trata-se, portanto, de um processo custoso, pois repete-se a cronometragem por várias


vezes. Neste sentido, há outra forma de analisar a complexidade dos algoritmos, o que será
visto na sequência.

Análise da Complexidade de Algoritmos – Teórica

• É uma forma de avaliar um algoritmo que pode ser mais informativo e menos caro de
se executar.
– Trata-se do consumo de recursos de fácil execução, contrário à cronometragem.

• Baseia-se na análise “estática” do código, ou seja, pela análise dos passos do algoritmo.

Neste caso, observa-se o código sem executá-lo, para identificar o que está acontecendo
e verificar se é um algoritmo mais rápido ou mais demorado.
ANOTAÇÕES

www.grancursosonline.com.br 3
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

• Permite a comparação de diferentes algoritmos, assim como prever a performance em


um novo ambiente.

Desta forma, dado uma certa combinação de algoritmos com várias opções, far-se-á uma
classificação teórica dos algoritmos em relação à performance, sem executá-lo no trecho do
código visando identificar o mais eficiente para resolver o problema.

Análise da Complexidade de Algoritmos – N

• Em geral, algoritmos possuem algum tipo de variação nos parâmetros de entrada que
podem afetar o seu tempo de execução, por exemplo, o tempo de cálculo da média
aritmética de uma sequência de números está diretamente ligado ao comprimento da
sequência – N.

Exemplo: calcular a média de dois números, como 10 e 5, tem-se 10 + 5 = 15 e 15 ÷ 2


= 7,5. No entanto, se for para calcular a medida de cem números, será muito demorado se
utilizar o mesmo algoritmo. Neste sentido, existe uma série de algoritmos que serão influen-
ciados pelos dados de entrada: quanto maior for a quantidade de dados, mais demorado será
o algoritmo.

• A análise teórica fornecerá uma expressão da necessidade de recursos do algoritmo


em função deste N.
5m

Desta forma, identifica-se qual é o fator que está influenciando mais aquele algoritmo e
passa-se a fornecer uma expressão que vai classificá-lo.

Complexidade Constante

Observe o algoritmo abaixo:


ANOTAÇÕES

www.grancursosonline.com.br 4
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A função pegaElemento recebe um vetor em uma determinada posição, ou seja, o obje-


tivo é pegar o elemento que está na posição do vetor.

A primeira informação que esta função verá é o tamanho do vetor que, se for maior, irá
retornar um erro de posição inválida e, depois, “se não” irá retornar o elemento que está
na posição.

• A execução depende das variáveis “vetor” e da “pos”, ou seja, os dados de entrada.


• O número de passos do algoritmo é constante independentemente do dos parâmetros
passados – O(1).

Nesse caso, O(1) será sempre constante. Se houver um vetor com dois elementos, será
verificado o primeiro passo referente ao tamanho e passará 1 e ao fazer a validação, será
verificado o segundo passo e retornará para a mesma posição. Logo, houve 2 passos para
executar algoritmos. Na hipótese de haver 1.000.000 de posições de vetor, esse algoritmo irá
proceder do mesmo modo, ou seja, nesse caso será um algoritmo constante.
Portanto, independentemente da entrada, o custo de processamento é constante e a
quantidade de passos que serão executados para tomar o resultado será a mesma, não
importando a entrada.

Complexidade Variável

Observe o algoritmo abaixo:


ANOTAÇÕES

www.grancursosonline.com.br 5
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A função máxima corresponde a um determinado vetor, retorna-se o número maior, var-


rendo todo o vetor. Desta forma, inicia-se com “i” na posição 1 e o número máximo com essa
posição, para ir varrendo o vetor por todo o tamanho. Enquanto “i” for menor que o tamanho
do vetor, será verificado se “max” é menor que o tamanho do vetor, se “max” é igual aquele
elemento, “senão” incrementa “i” + 1 para, por fim, retornar a função “max”.

• A execução depende da quantidade de elementos do vetor.


• A complexidade do algoritmo máximo é linear.

Nesse caso, quanto maior for o vetor que se está pesquisado, maiores serão as quan-
tidades de passos executados por algoritmo. Portanto, o algoritmo será influenciado pela
quantidade de passos.
Desta forma, é possível afirmar que a representação do número de passos desse algo-
ritmo se dará pela seguinte função:
an + b -> n
Onde o primeiro “n” é, justamente, o tamanho do vetor de entrada.
O “a” representaria o bloco dos passos, conforme o algoritmo já demonstrado.
Já “b” é o primeiro passo e o segundo passo.
Neste sentido, quanto maior for o número “n”, que é o tamanho do vetor, maior será o
número de passos que serão executados.
O algoritmo tem a cota n: O(n).
ANOTAÇÕES

www.grancursosonline.com.br 6
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O(1) significa que o algoritmo é constante, independentemente das entradas, de modo


que vai executar em um tempo constante.
O(n) significa que o tempo de execução crescerá junto com o tamanho das entradas,
dependendo, portanto, do tamanho da entrada.
Há a possibilidade de haver, inclusive, dois algoritmos:
Algoritmo 1: f1(n) = 2n2 + 5n operações
Algoritmo 2: f2(n) = 500n + 4000 operações
Fazendo-se a análise dos algoritmos 1 e 2, tem-se o seguinte:
O algoritmo 1 tem taxa de crescimento quadrática.
O algoritmo 2 tem taxa de crescimento linear.
A análise assintótica ignora os termos constantes e de menor taxa de crescimento.
10m
Quando se faz a análise assintótica, isolam-se os “n” e o “n2” para determinar qual será
a taxa de crescimento.

Análise da Complexidade de Algoritmos – “Big O” – Cota Superior

Desta forma, quando se têm:

• O(1): Complexidade independe da entrada.


• O(log N): Cada aumento de N representa um aumento fracionário na complexidade.
• O(N): A complexidade é diretamente proporcional ao aumento de N.
• O(N log N): A complexidade aumenta mais que o aumento de N.
• O(N2): Complexidade aumenta de forma quadrática; quando N dobra, o tempo de exe-
cução quadruplica.
• O(N3): Complexidade aumenta de forma cúbica; quando N dobra, o tempo de execu-
ção aumenta oito vezes.
• O(2N): Algoritmos com tempo de execução exponencial, conhecidos como “força bruta”;
quando N dobra, o tempo de execução é elevado ao quadrado.

É muito comum notícias de tentativas de invasão de sistemas. Nesses casos, são utiliza-
dos ataques de força bruta.
A força bruta tenta fazer todas as combinações acima, a exemplo de tentar formar todas
as palavras possíveis de uma senha para descobri-la e invadir.
ANOTAÇÕES

www.grancursosonline.com.br 7
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A força bruta é um algoritmo de custo muito alto, que precisa ser executado muitas e
muitas vezes.
Em termos gráficos, tem-se os seguintes exemplos:

• Análise da Complexidade de Algoritmos – O(1)

Trata-se de execução constante.

• Análise da Complexidade de Algoritmos – O(log N)


ANOTAÇÕES

www.grancursosonline.com.br 8
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Observa-se um aumento em relação ao gráfico anterior.

• Análise da Complexidade de Algoritmos – O(N)


ANOTAÇÕES

www.grancursosonline.com.br 9
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Neste caso, é diretamente proporcional, de modo que, à medida que se vai aumentando,
vai seguindo em conjunto.

• Análise da Complexidade de Algoritmos – O(N log N)


ANOTAÇÕES

www.grancursosonline.com.br 10
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Aqui, aumenta-se mais do que a proporção.

• Análise da Complexidade de Algoritmos – O(N2)


ANOTAÇÕES

www.grancursosonline.com.br 11
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

Parece até que está abaixo do anterior, mas houve a mudança da escala. Há uma curva
acentuada subindo, com a complexidade quadrática.

• Análise da Complexidade de Algoritmos – O(N3)


ANOTAÇÕES

www.grancursosonline.com.br 12
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

A complexidade ao cubo é ainda mais acentuada a subida.

• Análise da Complexidade de Algoritmos – O(2N)


ANOTAÇÕES

www.grancursosonline.com.br 13
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

O algoritmo de custo exponencial possui a subida muito rápida no curso de execução.

DIRETO DO CONCURSO
1. (CESPE/INMETRO/PESQUISADOR TECNOLOGISTA EM METROLOGIA E QUALI-
DADE/2010) No que concerne a complexidade e eficiência de algoritmos, é correto
afirmar que:
a. o desenvolvimento de um algoritmo adequado depende do desempenho do hardware;
portanto, o projeto de hardware é mais importante que a proposta de algoritmo.
b. com o avanço da tecnologia, o desenvolvimento de algoritmos passou a ser irrele-
vante para o desempenho de aplicações.
c. o uso de algoritmo leva necessariamente a ganhos extraordinários de desempenho.
d. um algoritmo está correto se, e somente se, o desempenho do computador for otimi-
zado com seu uso.
e. avanços em compiladores e em ferramentas de busca usadas na Internet podem ser
produzidos por melhorias em algoritmos.
ANOTAÇÕES

www.grancursosonline.com.br 14
DESENVOLVIMENTO DE SISTEMAS
Complexidade de Algoritmos
Viu algum erro neste material? Contate-nos em: degravacoes@grancursosonline.com.br

COMENTÁRIO
a. Se houver algoritmo exponencial, não importa nada, pois será sempre caro esse
algoritmo.
d. O algoritmo pode estar correto, mas pode ser muito demorado.
e. É possível haver uma metodologia de busca que pode ser bem demorada, mas é possí-
vel ser feito um algoritmo mais rápido.

2. (VUNESP/TJ-SP/ANALISTA DE SISTEMAS/2012) Considerando o conceito de Com-


plexidade de Algoritmos, representado por O (função), assinale a alternativa que apre-
senta, de forma crescente, as complexidades de algoritmos.
15m
a. O(2n); O(n3); O(n2); O(log2 n); O(n.log2 n).
b. O(n2); O(n3); O(2n); O(log2 n); O(n.log2 n).
c. O(n3); O(n2); O(2n); O(n.log2 n); O(log2 n).
d. O(log2 n); O(n.log2 n); O(n2); O(n3); O(2n).
e. O(n.log2 n); O(log2 n); O(2n); O(n3); O(n2).

COMENTÁRIO
É possível responder a esta questão a partir do conhecimento do algoritmo de maior
complexidade.

GABARITO
1. e
2. d

�Este material foi elaborado pela equipe pedagógica do Gran Cursos Online, de acordo com a aula pre-
parada e ministrada pelo professor Tiago Lage Payne de Pádua.
ANOTAÇÕES

A presente degravação tem como objetivo auxiliar no acompanhamento e na revisão do conteúdo


ministrado na videoaula. Não recomendamos a substituição do estudo em vídeo pela leitura exclusiva
deste material.

www.grancursosonline.com.br 15

Você também pode gostar