lista 1 - Projeto e Análise de Algoritmos

Propaganda
Ministério da Educação
Instituto Federal de Educação, Ciência e Tecnologia
Sudeste de Minas Gerais - Campus Rio Pomba
Ciência da Computação
Análise e Projeto de Algoritmos (Lista 1)
Prof. Alex F. V. Machado
1) Dois algoritmos A e B possuem complexidade n3 e 2n, respectivamente. Existe uma situação que o
algoritmo B poderia ser melhor que o A. Explique.
2) Determine a função de complexidade e a ordem de complexidade (no melhor, pior e caso médio) do
algoritmo abaixo (considere a operação básica cada chamada do vetor v):
MaxMin(vetor v)
max=v[1];
min=v[1];
para i=2 até n faça
se v[i]> max então max=v[i]; fimse
se v[i]< min então min=v[i]; fimse
fimpara;
fim.
3) Qual é a ordem de complexidade das seguintes funções (utilize as 5 notações).
a) f(n) = n2 + 2
d) g(n) = 10. 2n
b) g(n) = 503
e) f(n) = n log n + log n
c) g(n) = 2 log n + n
4) Escrever um algoritmo que determine se uma matriz quadrada de n (n<100) linhas e colunas é uma
matriz permutação. Definir sua função de complexidade e suas ordems de complexidade (considere a
operação primitiva a leitura a esta matriz quadrada). Uma matriz quadrada é chamada de matriz permutação
se seus elementos são apenas 0’s e 1’s e se em cada linha e coluna da matriz existe apenas um único valor
1.
Por exemplo, a seguinte matriz é de permutação:
1 0 0
0 0 1
0 1 0
5) Considere o algoritmo (o vetor array está em ordem crescente e N é o tamanho deste array):
bool programaTeste ( int *array, int chave , int N)
{
int inf = 0;
int sup = N-1;
int meio;
while (inf <= sup)
{
meio = (inf+sup)/2;
if (chave == array[meio])
return true;
else if (chave < array[meio])
sup = meio-1;
else
inf = meio+1;
}
return false;
}
a) Defina o que este algoritmo implementado em C faz.
b) Defina sua função e ordem de complexidade nos três casos.
c) Implemente um algoritmo com mesmo objetivo que o realize em O(n).
6) Considere os seguintes algoritmos:
Algoritmo 1
//primeira parte----------------------------------------scanf("%d", &n);
k = -1;
for (i = 0; i < n; i = i + 1)
{
achou = FALSE;
j = 0;
while (j <= k)
{
if (numero[j] == elemento[i])
{
achou = TRUE;
freq[j] = freq[j] + 1;
}
j = j + 1;
}
if (!achou)
{
k = k + 1;
numero[k] = elemento[i];
freq[k] = 1;
}
}
//segunda parte----------------------------------------printf(" Resultado:\n");
for (j = 0; j <= k; j = j + 1)
{
printf("%d", numero[j]);
printf("%d\n", freq[j]);
}
Algoritmo 2
//primeira parte----------------------------------------scanf("%d", &n);
maior = 0;
for (i = 0; i < n; i = i + 1)
{
indice = elemento[i];
freq[indice] = freq[indice] + 1;
if ( indice > maior ){
maior = indice;
}
}
//segunda parte----------------------------------------printf(" Resultado:\n");
for (j = 0; j <= maior; j = j + 1)
{
if( freq[j] != 0 ){
printf("%d", j);
printf("%d\n", freq[j]);
}
}
a) Sabendo que ambos têm o mesmo objetivo, defina-o.
b) Defina a função de complexidade assintótica (considere a operação primitiva cada iteração do algoritmo
e analise somente a primeira parte de cada algoritmo), as ordens de complexidade nos três casos para os
dois algoritmos e aponte o melhor.
c) Altere UMA LINHA do Algoritmo 1 para melhorar sua complexidade. Defina sua nova ordem de
complexidade do pior caso.
d) Dependendo da análise de complexidade feita o julgamento de melhor algoritmo (entre estes dois)
poderia ser invertida. Defina-a.
Download