Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
2. Análise de Algoritmos
A Análise de Algoritmos estuda problemas
computacionais recorrentes, ou seja, problemas
que aparecem, sob diversos disfarces, em uma
grande variedade de aplicações e contextos.
– p. 2/32
3. Análise de Algoritmos
A Análise de Algoritmos estuda problemas
computacionais recorrentes, ou seja, problemas
que aparecem, sob diversos disfarces, em uma
grande variedade de aplicações e contextos.
A análise de um algoritmo para um dado problema
trata de
provar que o algoritmo está correto, e
estimar o tempo de execução do algoritmo.
– p. 2/32
4. Análise de Algoritmos
Dados dois algoritmos para um mesmo problema,
a análise permite decidir qual dos dois é mais
eficiente.
– p. 3/32
5. Análise de Algoritmos
Dados dois algoritmos para um mesmo problema,
a análise permite decidir qual dos dois é mais
eficiente.
A estimativa do espaço de memória usado pelo
algoritmo também é importante em muitos casos.
– p. 3/32
6. Análise de Algoritmos
Pode-se dizer que a Análise de Algoritmos é uma
disciplina de engenharia, pois ela procura prever o
comportamento de um algoritmo antes que ele
seja efetivamente implementado e colocado “em
produção”.
– p. 4/32
7. Análise de Algoritmos
Num nível mais abstrato, a análise de algoritmos
procura identificar aspectos estruturais comuns
aos algoritmos e estudar paradigmas de projeto de
algoritmos (como divisão e conquista,
programação dinâmica, etc.)
– p. 5/32
8. Análise de Algoritmos
No restante desta introdução, faremos uma rápida
revisão de conceitos básicos e fixaremos a
notação e a terminologia empregadas no texto.
– p. 6/32
10. Instâncias
Todo problema computacional é uma coleção de
“casos particulares” que chamaremos instˆancias. A
palavra instância é empregada aqui no sentido de
exemplo, exemplar, espécime, amostra, ilustração.
– p. 8/32
11. Instâncias - Exemplos
Problema da multiplicac¸ ˜ao de n´umeros naturais:
dados números naturais x e y, determinar o
produto x.y.
– p. 9/32
12. Instâncias - Exemplos
Problema da multiplicac¸ ˜ao de n´umeros naturais:
dados números naturais x e y, determinar o
produto x.y.
Cada instância do problema é definida por
dois números naturais. Por exemplo, os
números 2 e 3 definem uma instância.
– p. 9/32
13. Instâncias
Problema da ordenac¸ ˜ao: rearranjar (ou seja,
permutar) os elementos de um vetor A[1 . . . n]
de números naturais de modo que ele se torne
crescente.
– p. 10/32
14. Instâncias
Problema da ordenac¸ ˜ao: rearranjar (ou seja,
permutar) os elementos de um vetor A[1 . . . n]
de números naturais de modo que ele se torne
crescente.
Cada instância do problema é definida por
um número natural n e um vetor A[1 . . . n].
Por exemplo, o número 5 e o vetor
(876, 145, 323, 112, 221) definem uma
instância do problema.
– p. 10/32
16. Instâncias
Problema do circuito hamiltoniano: encontrar um
circuito hamiltoniano em um grafo.
Cada instância do problema é definida por
um grafo.
– p. 11/32
17. Tamanho de uma instância
O tamanho de uma instância de um problema é a
quantidade de dados necessária para descrever a
instância, ou seja, é o “espaço” necessário para
especificar a instância. Em geral, o tamanho de
uma instância é descrito por um único número
natural, mas às vezes é mais conveniente usar um
par, um terno, etc., de números naturais.
– p. 12/32
18. Tamanho de uma instância
No problema da multiplicação de dois números
naturais, toda instância tem tamanho 2 (pois
consiste em dois números). Dependendo das
circunstâncias, entretanto, pode ser mais
apropriado dizer que o tamanho de uma
instância do problema é o número de
caracteres (ou de dígitos) necessário para
especificar os dois números.
– p. 13/32
19. Tamanho de uma instância
O tamanho de uma instância do problema de
ordenação é n. (Mas poderia também ser
definido como o número total de caracteres
necessário para escrever os valores dos
elementos de A[1 . . . n].)
– p. 14/32
20. Tamanho de uma instância
O tamanho de uma instância do problema de
ordenação é n. (Mas poderia também ser
definido como o número total de caracteres
necessário para escrever os valores dos
elementos de A[1 . . . n].)
O tamanho de uma instância do problema do
circuito hamiltoniano em um grafo com n
vértices e m arestas é um par (m, n).
– p. 14/32
21. Algoritmos para problemas
Dizemos que um algoritmo resolve um problema se,
ao receber qualquer instância do problema,
devolve uma solução da instância ou informa que a
instância não tem solução.
– p. 15/32
22. Tempo gasto
O tempo gasto (ou complexidade, ou consumo de
tempo) por um algoritmo é o número de operações
consideradas relevantes realizadas pelo algoritmo
e expressa-se esse número como uma função do
tamanho da entrada. Essas operações podem ser
comparações, operações aritméticas, movimento
de dados, etc.
– p. 16/32
23. Tempo gasto
O tempo gasto (ou complexidade, ou consumo de
tempo) por um algoritmo é o número de operações
consideradas relevantes realizadas pelo algoritmo
e expressa-se esse número como uma função do
tamanho da entrada. Essas operações podem ser
comparações, operações aritméticas, movimento
de dados, etc.
Estamos sempre mais interessados em medir o
tempo gasto pelos algoritmos no pior caso.
– p. 16/32
24. Consumo de tempo assintótico
Seja A um algoritmo para um problema P. O
tempo de relógio (minutos e segundos) que A
consome para processar uma dada instância de P
depende da máquina usada para executar A. Mas
o efeito da máquina se resume a uma constante
multiplicativa, ou seja, se A consome tempo t
numa determinada máquina, consumirá tempo 2t
numa máquina duas vezes mais lenta e t/2 numa
máquina duas vezes mais rápida.
– p. 17/32
25. Consumo de tempo assintótico
Para eliminar o efeito da máquina, discutiremos o
consumo de tempo de A a menos de constantes
multiplicativas. A notação assintótica (O, Ω, Θ) é
ideal para fazer isso.
– p. 18/32
27. Apresentação dos algoritmos
Instruc¸ ˜oes
i ← 1;
x ← y;
Se . . . então . . .
Se . . . então . . . senão . . .
Enquanto . . . faça . . .
Para i ← 1 até n faça . . .
– p. 20/32
30. Busca sequencial
Algoritmo: Busca sequencial
Entrada: Um vetor M1, M2, . . . , Mn e um elemento x
Saída: (“sim”, i) ou “não”
– p. 23/32
31. Busca sequencial
Algoritmo: Busca sequencial
Entrada: Um vetor M1, M2, . . . , Mn e um elemento x
Saída: (“sim”, i) ou “não”
Início
i ← 1;
Enquanto (i ≤ n) e (x = Mi) faça i ← i + 1;
– p. 23/32
32. Busca sequencial
Algoritmo: Busca sequencial
Entrada: Um vetor M1, M2, . . . , Mn e um elemento x
Saída: (“sim”, i) ou “não”
Início
i ← 1;
Enquanto (i ≤ n) e (x = Mi) faça i ← i + 1;
Se (i ≤ n) então imprima (“sim”, i) senão imprima “não”
Fim
– p. 23/32
33. Busca sequencial
Algoritmo: Busca sequencial
Entrada: Um vetor M1, M2, . . . , Mn e um elemento x
Saída: (“sim”, i) ou “não”
Início
i ← 1;
Enquanto (i ≤ n) e (x = Mi) faça i ← i + 1;
Se (i ≤ n) então imprima (“sim”, i) senão imprima “não”
Fim
Qual o tempo (pior caso) gasto pelo algoritmo?
– p. 23/32
34. Busca sequencial
Algoritmo: Busca sequencial
Entrada: Um vetor M1, M2, . . . , Mn e um elemento x
Saída: (“sim”, i) ou “não”
Início
i ← 1;
Enquanto (i ≤ n) e (x = Mi) faça i ← i + 1;
Se (i ≤ n) então imprima (“sim”, i) senão imprima “não”
Fim
Qual o tempo (pior caso) gasto pelo algoritmo?
Resposta: O(n)
– p. 23/32
36. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
– p. 24/32
37. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
– p. 24/32
38. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
Enquanto (l ≤ r) e (não achou) faça
– p. 24/32
39. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
Enquanto (l ≤ r) e (não achou) faça
k ← (l + r)/2 ;
– p. 24/32
40. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
Enquanto (l ≤ r) e (não achou) faça
k ← (l + r)/2 ;
Se x = Mk então achou ← verdadeiro
– p. 24/32
41. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
Enquanto (l ≤ r) e (não achou) faça
k ← (l + r)/2 ;
Se x = Mk então achou ← verdadeiro
senão se x > Mk então l ← k + 1 senão r ← k − 1
– p. 24/32
42. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
Enquanto (l ≤ r) e (não achou) faça
k ← (l + r)/2 ;
Se x = Mk então achou ← verdadeiro
senão se x > Mk então l ← k + 1 senão r ← k − 1
Se achou então imprima (“sim”, k) senão imprima “não”
Fim
– p. 24/32
43. Busca binária
Entrada: Um vetor M1, M2, . . . , Mn de inteiros ordenado e
um inteiro x
Saída: (“sim”, i) ou “não”
Início
l ← 1; r ← n; achou ← falso;
Enquanto (l ≤ r) e (não achou) faça
k ← (l + r)/2 ;
Se x = Mk então achou ← verdadeiro
senão se x > Mk então l ← k + 1 senão r ← k − 1
Se achou então imprima (“sim”, k) senão imprima “não”
Fim
Qual o tempo (pior caso) gasto pelo algoritmo?
– p. 24/32
44. Busca binária - tempo
O tempo gasto pela busca binária é proporcional
ao número de iterações do laço “Enquanto ... faça”.
– p. 25/32
45. Busca binária - tempo
O tempo gasto pela busca binária é proporcional
ao número de iterações do laço “Enquanto ... faça”.
O número de elementos do vetor no início da
1a. iteração é n
– p. 25/32
46. Busca binária - tempo
O tempo gasto pela busca binária é proporcional
ao número de iterações do laço “Enquanto ... faça”.
O número de elementos do vetor no início da
1a. iteração é n
2a. iteração é n/2
– p. 25/32
47. Busca binária - tempo
O tempo gasto pela busca binária é proporcional
ao número de iterações do laço “Enquanto ... faça”.
O número de elementos do vetor no início da
1a. iteração é n
2a. iteração é n/2
3a. iteração é n/22
– p. 25/32
48. Busca binária - tempo
O tempo gasto pela busca binária é proporcional
ao número de iterações do laço “Enquanto ... faça”.
O número de elementos do vetor no início da
1a. iteração é n
2a. iteração é n/2
3a. iteração é n/22
...
(i + 1)a. iteração é n/2i
– p. 25/32
49. Busca binária - tempo
Na última iteração teremos n/2i
= 1, o que resulta
em
i = log n
– p. 26/32
50. Busca binária - tempo
Na última iteração teremos n/2i
= 1, o que resulta
em
i = log n
Portanto, o tempo gasto pela busca binária é
O(log n).
– p. 26/32
53. Ordenação - bubblesort
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
– p. 29/32
54. Ordenação - bubblesort
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
Início
Para j ← i até n − 1 faça
Para 1 ← i até j faça
Se Mi > Mi+1 então “troque Mi com Mi+1”
Fim
– p. 29/32
55. Ordenação - bubblesort
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
Início
Para j ← i até n − 1 faça
Para 1 ← i até j faça
Se Mi > Mi+1 então “troque Mi com Mi+1”
Fim
Qual o tempo (pior caso) gasto pelo algoritmo?
– p. 29/32
56. Ordenação - bubblesort
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
Início
Para j ← i até n − 1 faça
Para 1 ← i até j faça
Se Mi > Mi+1 então “troque Mi com Mi+1”
Fim
Qual o tempo (pior caso) gasto pelo algoritmo?
Resposta: O(n2)
– p. 29/32
57. Ordenação por seleção
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
– p. 30/32
58. Ordenação por seleção
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
Idéia:
Selecione o maior elemento
Troque-o com o “último” da lista
– p. 30/32
59. Ordenação por seleção
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
Idéia:
Selecione o maior elemento
Troque-o com o “último” da lista
Exercício: Escreva o algoritmo
– p. 30/32
60. Ordenação por seleção
Entrada: Um vetor M = M1, M2, . . . , Mn de inteiros
Saída: O vetor M ordenado em ordem não decrescente
Idéia:
Selecione o maior elemento
Troque-o com o “último” da lista
Exercício: Escreva o algoritmo
Qual o tempo (pior caso) gasto pelo algoritmo?
– p. 30/32
61. Exercícios
1. Escreva um algoritmo para ordenar os elementos de
um vetor utilizando a seguinte idéia:
selecione o menor elemento
troque-o com o “primeiro” da lista
2. Escreva um algoritmo para ordenar os elementos de
um vetor M1, M2, . . . , Mn utilizando a seguinte idéia
(ordenação das cartas de baralho - inserção):
suponha que M1, M2, . . . , Mi já está ordenado
insira Mi+1 na posição correta para obter
M1, M2, . . . , Mi+1 ordenado
– p. 31/32
62. Exercícios
3. Escreva um algoritmo para verificar se os elementos de
um vetor M1, M2, . . . , Mn estão em ordem não
decrescente.
4. Um algoritmo de ordenação é estável se não altera a
posição relativa dos elementos de mesmo valor.
(a) Bubblesort é estável?
(b) Seleção é estável?
– p. 32/32