Você está na página 1de 17

Programação Avançada

Prof. Maurício Aldenor


040601707@prof.unama.br

2022
Tempo de execução
• Vários fatores afetam o tempo de execução de um programa:
• computadores mais/menos potentes
• instâncias (entradas) pequenas/grandes
• sistema operacional
• linguagem de programação
• estrutura de dados
• programador
• etc...
Tempo de execução
• Vamos considerar um modelo que independa desses
detalhes, mas que nos dá informações suficientes sobre o
comportamento do programa (a priori):
• Ele contém passos básicos que podem ser realizados
rapidamente sobre números pequenos:
• aritmética (cálculos)
• relacional (teoria dos conjuntos)
• lógica (verdadeiro ou falso)
• movimentação (banco de dados)
• controle de fluxo (ordem das instruções)
• etc...
Tempo de execução
• Definição:
• O tempo de execução de um algoritmo é a quantidade de
passos básicos executados por ele sobre uma certa
entrada.
• Como o tempo tende a crescer conforme o tamanho da
entrada cresce, usamos uma função no tamanho da
entrada para descrevê-lo: T(n), f(n), g(n)...
• O tamanho da entrada pode variar com o problema:
• Problema que envolve vetor: n = tamanho do vetor
• Problema que envolve variável inteira: n = quantidade de
bits para armazenar o inteiro
Exemplo 1 - Busca linear
Considerar que cada ação gasta 1 unidade de tempo (u.t.) para ser executada.
Se chave Se chave não
BuscaLinear(A, n, k)
encontrada encontrada
1 i = 1 1 1
2 enquanto i <= n faça nk n+1
3 se A[i] == k então 2nk 2n
4 devolve i 1 0
5 i = i + 1 2(nk - 1) 2n
6 devolve -1 0 1

Chave encontrada: f(n) = 1 + nk + 2nk + 1 + 2(nk-1) + 0 = 5nk


Chave não encontrada: f(n) = 1 + (n+1) + 2n + 0 + 2n + 1 = 5n+3
DÚVIDAS?
Exemplo 2 - Busca binária
Se chave Se chave não
BuscaBinaria(A, n, k)
encontrada encontrada
1 inicio = 1 1 1
2 fim = n 1 1
3 enquanto inicio <= fim faça xk xk
4 meio = ⌊(inicio+fim) / 2⌋ 4.xk 4(xk-1)
5 se A[meio] == k então 2.xk 2(xk-1)
6 devolve meio 1 0
7 senão se k > A[meio] então 2(xk-1) 2(xk-1)
8 inicio = meio + 1
9 Senão 2(xk-1) 2(xk-1)
10 fim = meio - 1
11 devolve -1 0 1
Exemplo 2 - Busca binária
• Chave encontrada:
f(n) = 1 + 1 + xk + 4xk + 2xk + 1 + 2(xk-1) + 2(xk-1) + 0
f(n) = 11xk - 1

• Chave não encontrada:


f(n) = 1 + 1 + xk + 4(xk-1) + 2(xk-1) + 0 + 2(xk-1) + 2(xk-1) + 1
f(n) = 11xk - 7
Exemplo 2 - Busca binária
Começamos com o vetor completo: n
Depois, temos apenas metade do vetor: n/2
Depois, sobra metade da metade: n/4
Depois, metade da metade da metade: n/8
.
.
.
No final, chegamos em zero: 0
Matematicamente, a redução de “metades” sucessivas é log2n
Exemplo 2 - Busca binária
• Mas quem é xk???
• Como precisamos chegar até zero, então xk = (log2n) + 1:

• Chave encontrada:
f(n) = 11xk - 1
f(n) = 11(log2n) + 1 - 1 = 11.log2n

• Chave não encontrada:


f(n) = 11xk - 7
f(n) = 11(log2n) + 1 - 7 = 11.log2n - 6
Resumo

Busca Linear Busca Binária


k∈A 5nk 11.log2n
k = A[1] 5 11.log2n
k = A[n] 5n 11.log2n
k∉A 5n + 3 11.log2n - 6
DÚVIDAS?
Exercícios
1. Faça a contagem de instruções dos programas abaixo,
gerando a função f(n):
a)
1. let x = 0;
2. x = x + 1;
3. console.log(x)

f(n) = ?

Pausa para você


tentar.
Agora é a sua
vez!
Exercícios
1. Continuação...
b)
1. let max = 0;
2. let i = 0;
3. while (i < max) {
4. i++;
5. }

f(n) = ?
Pausa para você
tentar.
Agora é a sua
vez!
Exercícios
1. Continuação...
c)
1. let a = 0;
2. for(let i = 1; i < 5; i++) {
3. a = a + 1;
4. console.log(i);
5. }
6. console.log(a);

Pausa para você


f(n) = ? tentar.
Agora é a sua
vez!
Exercícios
1. Continuação...
d)
1. let v = [1,3,5,7,2,4,6,8];
2. for(let i = 0; i < v.length; i++) {
3. if( v[i] % 2 === 0) {
4. console.log(i);
5. }
6. }

Pausa para você


f(n) = ? tentar.
Agora é a sua
vez!
Exercícios
1. Pesquise a função de complexidade dos algoritmos Bubble
sort e Quick sort para o melhor e pior casos e para o caso
médio.

Você também pode gostar