Examen 3

Anuncio
1.- El siguiente ordenamiento contiene errores, localícelos y proponga una solución.
bandera = 0;
do{
for(i = 0; i < N-1; i++,N--)
if(a[i]>a[i+1])
intercambia(a, i, i+1);
}while (bandera == 1);
Solución:
Solo hace una pasada debido a que el valor de la bandera nunca cambia. La bandera debe cambiar
cuando se hacen intercambios y debe permanecer en cero cuando no hay intercambios (el arreglo
ya esta ordenado) de lo contrario entraría en un ciclo infinito.
do{
bandera = 0;
for (i = 0; i < N-1; i++)
if(a[i] > a[i+1]){
intercambia (a, i, i+1);
bandera = 1;
}N--;
}while (bandera ==1);
2.- Realice modificaciones al siguiente algoritmo para que realice un solo intercambio
al final del ciclo interno.
for (i = 0; i < N-1; i++)
for (j = i +1; j < N; j++ )
if (a[i] > a[j])
intercambia (a, i, j);
Solución:
for (i = 0; i < N-1; i++){
men = i;
for (j = i+1; i < N; i++)
if (a[men] > a[j]) men = j;
intercanbia (a, I, men);
}
3.- Realice el recorrido por anchura del grafo de la siguiente figura, comenzando por
el nodo 1.
9
4
2
5
28
10
8
7
8
8
1
1
1
5
7
7
6
8
26
2
27
3
Solución:
{1}
(1,2)(1,3)(1,5)
{1,2}
(1,3)(1,5)(2,1)(2,4)(2,5)(2,6)
{1,2,3}
(1,5)(2,1)(2,4)(2,5)(2,6)(3,1)(3,6)(3,8)
{1,2,3,5}
(2,1)(2,4)(2,5)(2,6)(3,1)(3,6)(3,8)(5,1)(5,2)(5,4)(5,6)
{1,2,3,5,4}
(2,5)(2,6)(3,1)(3,6)(3,8)(5,1)(5,2)(5,4)(5,6)(4,2)(4,5)(4,7)(4,8)
{1,2,3,5,4,6}
(3,1)(3,6)(3,8)(5,1)(5,2)(5,4)(5,6)(4,2)(4,5)(4,7)(4,8)(6,2)(6,3)(6,5)(6,7)(6,8)
{1,2,3,5,4,6,8}
(5,1)(5,2)(5,4)(5,6)(4,2)(4,5)(4,7)(4,8)(6,2)(6,3)(6,5)(6,7)(6,8)(8,3)(8,4)(8,6)(8,7)
{1,2,3,5,4,6,8,7} (4,8)(6,2)(6,3)(6,5)(6,7)(6,8)(8,3)(8,4)(8,6)(8,7)(7,4)(7,6)(7,8)
2
4
7
1
5
3
6
8
4.- Aplique el algoritmo de Kruskal al grafo de la siguiente figura.
9
4
2
5
28
10
8
7
8
8
1
1
1
5
6
7
7
8
26
2
27
3
Solución:
Primero colocamos todos los arcos en una cola de prioridad.
1,5,
1
6,8,
1
1,3,
2
4,5,
5
4,8,
7
7,8,
7
2,5,
8
4,7,
8
5,7,
8
2,4,
9
2,6,
10
3,6,
24
5,6,
26
3,8,
27
1,2,
28
Después vamos sacando los arcos de la cola, si el arco crea un ciclo lo
desechamos y tomamos otro, así hasta que la cola este vacia.
Desechados
4
2
7
5
8
7
1
7
1
5
6
8
1
2
3
5.- Demuestre que el grafo de la siguiente figura es planar dibujándolo.
1
2
3
4
5
Solución:
1
5
4
6. El siguiente método de ordenamiento tiene fallas, localícelas y proponga una
solución.
2
3
template <class T>
void Heapsort(T *a, int tam){
int i;
for(I = (tam-1) / 2; I >= 0; i --)
bajarmonticulo(a, tam, i);
while(tam>0){
intercambia(a, tam - 1);
bajarmonticulo(a, --tam, 0);
}
}
template <class T>
void bajarmonticulo(T *a, int ult, int k){
T v = a [k];
While(k <= (ult-1) / 2){
j = k*2 + 1;
if(j < (ult - 1))
if(a [j] < a [j+1] ) j++;
if(v >= a [j] ) break;
a [k] = a [j];
k = j;
}
a [k] = v;
}
Solución:
La función de bajar monticulo no considera llegar a una hoja y en ese caso j > ult-1. Para corregirlo
debe salirse del ciclo si detecta esta condición.
template <class T>
void bajarmonticulo(T *a, int ult, int k){
T v = a [k];
While(k <= (ult-1) / 2){
j = 2 * k + 1;
if(j > (ult - 1)) break;
if(j < (ult-1))
if(a [j] < a [j+1] ) j++;
if(v >= a [j] ) break;
a [k] = a [j];
k = j;
}
a [k] = v;
}
7. Escriba el seudo código de la búsqueda por profundidad
Tomar el nodo inicial como nodo actual.
Hacer
Si nodo actual no esta visitado
Meter nodo actual a visitados y meter adyacentes del nodo actual a una pila
Sacar elemento de la pila y hacerlo el nodo actual
Mientras la pila no este vacía repetir ciclo.
8. Realice una prueba de escritorio para el siguiente fragmento de código en C.
template <class T>
void Mergesort(T *a, int N, int izq, int der){
int i, j, k, m ;
T *b ;
if(der > izq){
m = (izq + der) / 2 ;
Mergesort(a, N, izq, m) ;
Mergesort(a, N, m+1, der) ;
b = new T[N] ;
for(i = izq ; i <= der ; i++) b[i]= a[i];
for(i = izq , j = izq , k = m+1; i <= der ; i++)
if(j <= m && k <= der)
a[i] = (b[j] < b[k]) ? b [j++] : b[k++];
else
a[i] = (k > der) ? b [j++] : b[k++];
delete [] b;
}
}
int datos [10]= {8, 9, 5, 3, 1, 2, 4, 6, 0, 7};
Mergesort(datos, 10, 0 , 9);
Solución
Merge(0,9) m = 4 “llamadas”
m=4
Merge (0,4) termina al mezclar 0 a 2 con 3 a 4
Merge (5,9) termina al mezclar 5 a7 con 8 a 9
mezclar 0 a 4 con 5 a 9 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Merge (0,4) m = 2
Merge(0,2) termina al mezclar 0 a 1 con 2 a 2
Merge(3,4) termina al mezclar 3 a 3 con 4 a 4
mezclar 0 a 2 con 3 a 4 {1, 3, 5, 8, 9, 2, 4, 6 , 0, 7}
Merge (0,2) m = 1
Merge (0,1) termina al mezclar 0 a 0 con 1 a 1
Merge (2,2) 2 > 2
mezclar 0 a 1 con 1 a 1 {5, 8, 9, 3, 1, 2, 4, 6, 0, 7}
Merge (0,1) m = 0
Merge (0,0) 0 > 0
Merge (1,1) 1 > 1
mezclar 0 a 0 con 1 a 1 {8, 9, 5, 3, 1, 2, 4, 6, 0, 7}
Merge (3,4) m = 3
Merge (3,3) 3 > 3
Merge (4,4) 4 > 4
mezclar 3 a 3 con 4 a 4 {5, 8, 9, 1, 3, 2, 4, 6, 0, 7}
Merge (5,9) m = 7
Merge (5,7) termina al mezclar 5 a 6 con 7 a 7
Merge (8,9) termina al mezclar 8 a 8 con 9 a 9
mezclar 5 a 7 con 8 a 9 {1, 3, 5, 8, 9, 0, 2, 4, 6, 7}
Merge (5,7) m = 6
Merge (5,6) termina al mezclar 5 a 5 con 6 a 6
Merge (7,7) 7 > 7
mezclar 5 a 6 con 7 a 7 {1, 3, 5, 8, 9, 2, 4, 6, 0, 7}
Merge (5,6) m = 5
Merge (5,5) 5 > 5
Merge (6,6) 6 > 6
mezclar 5 a 5 con 6 a 6 {1, 3, 5, 8, 9, 2, 4, 6, 0, 7}
Merge (8,9) m = 8
Merge (8,8) 8 > 8
Merge (9,9) 9 > 9
mezclar 8 a 8 con 9 a 9 {1, 3, 5, 8, 9, 2, 4, 6, 0 ,7}
9. Realice una prueba de escritorio para el siguiente fragmento de código en C.
template <class T>
void Quicksort(T *a, int izq, int der){
int i, j ;
T v, t ;
if( der > izq){
v = a [der] ;
for(i = izq -1, j = der ; ;){
while(a [++i] < v);
while(a [--j] > v && j > 0);
if(j <= i) break;
t = a [i];
a [i] = a [j];
a [j] = t;
}
t = a [i];
a [i] = a [der];
a [der] = t;
Quicksort (a, izq, i-1);
Quicksort (a, i+1, der);
}
}
int datos [10] = {8, 9, 5, 3, 1, 2, 4, 6, 0, 7};
Quicksort(datos, 10, 0, 9);
Solución
{8, 9, 5, 3, 1, 2, 4, 6, 0, 7} v = 7 Quick (0,9)
Intercambia (a, 0, 8)
{0, 9, 5, 3, 1, 2, 4, 6, 8, 7}
j i
Intercambia(a, 1, 7)
{0, 6, 5, 3, 1, 2, 4, 9, 8, 7}
j <= i
Intercambia(a, 7, 9) Quick (0,6) Quick (8,9)
{0, 6, 5, 3, 1, 2, 4, 7, 8, 9} v = 4 Quick(0,6)
Intercambia (a, 1, 5)
{0, 2, 5, 3, 1, 6, 4, 7, 8, 9}
Intercambia(a, 2, 4)
{0, 2, 1, 3, 5, 6, 4, 7, 8, 9}
j <= i
Intercambia(a, 4, 6) Quick (0,3) Quick (5,6)
{0, 2, 1, 3, 4, 6, 5, 7, 8, 9} v = 3 Quick(0,3)
j <= i
Intercambia (a, 3, 3) Quick (0,2) Quick (4,3)
4<3
{0, 2, 1, 3, 4, 6, 5, 7, 8, 9} v = 1 Quick (0, 2)
j <= i
Intercambia(a, 1, 2) Quick (0,0) Quick (2,2)
i j
0<0
2<2
{0, 1, 2, 3, 4, 6, 5, 7, 8, 9} v = 5 Quick (5,6)
j <= i
Intercambia (a, 5, 6) Quick (5,4) Quick (6,6)
5<4
6<6
j i
{0, 1, 2, 3, 4, 5, 6, 7, , 8, 9} v = 9 Quick (8,9)
j <= i
Intercambia (a, 9, 9) Quick (8,8) Quick (10,9)
8<8
10<9
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
10. Aplique el algoritmo de Dijkstra al grafo de la figura 3 iniciando en el nodo 1.
9
4
2
10
5
8
28
7
8
8
7
1
7
26
1
5
1
6
8
2
27
24
3
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
0
28
2
&
1
&
&
&
&
0
&
9
&
10
&
&
&
&
0
&
&
24
&
27
&
&
&
0
5
&
8
9
&
&
&
&
0
26
&
&
&
&
&
&
&
0
8
1
&
&
&
&
&
&
0
7
&
&
&
&
&
&
&
0
(1,2) (1,3) (1,5) (2,4) (2,6) (3,6) (3,8) (5,2) (5,6)
(4,5) (4,7) (4,8) (6,7) (6,8)
28
2
1
9
18
19
20
26
1
0
0
0
0
0
0
0
0
0
2
28
28
28
9
9
9
9
9
9
3
2
2
2
2
2
2
2
2
2
4
&
37
37
37
18
18
18
18
18
5
1
1
1
1
1
1
1
1
1
6
&
38
26
26
19
19
19
19
19
7
&
&
&
&
&
26
26
26
26
8
&
&
29
29
29
25
20
20
20
{1}
{1,2}
{1,2,3}
{1,2,3,5}
regresar al 2, 4 y 6 no se han visitado
{1,2, 3, 5, 4}
{1,2, 3, 5, 4, 6}
{1, 2, 3, 5, 4, 6,8}
{1, 2, 3, 5, 4, 6, 8,7}
9
4
2
10
28
8
8
7
1
5
6
1
Descargar