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.
V[n] - vetor de inteiros
A chamada do algortimos é:
A (1, n, d) e B(n, d)
************** A ************************
int A (int i,int n, int d)
{
int j, f1, item, cont, k, max, fim, pai;
cont = 1;
item = V[i];
f1 = d*(i-1) + 2;
pai = i;
while ( (f1 <= n) && cont )
{
j = f1;
max = V[f1];
if ((f1 + d - 1) > n)
{
fim = n;
}
else
{
fim = f1 + d - 1;
}
for (k = f1+1; k<=fim; k++)
{
if (V[k] > max )
{
j=k; max=V[k];
}
}
if (item >= V[j])
{
cont = 0;
}
else
{
V[ pai ] = V[j];
pai = j;
f1 = d*(pai-1) + 2;
}
}
V[ pai ] = item;
return(0);
}
********** Alg B ***************
int B(int n, int d)
{
int stat;
int i, pai;
pai = ((int)((n-2)/d)) + 1;
for (i= pai; i>=1; i--)
{
stat = A(i,n,d);
}
return(0);
}
************** 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);
}
}