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);
}
}