Академический Документы
Профессиональный Документы
Культура Документы
G.P. Telles
ICUNICAMP
13 de agosto de 2015
Algoritmos I
13 de agosto de 2015
1 / 100
Referencias
Algoritmos I
13 de agosto de 2015
2 / 100
Esta disciplina
Analise de algoritmos.
Tecnicas para a construcao de algoritmos: inducao, divisao e
conquista, programacao dinamica, algoritmos gulosos.
Algumas estruturas de dados.
Problemas que sao recorrentes em computacao e sao faceis: busca,
ordenacao, problemas basicos em grafos etc.
Problemas que sao recorrentes em computacao e que nao sabemos se
sao faceis ou difceis: NP-completos.
Algoritmos I
13 de agosto de 2015
3 / 100
Parte I
Introducao
Algoritmos I
13 de agosto de 2015
4 / 100
Problemas e algoritmos
Algoritmos I
13 de agosto de 2015
5 / 100
(Problemas)
I
I
I
I
Algoritmos I
13 de agosto de 2015
6 / 100
Algoritmos I
13 de agosto de 2015
7 / 100
Algoritmos I
13 de agosto de 2015
8 / 100
Algoritmos I
13 de agosto de 2015
9 / 100
Algoritmos I
13 de agosto de 2015
10 / 100
Outras questoes
Algoritmos I
13 de agosto de 2015
11 / 100
Parte II
Inducao
Algoritmos I
13 de agosto de 2015
12 / 100
Secoes
Man89: captulo 2.
Algoritmos I
13 de agosto de 2015
13 / 100
Princpio da inducao
Algoritmos I
13 de agosto de 2015
14 / 100
Provas
Algoritmos I
13 de agosto de 2015
15 / 100
Exemplo
Seja S1 (n) =
n
X
i.
i=1
n(n + 1)
para todo natural n.
2
Algoritmos I
13 de agosto de 2015
16 / 100
n(n+1)
2
1
X
i=1
i=1e
n(n + 1)
1(1 + 1)
=
= 1.
2
2
Algoritmos I
13 de agosto de 2015
17 / 100
n(n+1)
2
(n 1)n
.
2
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
(n 1)n
.
2
(n 1)n
n(n + 1)
entao S1 (n) =
.
2
2
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
(n 1)n
.
2
(n 1)n
n(n + 1)
entao S1 (n) =
.
2
2
(direto da definicao de S1 )
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
(n 1)n
.
2
(n 1)n
n(n + 1)
entao S1 (n) =
.
2
2
(direto da definicao de S1 )
(HI)
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
(n 1)n
.
2
(n 1)n
n(n + 1)
entao S1 (n) =
.
2
2
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
(n 1)n
.
2
(n 1)n
n(n + 1)
entao S1 (n) =
.
2
2
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
(n 1)n
.
2
(n 1)n
n(n + 1)
entao S1 (n) =
.
2
2
Algoritmos I
13 de agosto de 2015
18 / 100
n(n+1)
2
Algoritmos I
13 de agosto de 2015
19 / 100
n, n + 1
Algoritmos I
13 de agosto de 2015
20 / 100
Bases e passos
Em alguns casos podemos partir de uma base diferente, ou de varias
bases.
Seja P um predicado com parametro n. Se P (1) e P (2) sao
verdadeiros e se P (n 2) verdadeiro implica que P (n) seja
verdadeiro para todo n > 2 entao P e verdadeiro para todo n 1.
O passo pode ser maior que 1, desde que um conjunto infinito seja
coberto.
Seja P um predicado com parametro n. Se P (1) e verdadeiro e se
P (n/2) verdadeiro implica que P (n) seja verdadeiro para todo n
potencia inteira de 2 entao P e verdadeiro para toda potencia inteira
de 2.
Algoritmos I
13 de agosto de 2015
21 / 100
Inducao forte
Algoritmos I
13 de agosto de 2015
22 / 100
Parte III
Analise de algoritmos
Algoritmos I
13 de agosto de 2015
23 / 100
Secoes
CLRS09: captulos 2 e 3.
Man89: secoes 3.1 a 3.3.
Algoritmos I
13 de agosto de 2015
24 / 100
Correcao de algoritmos
Testar.
Provar.
Model checking.
Algoritmos I
13 de agosto de 2015
25 / 100
Testar
Algoritmos I
13 de agosto de 2015
26 / 100
Provar
Algoritmos I
13 de agosto de 2015
27 / 100
Processo:
I
I
I
I
Algoritmos I
13 de agosto de 2015
28 / 100
Assercoes
Pre-condic
oes: conjunto de afirmac
oes que devem ser validas antes da
execucao de um bloco.
P
os-condic
oes: conjunto de afirmac
oes que devem ser validas depois da
execucao de um bloco.
Algoritmos I
13 de agosto de 2015
29 / 100
Exemplo
Algoritmos I
13 de agosto de 2015
30 / 100
Invariante de laco
Algoritmos I
13 de agosto de 2015
31 / 100
Exemplo
sum = 0
for i = 1 to A.length
sum = sum + A[i]
return sum
Algoritmos I
13 de agosto de 2015
32 / 100
Terminacao
O laco 2:3 termina.
No laco o valor inicial de i e 1 e ele e incrementado automaticamente ate
alcancar A.length. Como A.length e definido, finito e maior ou igual a 0
entao o laco termina.
Algoritmos I
13 de agosto de 2015
33 / 100
Invariante
No comeco de cada iteracao do laco 2:3, a variavel sum contem a soma
dos valores do subvetor A[1 . . i 1].
Algoritmos I
13 de agosto de 2015
34 / 100
Invariante
No comeco de cada iteracao do laco 2:3, a variavel sum contem a soma
dos valores do subvetor A[1 . . i 1].
Antes da primeira iteracao: para i = 1 o subvetor A[1 . . 0] nao contem
elementos e o valor de sum e zero.
Algoritmos I
13 de agosto de 2015
34 / 100
Invariante
No comeco de cada iteracao do laco 2:3, a variavel sum contem a soma
dos valores do subvetor A[1 . . i 1].
Antes da primeira iteracao: para i = 1 o subvetor A[1 . . 0] nao contem
elementos e o valor de sum e zero.
Cada iteracao mantem a invariante: o corpo do laco adiciona A[i] a sum.
Ao termino do laco, i e incrementado e entao sum contem a soma dos
elementos do subvetor A[1 . . i 1].
Algoritmos I
13 de agosto de 2015
34 / 100
Correcao de Sum-array
Sum-array retorna a soma dos valores no vetor.
A invariante de laco garante que sum contem a soma dos elementos no
vetor A na linha 4. Como o laco termina, o algoritmo retorna sum e entao
esta correto.
Algoritmos I
13 de agosto de 2015
35 / 100
Invariantes e inducao
Algoritmos I
13 de agosto de 2015
36 / 100
Model-checking
Algoritmos I
13 de agosto de 2015
37 / 100
Algoritmos I
13 de agosto de 2015
38 / 100
Desempenho de algoritmos
Analise experimental.
Analise assintotica.
Algoritmos I
13 de agosto de 2015
39 / 100
Analise experimental
Algoritmos I
13 de agosto de 2015
40 / 100
Analise experimental
Algoritmos I
13 de agosto de 2015
41 / 100
Algoritmos I
13 de agosto de 2015
42 / 100
Modelo de computacao
Algoritmos I
13 de agosto de 2015
43 / 100
Modelo RAM
Algoritmos I
13 de agosto de 2015
44 / 100
Modelo RAM
Algoritmos I
13 de agosto de 2015
45 / 100
Modelo RAM
Algoritmos I
13 de agosto de 2015
46 / 100
Algoritmos I
13 de agosto de 2015
47 / 100
Analise assintotica
Algoritmos I
13 de agosto de 2015
48 / 100
Simplificacoes na contagem
Considera-se
1
Algoritmos I
13 de agosto de 2015
49 / 100
Exemplo
sum = 0
for i = 1 to A.length
sum = sum + A[i]
return sum
Algoritmos I
13 de agosto de 2015
50 / 100
Exemplo
Contando temos:
operac
oes
Sum-array(A)
1
2
3
4
sum = 0
for i = 1 to A.length
sum = sum + A[i]
return sum
1
n+1
n
1
Somando temos: 1 + (n + 1) + n + 1 = 2n + 3.
Entao o tempo de execucao de Sum-array e aproximadamente
2n + 3.
Algoritmos I
13 de agosto de 2015
51 / 100
Depois de contar o n
umero de instruc
oes, desconsideramos os termos
de menor ordem, coeficientes e constantes na equacao, e fazemos a
suposicao de que o tamanho da entrada e arbitrariamente grande.
No nosso exemplo, ao inves de 2n + 3 ficamos apenas com n.
Dizemos que o tempo de execucao do algoritmo e aproximadamente
n, para valores suficientemente grandes de n.
Outro exemplo: se contamos n2 + 200n + 2000 operacoes para o
algoritmo A, dizemos que o tempo de execucao de A e
aproximadamente n2 .
Algoritmos I
13 de agosto de 2015
52 / 100
Algoritmos I
13 de agosto de 2015
53 / 100
Exemplo
Sum-array(A)
1
2
3
4
sum = 0
for i = 1 to A.length
sum = sum + A[i]
return sum
Algoritmos I
13 de agosto de 2015
54 / 100
Outras operacoes
if: n
umero de operac
oes do then ou pelo else, o que executar mais
operacoes.
switch: n
umero de operac
oes de sua clausula com mais operacoes.
subrotina: n
umero de operac
oes da subrotina.
Algoritmos I
13 de agosto de 2015
55 / 100
Tipos de analise
Freq
uentemente o tempo de execucao de um algoritmo depende do
valor das entradas.
Entao dentre as entradas de um certo tamanho e necessario escolher
alguma que vai ser usada como referencia para analise.
As possibilidades sao:
uma entrada que causa a execucao do menor n
umero de instrucoes
(melhor caso),
uma entrada que causa a execucao de um n
umero medio de
instrucoes (caso medio) ou
uma entrada que causa a execucao o maior n
umero de instrucoes
(pior caso).
Algoritmos I
13 de agosto de 2015
56 / 100
O melhor caso nunca e usado porque todo algoritmo tem algum caso
trivial que nao e representa a dificuldade do problema.
O caso medio custuma ser difcil de definir e difcil de analisar.
O pior caso e uma boa indicacao pratica do comportamento tpico do
algoritmo.
Algoritmos I
13 de agosto de 2015
57 / 100
Algoritmo eficiente
Algoritmos I
13 de agosto de 2015
58 / 100
Na pratica
Algoritmos I
13 de agosto de 2015
59 / 100
No entanto
Algoritmos I
13 de agosto de 2015
60 / 100
Memoria
Algoritmos I
13 de agosto de 2015
61 / 100
(Combinacoes)
Algoritmos I
13 de agosto de 2015
62 / 100
Exemplo: Insertion-Sort
O algoritmo Insertion-Sort ordena um vetor A[1 . . n].
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into the sorted sequence A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
13 de agosto de 2015
63 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
0
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
0
n1
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
0
n1
P
n
j=2 tj
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
0
n1
P
n
tj
(t
j=2 j 1)
Pnj=2
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
0
n1
P
n
t
Pnj=2 j
(t
1)
Pnj=2 j
j=2 (tj 1)
13 de agosto de 2015
64 / 100
Insertion-sort
Vamos contar.
Mas o n
umero de execuc
oes do bloco 5:7 depende dos valores em A.
Entao vamos denotar o n
umero de vezes que uma linha no bloco 5:7
e executada para um certo valor de j de tj e o tamanho de A por n.
operacoes
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
n
n1
0
n1
P
n
t
Pnj=2 j
(t
1)
Pnj=2 j
j=2 (tj 1)
n1
13 de agosto de 2015
64 / 100
Somando
Somando temos:
T (n) = n + (n 1) + 0 + (n 1) +
n
X
j=2
tj +
n
X
(tj 1) +
j=2
n
X
(tj 1) + (n 1)
j=2
= 4n +
n
X
j=2
tj + 2
n
X
(tj 1) 3
j=2
O n
umero de vezes que as linhas 5, 6 e 7 sao executadas depende do
conte
udo de A.
Algoritmos I
13 de agosto de 2015
65 / 100
Melhor caso
Quando A esta previamente ordenado, a linha 5 e executada apenas 1
vez em todas as iterac
oes para j. Assim,
T (n) = 4n +
= 4n +
n
X
tj + 2
n
X
(tj 1) 3
j=2
j=2
n
X
n
X
1+2
j=2
03
j=2
= 4n + n 1 + 0 3
= 5n 4
O tempo de execucao de melhor caso e aproximadamente n.
Cuidado: o melhor caso nao e quando n = 1. Sempre consideramos
que n e grande.
Algoritmos I
13 de agosto de 2015
66 / 100
Pior caso
Quando A esta em ordem decrescente, a linha 5 e executada j vezes
(j 1 movimentacoes para a direita e um teste final). Assim,
T (n) = 4n +
= 4n +
n
X
j=2
n
X
tj + 2
j+2
j=2
n
X
(tj 1) 3
j=2
n
X
(j 1) 3
j=2
n(n + 1)
n(n 1)
1+2
3
2
2
3 2 7
n + n4
2
2
= 4n +
=
Algoritmos I
13 de agosto de 2015
67 / 100
Memoria
O n
umero de posicoes de mem
oria usadas (alem da entrada) e
constante.
memoria
Insertion-Sort(A)
1
2
3
4
5
6
7
8
for j = 2 to A.length
key = A[j]
// Insert A[j] into A[1 . . j 1].
i = j1
while i > 0 and A[i] > key
A[i + 1] = A[i]
i = i1
A[i + 1] = key
Algoritmos I
1
1
0
1
0
0
0
0
13 de agosto de 2015
68 / 100
if p < r
q = b(p + r)/2c
Merge-Sort(A, p, q)
Merge-Sort(A, q + 1, r)
Merge(A, p, q, r)
Algoritmos I
13 de agosto de 2015
69 / 100
Intercalacao
Merge(A, p, q, r)
1 n1 = q p + 1
2 n2 = r q
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
4 for i = 1 to n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
70 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1 n1 = q p + 1
2 n2 = r q
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
4 for i = 1 to n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
2 n2 = r q
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
4 for i = 1 to n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
4 for i = 1 to n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
4 for i = 1 to n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
n+1
12 for k = p to r
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
n+1
12 for k = p to r
n
13
if L[i] R[j]
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
n+1
12 for k = p to r
n
13
if L[i] R[j]
n
14
A[k] = L[i]
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
n+1
12 for k = p to r
n
13
if L[i] R[j]
n
14
A[k] = L[i]
n
15
i=i+1
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
n+1
12 for k = p to r
n
13
if L[i] R[j]
n
14
A[k] = L[i]
n
15
i=i+1
0
16
else A[k] = R[j]
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
operacoes
Merge(A, p, q, r)
1
1 n1 = q p + 1
1
2 n2 = r q
2
3 let L[1 . . n1 + 1] and R[1 . . n2 + 1] be new arrays
n1 + 1
4 for i = 1 to n1
n1
5
L[i] = A[p + i 1]
n2 + 1
6 for j = 1 to n2
n2
7
R[j] = A[q + j]
1
8 L[n1 + 1] = inf
1
9 R[n2 + 1] = inf
1
10 i = 1
1
11 j = 1
n+1
12 for k = p to r
n
13
if L[i] R[j]
n
14
A[k] = L[i]
n
15
i=i+1
0
16
else A[k] = R[j]
0
17
j =j+1
G.P. Telles (ICUNICAMP)
Algoritmos I
13 de agosto de 2015
71 / 100
Intercalacao
Algoritmos I
13 de agosto de 2015
72 / 100
Secoes
CLRS09: captulo 3.
Man89: secoes 3.1 a 3.3.
Algoritmos I
13 de agosto de 2015
73 / 100
Algoritmos I
13 de agosto de 2015
74 / 100
O(g(n))
Algoritmos I
13 de agosto de 2015
75 / 100
Exemplos
Algoritmos I
13 de agosto de 2015
76 / 100
Exemplos
6n + 10 10n
n 10/4
n > 3
Entao para c = 10 e n0 = 3 temos f (n) cn. Conclumos que
f (n) = O(n).
Algoritmos I
13 de agosto de 2015
76 / 100
Exemplos
Seja f (n) = 12 n2 3n. Vamos verificar se f (n) O(n2 ).
Algoritmos I
13 de agosto de 2015
77 / 100
Exemplos
Seja f (n) = 12 n2 3n. Vamos verificar se f (n) O(n2 ).
1 2
2n
c72
49c
49c
c
Algoritmos I
13 de agosto de 2015
77 / 100
Exemplos
5n2 + 15 = O(n3 ).
Fazendo c = 6 e n0 = 1, 5n2 + 15 6n3 para todo n > 1.
Algoritmos I
13 de agosto de 2015
78 / 100
Exemplos
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
n = O(n2 )
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
n = O(n2 )
n = O(n3 )
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
n = O(n2 )
n = O(n3 )
n = O(nn )
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
n = O(n2 )
n = O(n3 )
n = O(nn )
n = O(n2 )
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
n = O(n2 )
n = O(n3 )
n = O(nn )
n = O(n2 )
= O(1)
Algoritmos I
13 de agosto de 2015
79 / 100
Exemplos
5n2 + 15 6= O(n) (n 6
c15
5 ).
n = O(n)
n = O(n2 )
n = O(n3 )
n = O(nn )
n = O(n2 )
= O(1)
1080 = O(1)
Algoritmos I
13 de agosto de 2015
79 / 100
(g(n))
Algoritmos I
13 de agosto de 2015
80 / 100
(g(n))
Algoritmos I
13 de agosto de 2015
81 / 100
o(g(n))
Algoritmos I
13 de agosto de 2015
82 / 100
Exemplos
Vamos mostrar que 1000n2 o(n3 ).
Precisamos mostrar que,
0 1000n2 < cn3 , para todo n n0 .
Dividindo por n3 , obtemos a inequacao
0
1000
e decrescente
n
+1 a
n0 = 1000
c
1000
< c.
n
Algoritmos I
13 de agosto de 2015
83 / 100
Exemplos
Vamos mostrar que 1000n2 o(n3 ).
Precisamos mostrar que,
0 1000n2 < cn3 , para todo n n0 .
Dividindo por n3 , obtemos a inequacao
0
1000
e decrescente
n
+1 a
n0 = 1000
c
1000
< c.
n
Algoritmos I
13 de agosto de 2015
83 / 100
(g(n))
Algoritmos I
13 de agosto de 2015
84 / 100
Nao confundir melhor caso com , caso medio com e pior caso
com O.
A rigor cada tipo de analise leva a um resultado que pode ser limitado
inferior ou superiormente.
Por exemplo, suponha um algoritmo A com entrada de tamanho n
executa 3n2 operacoes no pior caso. Exceto quando n e potencia de
2, caso em que o algoritmo executa 5n operac
oes no pior caso.
Entao podemos dizer que o tempo de execucao de pior caso de A e
O(n2 ) e e (n).
Algoritmos I
13 de agosto de 2015
85 / 100
f (n)
=0
g(n)
f (n)
f (n) O(g(n)) se lim
<
n g(n)
f (n)
f (n) (g(n)) se 0 < lim
<
n g(n)
f (n)
f (n) (g(n)) se lim
>0
n g(n)
f (n)
f (n) (g(n)) se lim
=
n g(n)
f (n) o(g(n)) se lim
Algoritmos I
13 de agosto de 2015
86 / 100
Regra de LHopital
Sejam f e g funcoes diferenciaveis tais que
limn f (n) = limn g(n) = 0 ou . Se o limite de
f (n)0 /g(n)0 existir entao,
f 0 (n)
f (n)
= lim 0
n g (n)
n g(n)
g 0 (n) = 1/2 n,
lim
f (n)
f 0 (n)
1/n
1
= lim
=0
= lim 0
= lim
n g(n)
n g (n)
n 1/2 n
n 2n n
lim
Algoritmos I
13 de agosto de 2015
87 / 100
Transitividade:
Se f (n) O(g(n)) e g(n) O(h(n)), entao f (n) O(h(n))
Se f (n) (g(n)) e g(n) (h(n)), entao f (n) (h(n))
Se f (n) (g(n)) e g(n) (h(n)), entao f (n) (h(n))
Se f (n) o(g(n)) e g(n) o(h(n)), entao f (n) o(h(n))
Se f (n) (g(n)) e g(n) (h(n)), entao f (n) (h(n))
Algoritmos I
13 de agosto de 2015
88 / 100
Algoritmos I
13 de agosto de 2015
89 / 100
Em expressoes
Algoritmos I
13 de agosto de 2015
90 / 100
Exemplo: Merge-sort
Merge-Sort(A, p, r)
1
2
3
4
5
if p < r
q = b(p + r)/2c
Merge-Sort(A, p, q)
Merge-Sort(A, q + 1, r)
Merge(A, p, q, r)
Algoritmos I
13 de agosto de 2015
91 / 100
operacoes
(1)
(1)
T (dn/2e)
T (bn/2c)
(n)
(1)
T (dn/2e) + T (bn/2c) + (n)
se n = 1
c.c.
Algoritmos I
13 de agosto de 2015
92 / 100
Sequential-Search(A, k)
1
2
3
4
5
6
7
8
9
A[|A| + 1] = k
i=1
while (true)
if A[i] == k
if i |A|
return i
else
return 0
i=i+1
Algoritmos I
13 de agosto de 2015
93 / 100
Algoritmos I
13 de agosto de 2015
94 / 100
Binary-Search(A, l, r, k)
1
2
3
4
5
6
7
8
9
if l > r
return 0
m = b(l + r)/2c
if A[m] == k
return m
elseif k < A[m]
return Binary-Search(A, l, m 1, k)
else
return Binary-Search(A, m + 1, r, k)
Algoritmos I
13 de agosto de 2015
95 / 100
Busca binaria
Algoritmos I
13 de agosto de 2015
96 / 100
Busca binaria
Algoritmos I
13 de agosto de 2015
96 / 100
Exemplo: count
Count(x)
1
2
3
4
k =1
for i = 1 to x
k = k+1
return k
Algoritmos I
13 de agosto de 2015
97 / 100
Exemplo: count
Algoritmos I
13 de agosto de 2015
98 / 100
Exemplo: count
Algoritmos I
13 de agosto de 2015
98 / 100
Exemplo: pairing
Pairing(A, B)
1
2
3
4
5
6
7
8
9
10
c=0
for i = 1 to n
for j = 1 to m
if A[i] == B[j]
c = c+1
break
if c == n
return 1
else
return 0
Algoritmos I
13 de agosto de 2015
99 / 100
Exemplo: pairing
Algoritmos I
13 de agosto de 2015
100 / 100
Exemplo: pairing
Algoritmos I
13 de agosto de 2015
100 / 100