Seja fi(n) o número de operações realizadas pelo programa i
abaixo(log logaritmo na base 2).
-
Obtenha fi(n) em função de n e de grupos de operações que
demandam tempo constante (para os quais você pode utilizar
símbolos c1, c2, ... para indicar esse número constante de
operações). Caso existam valores indeterminados, cosidere-os como
variáveis e dê o intervalo de valores que esta pode assumir.
- Encontre funções li(n) e ui(n) tais que
fi(n) = W(li(n)) (a maior possível) e f(n) = O(ui(n))
(a menor possível).
- Indique quando existe
uma função hi(n) tal que fi(n) = Q (hi(n)).
- Caso o algoritmo seja recursivo, escreva sua relação de
recorrência. Caso seja iterativo e apareçam somatórios,
escreva-os.
************** A1 ************************
Chamada: A1 (n,k)
void A1 (int n, int k)
{
int i,f,m;
i = 0;
f = (int)(log(n)/2);
while ( 1 )
{
m = (int)((i+f)/2);
p = 2**m;
if (k < p){
if (k >= (p/2) )
{
return(p/2);
}
f = m;
}
else {
if (k < 2*p)
{
return(p);
}
i = m;
}
}
}
************** A2 ************************
Chamada: A2 (1,n,k)
int A2 (int i, int f, int k)
{
int a,b,p;
if (i < f)
{
a = (int)log(i);
b = (int)log(f);
h = (int)((a+b)/2);
p = 2**h;
if (k < p)
{
if (k >= (p/2) )
{
return(p/2);
}
else
{
return(A2(i, p/2, k));
}
}
else
{
if (k < 2*p)
{
return(p);
}
else
{
return(A2(2*p, f, k));
}
}
}
}
************** A3 ************************
Chamada: A3 (1, n)
void A3 (int i, int f)
{
int j,continue;
if (i <= f)
{
continue = 1;
j = i;
while ( (j <= f) && continue)
{
if (V[i] > V[j])
{
V[i] = V[j];
continue = 0;
}
j = j + 1;
}
A3(i,(int)(f/2));
}
}
************** A4 ************************
Chamada: A4 (1, n)
void A4 (int i, int f)
{
int j,continue;
if (i <= f)
{
continue = 1;
j = i;
while ( (j <= f) && continue)
{
if (V[i] > V[j])
{
V[i] = V[j];
continue = 0;
}
j = j + 1;
}
m = (int)((f-i)/5);
A4(i,i+m);
A4(i+m+1,i+2*m);
A4(i+2*m+1,i+3*m);
}
}
Seja fi(n) o número de operaoerealizadas pelo programa i
abaixo. Seja fi(n) a função de n que estima o número de operações elementares executadas pelo
algoritmo. Encontre ui(n) tal que f(n) = O(ui(n)).
Caso o algoritmo seja recursivo, escreva sua relação de
recorrência. Caso seja iterativo e apareçam somatórios,
escreva-os.
V[n] - vetor de inteiros (acessivel para todos os procedimentos)
************** A1 ************************
Chamada: A1 (n)
void A1 (int n)
{
int i,j,soma;
soma = 0;
i = 1;
while (i <= n)
{
j = 1;
while (j <= i)
{
soma = soma + V[j];
j = j + 1;
}
i = i + 1;
}
}
************** A3 ************************
Chamada: A3 (1, n)
void A3 (int i, int n)
{
int j,continue;
if (i <= n)
{
continue = 1;
j = 1;
while ( (j <= i) && continue)
{
if (V[i] > V[j])
{
V[i] = V[j];
continue = 0;
}
j = j + 1;
}
A3 (i+1, n);
}
}
************** A8 ************************
Chamada: A8 (1, n)
void A8 (int i, int f)
{
int j;
if (i <= f-2 )
{
j = i;
while (j <= f)
{
if (V[i] > V[j])
{
V[i] = V[j];
}
j = j + 1;
}
m = (int)( (i+f)/2 );
if ( V[m] < V[i] )
{
A8 (i, m);
}
else
{
A8 (m+1, f);
}
}
}