Se tiene el heap, definido en los apuntes, con n elementos, tal que

Anuncio
1. Se tiene el heap, definido en los apuntes, con n elementos, tal que en la raíz se
encuentra el elemento con clave menor.
a) Diseñar la función: void selmayor(preg a, int n) que imprime la clave mayor.
b) Determinar la complejidad de la función.
Solución.
En un heap los elementos mayores se encuentran en las hojas. Por lo tanto basta revisar
las hojas del heap, seleccionando el mayor.
void selmayor(preg a, int n)
{
int j;
registro max=a[n]; //se asume que el mayor es el último
for (j=n-1; j>n/2; j--)
{
if (a[j].clave > max.clave) max=a[j];
}
printf("mayor= %d \n", max.clave);
}
En un heap de n elementos se tienen (n+1)/2 hojas. El lazo de repetición se realiza el
número de hojas menos una veces. T(n)= O(1)+O( hojas-1) +O(1) = O(n).
2. Se tienen dos arreglos estáticos globales de enteros, a y b, de n y m componentes
respectivamente. El arreglo a está ordenado en forma ascendente; el arreglo b, en forma
descendente.
Además se tiene, en la zona de datos, la definición: int * c;
Diseñar función que genere un arreglo, solicitado en forma dinámica, que deje en c, la
mezcla ordenada en forma ascendente.
Solución:
void merge( int n, int m )
{ int i, j, k;
c = (int*) malloc(sizeof(int)*(n+m));
if(c==NULL) exit(1);
for (i = 0, j = m-1, k = 0; k < n+m; k++)
{
if (i == n) { c[k] = b[j--]; continue; }
if (j == -1) { c[k] = a[i++]; continue; }
if (a[i] <= b[j]) c[k] = a[i++] ; else c[k] = b[j--];
}
}
3. Se tiene el siguiente grafo orientado y con pesos:
0,2
1
0
0,4
1
0,3
1
1
0,3
1
2
0,1
1
0,3
1
3
Calcular la suma mínima de los trayectos más cortos a cada uno de los nodos, partiendo
desde cada uno de los vértices, aplicando el algoritmo de Dijkstra.
Solución.
a) Partiendo desde el vértice 0, la suma de trayectos es (0,2+0,4+0,3).
0,2
1
0
1
2
0,3
1
0,1
1
3
b) Partiendo desde el vértice 1, la suma de trayectos es (0,3+0,7+1,0).
0
1
0,4
1
0,3
1
2
0,3
1
3
c) Partiendo desde el vértice 2, la suma de trayectos es (0,4+0,6+0,7).
0,2
1
0
1
0,4
1
2
0,3
1
3
d) Partiendo desde el vértice 3, la suma de trayectos es (0,5+0,1+0,3).
0
1
0,4
1
0,1
1
2
0,3
1
3
Los casos a) y d) corresponden a árboles con suma mínima de trayectos, desde el vértice
0 y 3 a los otros vértices, igual a 0,9.
Descargar