Professional Documents
Culture Documents
de Algoritmos
4
Tipos de dados
• Um tipo de dados caracteriza o conjunto de valores a que
uma constante pertence, ou que podem ser assumidos por
uma variável ou expressão, ou que podem ser gerados por
uma função.
• Tipos simples de dados são grupos de valores indivisíveis.
– Uma variável do tipo lógico, por exemplo, pode assumir
apenas o valor verdadeiro ou o valor falso.
8
Tempo de execução de um programa
• Segundo Knuth, existem dois tipos de problemas na área
de análise de algoritmos:
– Análise de um algoritmo particular
• Qual é o custo de usar um determinado algoritmo para resolver um
problema específico?
• Características que devem ser investigadas:
– Análise do nº de vezes que cada parte do algoritmo deve ser executada.
– Estudo da quantidade de memória necessária.
10
Tempo de execução de um programa
• O custo de utilização de um algoritmo pode ser medido por meio da
execução do programa referente em um computador real.
12
Tempo de execução de um programa
• Para medir o custo de execução de um algoritmo, é comum
definir uma função de custo ou função de complexidade f.
– f(n) é a medida do tempo necessário para executar um
algoritmo para um problema de tamanho n. Neste caso, é
chamada função de complexidade de tempo.
– f(n) é a medida da memória necessária para executar um
algoritmo para um problema de tamanho n. Neste caso, é
chamada função de complexidade de espaço.
15
Tempo de execução de um programa
• A medida do custo de execução de um algoritmo depende,
principalmente, do tamanho da entrada dos dados.
– É comum considerar o tempo de execução de um programa
como uma função do tamanho da entrada.
16
Tempo de execução de um programa
• Em uma análise, existem três cenários a serem tratados:
– Melhor caso: menor tempo de execução sobre todas as
possíveis entradas de tamanho n.
– Pior caso: maior tempo de execução sobre todas as possíveis
entradas de tamanho n.
• Se f é uma função de complexidade baseada na análise de pior caso,
o custo de aplicar o algoritmo nunca é maior do que f(n).
– Caso médio (caso esperado): média dos tempos de execução
de todas as entradas de tamanho n.
• Uma distribuição de probabilidades sobre o conjunto de entradas de
tamanho n é suposta para obtenção do custo médio.
• Quando possível, é comum supor uma distribuição de probabilidades
em que todas as entradas possíveis são igualmente prováveis.
• A análise do caso médio é geralmente muito mais difícil de obter do
que as análises do melhor e do pior caso.
17
Tempo de execução de um programa
• Para ilustrar os conceitos, considere o problema de localizar
o item de um vetor, cuja chave seja a chave de pesquisa do
item desejado. Neste caso, o algoritmo mais simples é o que
faz a pesquisa sequencial.
• Seja f uma função de complexidade tal que f(n) é o número
de itens consultados no vetor (número de vezes que a chave
de pesquisa é comparada com a chave de cada item).
– Melhor caso: f(n) = 1 (item desejado é o primeiro consultado).
– Pior caso: f(n) = n (item desejado é o último consultado ou
não está presente no vetor).
– caso médio: f(n) = (n + 1)/2.
18
Tempo de execução de um programa
• No estudo do caso médio, considere:
– toda pesquisa recupera um item;
– pi é a probabilidade de que o i-ésimo item seja procurado;
– para recuperar o i-ésimo item, são necessárias i comparações.
Logo: f(n) = 1 × p1 + 2 × p2 + 3 × p3 + · · · + n × pn.
• Para calcular f(n), basta conhecer a distribuição de
probabilidades pi.
– Se os itens tiverem a mesma probabilidade de serem
procurados, então pi = 1/n, para 1 ≤ i ≤ n.
Nesse caso,
22
Tempo de execução de um programa
void MaxMin3(Vetor A, int while (i <= FimDoAnel)
*Max, int *Min) { if (A[i - 1] > A[i])
{ int i, FimDoAnel; { if (A[i - 1] > *Max) *Max =
if ((n & 1) > 0) A[i - 1];
{ A[n] = A[n - 1]; if (A[i] < *Min) *Min =
FimDoAnel = n; A[i];
} }
else FimDoAnel = n - 1; else { if (A[i - 1] < *Min)
*Min = A[i - 1];
if (A[0] > A[1])
if (A[i] > *Max) *Max =
{ *Max = A[0]; A[i];
*Min = A[1]; }
} i += 2;
else }
{ *Max = A[1]; }
*Min = A[0];
}
i = 3;
23
Tempo de execução de um programa
• De acordo com o procedimento MaxMin3:
– os elementos de A são comparados dois a dois; os maiores
elementos são comparados com Max e os menores
elementos com Min;
– quando n é ímpar, o elemento que está na posição A[n] é
duplicado na posição A[n+1], para se evitar um tratamento
de exceção;
– para o melhor caso, pior caso e caso médio,
24
Tempo de execução de um programa
• A seguinte tabela apresenta o número de comparações dos
programas MaxMin1, MaxMin2 e MaxMin3.
27
Exemplo de Uso de um Oráculo
28
Exemplo de Uso de um Oráculo
29
Exercício
• Qual é a complexidade de tempo de:
a) Considerando o número de operações aritméticas.
int f(int n, int m){
int i, j;
for (i = 0; i < n; i++)
for (j=0; j< m; j++)
temp = temp + 1;
return temp;
}
b) Considerando o número de comparações.
int f (int n){
if (n > 0){
return f(n-1);
}
else return 1;
}
30
Exercício
b) Considerando o número de comparações.
int f (int n){
if (n > 0){
return f(n-1) + f(n-1);
}
else return 1;
}
Resolva as relações de recorrências:
a) T(n) = T(n-1) + c, n>1
T(1) = 0;
b) T(n) = T(n-1) + 2n, n>0
T(0) = 1
31
Comportamento Assintótico de Funções
32
Dominação assintótica
33
Notação O
34
Exemplo de Notação O
35
Comportamento assintótico de funções
• Algumas operações realizadas com a notação O são:
36
Comportamento assintótico de funções
• Dizer que g(n) é O(f(n)) significa que f(n) é um limite
superior para g(n). A notação Ω especifica o limite inferior.
40
Comportamento assintótico de funções
• A notação ω é usada para definir um limite inferior que não é
assintoticamente firme.
41