Você está na página 1de 17

Programação e Algoritmos

Leitura
Introdução a teoria da complexidade:
Big O

2
Índice

Objetivos
Introdução
Análise algorítmica
Complexidade assimptótica
▪ Big O
▪ Ordens de complexidade
Conclusão ou Resumo
Referências Bibliográficas

3
Objetivos

▪ Consolidar o conceito de algoritmo

▪ Apresentação de análise de algortimos e de complexidade assimptótica

4
Introdução

Os algoritmos são os alicerces sobre os quais a computação moderna se apoia, são conjuntos de instruções detalhados passo a passo,
precisos e lógicos, que representam a solução de um determinado problema.

No paradigma da programação orientada a objetos — Java, por exemplo — os programas de computador são constituídos por
elementos (classes) que por sua vez são formados por um conjunto de algoritmos.

Deste modo, a eficiência dos algoritmos é um aspeto fundamental no desenvolvimento de software e de sistemas informáticos, e a
análise de complexidade dos algoritmos é essencial para compreender o seu desempenho em termos de tempo de execução e
consumo de recursos, como memória.

Avaliar a eficiência de um algoritmo envolve a compreensão da análise de complexidade, o custo esperado de tempo e/ou de espaço
necessários para que um algoritmo resolva um determinado problema em função do tamanho da entrada.

Nesta unidade curricular iremos incidir principalmente no estudo da eficiência temporal dos algoritmos.

Figura 1. Representação conceptual de algortimo.

5
Análise
Algorítmica

6
Análise Algorítmica
Processadores mais poderosos executam algoritmos mais rapidamente,
na análise algorítmica é ignorada a qualidade ou o tipo de processador.

Um determinado problema pode ter vários algoritmos que o solucionam, a análise algorítmica possibilita que o programador determine
qual é o algoritmo mais eficiente que deve ser utilizado.

Existem dois tipos principais de tipos de eficiência: tempo e espaço.

• Eficiência temporal é a “rapidez” que um algoritmo é executado;

• Eficiência espacial é a memória necessária para um algoritmo ser executado.

Nesta unidade curricular iremos incidir principalmente no estudo da eficiência temporal dos algoritmos.

Figura 2. Algoritmo de melhor percurso.

7
Análise Algorítmica

Na análise algorítmica a eficiência de um algoritmo é calculado // Atribuição de variáveis


pelo número de operações básicas ou primitivas que o algoritmo int a = 10;
realiza. int b = 5;

// Operações aritméticas
int soma = a + b; // Adição
Estas operações básicas ou primitivas são: int subtracao = a - b; // Subtração
int multiplicacao = a * b; // Multiplicação
• Atribuição de variáveis; int divisao = a / b; // Divisão

• Operações aritméticas (adição, subtração, multiplicação, // Operações lógicas


divisão); boolean condicao1 = true;
boolean condicao2 = false;
• Operações lógicas;
boolean res_AND = condicao1 && condicao2; // Operação lógica AND
• Acesso aos elementos de um array; boolean res_OR = condicao1 || condicao2; // Operação lógica OR
boolean res_NOT = !condicao1; // Operação lógica NOT
• Comparação, incremento e decremento de valores.
// Acesso aos elementos de um array
int[] numeros = { 1, 2, 3, 4, 5 };
int elemento = numeros[2]; // Acesso ao terceiro elemento do array

// Comparação, incremento e decremento de valores


int i = 5;
int j = 10;

boolean igualdade = (i == j); // Comparação de valores


i++; // Incremento de i
j--; // Decremento de j

8
Análise Algorítmica

Existem três casos típicos em análise algorítmica: melhor caso, pior


caso e o caso médio.

O melhor caso ocorre quando todos os fatores determinantes são


benéficos para que o algoritmo seja executado o mais
rapidamente possível, ou seja, são realizadas o menor número de
operações primitivas, o pior caso é o oposto, todos os fatores são
contrários para que o algoritmo seja executado rapidamente —
estes casos são os mais fáceis de calcular.

O caso médio ocorre quando os fatores determinantes do


algoritmo por vezes são benéficos ou outras são contrárias para
uma rápida execução do algoritmo pelo que é necessário
calcular a probabilidade do número médio de operações
primitivas a serem executadas, identificando quais as
combinações possíveis das variáveis de entrada do algoritmo.

Figura 3. Pior, melhor e caso médio de uma função.

Existem também algoritmos que não importa o número de valores


das variáveis de entrada realizam sempre o mesmo número de
operações primitivas, estes são casos sistemáticos.

9
Análise Algorítmica

No exemplo ao lado, podemos verificar a pesquisa sequencial do número 10 num vetor com cinco valores, no melhor e pior caso, assim
como num possível caso médio.

• No melhor caso o algoritmo de pesquisa sequencial realiza apenas uma comparação de valores, verifica se o valor da primeira
posição do vetor é igual a 10.

• No pior caso, estando o número 10 na última posição do vetor, o algoritmo de pesquisa sequencial realiza cinco comparações de
valores.

