COMPLEXIDADE TEMPORAL
A complexidade temporal de um
algoritmo pode ser expressa em termos de números de operações usadas por um
algoritmo quando a entrada tem um determinado tamanho. Essas operações podem
ser de comparação, adição, multiplicação e divisão de números inteiros.
A complexidade temporal é descrita em
termos do número de operações necessárias em vez do tempo atual do computador,
por causa da diferença de tempo necessária para computadores diferentes
realizarem operações básicas. Além disso, é um pouco difícil quebrar todas as
operações binárias que um computador usa, sendo que os computadores mais
rápidos podem executar as operações binárias básicas (adição, multiplicação,
comparação ou troca de dois bits) em um 1nanosegundo, mas os computadores
domésticos podem precisar de 1 microsegundo, um tempo 1000 vezes mais longo
para fazer as mesmas operações. Analisaremos agora a complexidade temporal de
um algoritmo de busca.
Exemplo 6:
Descreva a complexidade temporal do
algoritmo de busca linear.
Solução:
O número de comparações usadas pelo
algoritmo será tomado como medida de complexidade temporal. A cada passo do
laço no algoritmo, duas comparações são realizadas – uma para ver se o final da
lista foi alcançado e outra para comparar o elemento x com um termo da lista.
Por fim, uma comparação a mais é feita por fora do laço. Consequentemente, se x
= ai, 2i + 1 comparações são
usadas. As maiores comparações 2n + 2, são necessárias quando o elemento não
está na lista. Neste caso, 2n comparações são usadas para determinar que x não
é ai, para i = 1, 2, ..., n. uma comparação adicional é usada para finalizar o
laço e uma comparação é feita por fora do laço. Então quando x não estiver na
lista, um total de 2n + 2 comparações são usadas. Assim, definimos que uma
comparação linear requer no máximo O(n) comparações.
COMPLEXIDADE DE PIOR
CASO
O tipo de complexidade do exemplo
acima é uma análise do pior caso. Por esta análise, entendemos o maior número
de operações necessárias para resolver o problema dado usando este algoritmo
com uma entrada de determinado tamanho. A análise do pior caso nos diz quantas
operações um algoritmo necessita para garantir que irá produzir uma solução.
Exemplo 7:
Qual é a complexidade de pior caso do
insertionsort em termos de números de comparações feitas?
Solução:
O
insertionsort insere o j-ésimo elemento na ordem correta entre os primeiros j–1
elementos que já foram colocados na posição certa. Ele faz isso usando uma
técnica de busca linear, comparando sucessivamente o j-ésimo elemento com o
termo subsequente até um termo maior que, ou igual àquele seja encontrado, ou
compara aj com ele mesmo e pára se aj não for menos que ele mesmo.
Consequentemente, no pior caso, j comparações são necessárias para inserir o
j-ésimo elemento na posição correta. Assim, o número total de comparações
usadas pelo insertionsort para organizar uma lista de n elementos é:
Figura 1: número total de comparações
usadas pelo insertionsort para organizar uma lista de n elementos
Note que o insertionsort pode usar
consideravelmente poucas comparações se os elementos menores aparecerem no
final da lista. Com isso concluímos que o insertionsort tem complexidade pior
caso O(n²) ??
ENTENDENDO A
COMPLEXIDADE DE ALGORITMOS
A tabela 1 apresenta a terminologia
comumente usada para descrever a complexidade temporal dos algoritmos. Por
exemplo, um algoritmo que encontra o maior termo dos primeiros 100 termos de
uma lista de n elementos na sequencia dos 100 primeiros termos, em que n é um
número inteiro com n maior igual a 100, tem complexidade constante. O algoritmo
de busca linear tem complexidade linear (pior caso médio), e o algoritmo de
busca binária tem complexidade logarítmica (pior caso). Há ainda algoritmos de
complexidade polinomial, exponencial e fatorial.
Tabela 1: Terminologia usada para a
Complexidade de Algoritmos
A tabela 2 apresenta o tempo
necessário para resolver problemas de vários tamanhos com um algoritmo usando o
número indicado de operações binárias, tempos com mais de 10elevado 100 anos
são indicados com um asterisco. Na construção dessa tabela, considera-se que
cada operação binária leva 10-9 segundos, sendo este o tempo necessário para
uma operação binária que utilize os computadores mais rápidos da atualidade. No
futuro, esses tempos tendem a diminuir à medida que os computadores mais
rápidos forem sendo desenvolvidos.
Tabela 2: Tempo de Computação usado
pelos algoritmos
É importante saber quanto tempo um
computador precisa para resolver um problema. Por exemplo, se um algoritmo
necessita de 10 horas, pode ser melhor gastar o tempo do computador para
resolver este problema. Mas, se um algoritmo necessita de 10 bilhões de anos
para resolver um problema seria irracional usar recursos para implementá-lo,
sendo que um dos fenômenos mais interessantes da tecnologia moderna é o grande
aumento da velocidade e da memória dos computadores.
Complexidade de Algoritmo