• Neste caso médio. o algoritmo de pesquisa sequencial realiza três comparações de valores, encontrando o valor 10 no terceiro índice
do vetor.

10 2 4
8 4 8
6 6 10
8 8 6
2 10 2

Figura 4. Exemplo de pior, melhor e caso médio de pesquisa sequencial do número 10 num vetor com 5 valores.

10
Complexidade
Assimptótica

11
Complexidade Assimptótica

A complexidade assintótica refere-se ao desempenho de um


algoritmo à medida que o tamanho da entrada aumenta para
um valor muito grande, é uma forma de descrever como o tempo
de execução ou o uso de recursos de um algoritmo cresce
conforme o tamanho dos dados de entrada aumenta.

A complexidade assintótica é frequentemente expressa usando a


notação Big O que indica um limite superior para o tempo de
execução do algoritmo em relação ao tamanho da entrada.

O objetivo ao analisar a complexidade assintótica com a notação


Big O é entender como o desempenho do algoritmo é afetado
quando o tamanho da entrada se torna muito grande. Desta
forma, permite analisar, comparar e escolher os algoritmos mais
eficientes para lidar com diferentes tipos e tamanhos de dados e
apoia na tomada de decisões no design e no desenvolvimento de
software.

Figura 5. Diagrama da notação Big O por nível de complexidade algorítmica.

12
Complexidade Assimptótica

Definição formal de Big O:

+
∃𝑐𝑐 ∈ 𝑅𝑅, ∃𝑛𝑛0 ∈ 𝑍𝑍 ∶ 𝑐𝑐 > 0, 𝑛𝑛0 > 0, ∀ 𝑛𝑛 ≥ 𝑛𝑛0,
𝑓𝑓 𝑛𝑛 ≤ 𝑐𝑐 ∗ 𝑔𝑔 𝑛𝑛 ↔ 𝒇𝒇 𝒏𝒏 = 𝑶𝑶 𝒈𝒈 𝒏𝒏

Existindo um número real c e um número inteiro positivo n0, sendo c e n0 maior que zero, para todo o número inteiro n maior ou igual a
n0, função f(n) será menor ou igual à constante multiplicativa c vezes função g(n) o que equivale a 𝒇𝒇 𝒏𝒏 = 𝑶𝑶 𝒈𝒈 𝒏𝒏

Ou seja, a notação 𝒇𝒇(𝒏𝒏)=𝑶𝑶(𝒈𝒈(𝒏𝒏)) é uma forma de dizer que, para valores suficientemente grandes de 𝒏𝒏, a função 𝒇𝒇(𝒏𝒏) cresce no
máximo tão rápido quanto a função 𝒈𝒈(𝒏𝒏), multiplicada por uma constante c.

13
Complexidade Assimptótica

Existem diferentes tipos de funções de complexidades algorítmicas.

Na tabela 1 encontram-se funções de referência com as respetivas ordens de


complexidade que descrevem como o tempo de execução cresce em
relação ao tamanho da entrada do valor n, na figura 6 encontram-se as
respetivas representações gráfica, permitindo compreender a escalabilidade
dos algoritmos em estudo.

Legenda:
Função Ordem Complexidade Diferentes valores de n
• 1
1 O(1) Constante • log2n
• n
log2n O(log2n) Logarítmica 3.32 6.64 9.97 13.29 16.61
• nlog2n

n O(n) Linear 10 100 1000 10000 100000 • n2


• n3
Linear-
nlog2n O(nlog2n) 33.22 664.39 9965.78 1.33x105 1.66x106 • 2n
Logarítmica
• n!
n2 O(n2) Quadrática 100 10000 1.00x106 1.00x108 1.00x1010

n3 O(n3) Cúbica 1000 1.00x106 1.00x109 1x1012 1x1015

2n O(2n) Exponencial 1024 1.26x1030 1.07x10301

n! O(n!) Fatorial 3.63x106 9.33x10157

Tabela 1. Funções de referência e respetivas ordens de complexidade assimptótica. Figura 6. Representação gráfica das funções de referência.

14
Complexidade Assimptótica

Legenda:
• 1
• log2n
• n
• nlog2n
• n2
• n3
• 2n
• n!

Figura 6. Representação gráfica das


funções de referência.

15
Conclusão ou Resumo

Neste recurso abordamos o conceito de algortimo, definimos em que consiste análise algoritmica e respetivas tipologias, o
que são operações primitivas e como calcular o custo temporal numa análise algoritmica.

Adicionalmente, exploramos em que consiste a complexidade assimptótica, como aplicar a análise de Big O em algoritmos
e as ordens de complexidade algortimica de diversas funções.

16
Referências Bibliográficas

Coelho, P. (2016). Programação em Java (5ª ed.). FCA.

Rocha, A. (2011). Estruturas de dados e algoritmos em Java. FCA.

Rocha, A. (2014). Análise da complexidade de algoritmos. FCA.

17

Você também pode gostar