Quiz de practica — Parcial 2
Parcial 2 • Dificultad: medium
Pregunta 1 — Complejidad (seleccion multiple)
Seleccione la opcion correcta:
a) La complejidad de buildHeap (construir un heap a partir de un arreglo desordenado usando sift-down) es:
b) ¿Cual de los siguientes algoritmos de ordenamiento tiene el mejor caso en ?
- Selection sort
- Merge sort
- Insertion sort
- Heap sort
c) ¿Cual de las siguientes afirmaciones sobre algoritmos de ordenamiento es correcta?
- Quick sort siempre es
- Merge sort usa de memoria extra
- Heap sort es estable
- Bubble sort es estable
Ver respuesta
a) Respuesta: 3 —
buildHeap con sift-down es , NO . La intuicion es que la mayoria de nodos estan cerca del fondo del arbol y hacen poco trabajo. Formalmente, la suma converge a por serie geometrica.
b) Respuesta: 3 — Insertion sort
Insertion sort tiene mejor caso cuando el arreglo ya esta ordenado (solo hace comparaciones, cero swaps). Selection sort siempre es porque busca el minimo en toda la parte no ordenada. Merge sort siempre es . Heap sort siempre es .
c) Respuesta: 4 — Bubble sort es estable
- Quick sort tiene peor caso (datos ya ordenados con mal pivote) — falso.
- Merge sort usa de memoria extra — falso.
- Heap sort no es estable (percolateDown salta niveles) — falso.
- Bubble sort solo hace swaps adyacentes y nunca cruza elementos iguales — verdadero.
Pregunta 2 — BST: construccion y recorrido inorden
Dado el siguiente orden de insercion en un BST vacio:
a) Dibuje el BST resultante.
b) Escriba el recorrido inorden del arbol.
c) Escriba el recorrido preorden del arbol.
Ver respuesta
a) Construccion paso a paso:
Insert 35: 35
Insert 20: 35
/
20
Insert 45: 35
/ \
20 45
Insert 10: 35
/ \
20 45
/
10
Insert 25: 35
/ \
20 45
/ \
10 25
Insert 40: 35
/ \
20 45
/ \ /
10 25 40
Insert 55: 35
/ \
20 45
/ \ / \
10 25 40 55
Insert 5: 35
/ \
20 45
/ \ / \
10 25 40 55
/
5
Insert 30: 35
/ \
20 45
/ \ / \
10 25 40 55
/ \
5 30Arbol final:
35
/ \
20 45
/ \ / \
10 25 40 55
/ \
5 30b) Inorden (LNR): 5, 10, 20, 25, 30, 35, 40, 45, 55
(Verificacion: el recorrido inorden de un BST siempre da los datos en orden ascendente.)
c) Preorden (NLR): 35, 20, 10, 5, 25, 30, 45, 40, 55
Pregunta 3 — AVL: insercion con rotacion
En un arbol AVL vacio, inserte los siguientes valores en orden:
a) ¿En que insercion se produce un desbalanceo?
b) ¿Que tipo de rotacion se requiere (LL, LR, RL, RR)?
c) Dibuje el arbol antes y despues de la rotacion.
d) Escriba el factor de balance de cada nodo en el arbol final.
Ver respuesta
Construccion paso a paso:
Insert 50: 50 (BF=0)
Insert 30: 50 (BF=+1)
/
30 (BF=0)
Insert 70: 50 (BF=0)
/ \
30 70
Insert 20: 50 (BF=+1)
/ \
30 70
/
20
Insert 40: 50 (BF=+1)
/ \
30 70
/ \
20 40Hasta aqui todo esta balanceado. Todos los BF estan en 1.
Insert 10: 50 (BF=+2) ← ¡DESBALANCEADO!
/ \
30 70 (BF=0)
/ \
20 40
/
10a) El desbalanceo ocurre al insertar 10. El nodo 50 tiene .
b) Caso LL: y . Como ambos desbalanceos van hacia la izquierda (misma direccion), es rotacion simple.
Rotacion: simple derecha en el nodo 50.
c) Antes de la rotacion:
50
/ \
30 70
/ \
20 40
/
10Despues de la rotacion simple derecha en 50:
30
/ \
20 50
/ / \
10 40 70d) Factores de balance del arbol final:
30 (BF=0)
/ \
20 (BF=+1) 50 (BF=0)
/ / \
10 (BF=0) 40(BF=0) 70(BF=0)- Nodo 30:
- Nodo 20:
- Nodo 50:
- Nodos 10, 40, 70: hojas,
Todos los BF estan en — el arbol esta balanceado.
Pregunta 4 — Hash table con linear probing
Dada una tabla hash de tamano con funcion hash y resolucion de colisiones por linear probing, inserte las siguientes claves en orden:
a) Muestre el estado de la tabla despues de cada insercion.
b) ¿Cuantos sondeos (probes) se necesitan para buscar la clave 46?
c) ¿Cuantos sondeos para determinar que la clave 35 no esta en la tabla?
Ver respuesta
a) Inserciones paso a paso:
| Clave | Sondeos | Posicion final | |
|---|---|---|---|
| 22 | slot 0 libre | 0 | |
| 1 | slot 1 libre | 1 | |
| 13 | slot 2 libre | 2 | |
| 11 | slot 0 (22), slot 1 (1), slot 2 (13), slot 3 libre | 3 | |
| 24 | slot 2 (13), slot 3 (11), slot 4 libre | 4 | |
| 33 | slot 0 (22), slot 1 (1), slot 2 (13), slot 3 (11), slot 4 (24), slot 5 libre | 5 | |
| 46 | slot 2 (13), slot 3 (11), slot 4 (24), slot 5 (33), slot 6 libre | 6 |
Tabla final:
Indice: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
Valor: 22 1 13 11 24 33 46 - - - -Notar el clustering primario: las posiciones 0-6 forman un bloque contiguo.
b) Buscar 46: . Sondear posiciones: 2 (13 46), 3 (11 46), 4 (24 46), 5 (33 46), 6 (46 = 46). 5 sondeos.
c) Buscar 35: . Sondear posiciones: 2 (13 35), 3 (11 35), 4 (24 35), 5 (33 35), 6 (46 35), 7 (vacio no existe). 6 sondeos (se detiene al encontrar un slot vacio).
Pregunta 5 — Merge sort: traza completa
Realice la traza completa de Merge Sort sobre el siguiente arreglo:
Muestre:
- Todas las divisiones (fase de division)
- Todas las mezclas (fase de merge)
- El arreglo final
Ver respuesta
Fase de division (top-down):
[42, 15, 63, 8, 31, 27, 50]
/ \
[42, 15, 63] [8, 31, 27, 50]
/ \ / \
[42, 15] [63] [8, 31] [27, 50]
/ \ / \ / \
[42] [15] [8] [31] [27] [50]Fase de merge (bottom-up):
Nivel 1 — merge de pares individuales:
- : comparar vs tomar , luego . Resultado:
- queda solo:
- : comparar vs tomar , luego . Resultado:
- : comparar vs tomar , luego . Resultado:
Nivel 2 — merge de sublistas:
- : comparar vs ; comparar vs ; copiar . Resultado:
- : comparar vs ; comparar vs ; comparar vs ; copiar . Resultado:
Nivel 3 — merge final:
:
| Paso | Comparacion | Se toma | Resultado parcial |
|---|---|---|---|
| 1 | vs | ||
| 2 | vs | ||
| 3 | vs | ||
| 4 | vs | ||
| 5 | vs | ||
| 6 | vs | ||
| 7 | copiar |
Arreglo final:
Complejidad: . Se necesitan niveles de merge, y cada nivel procesa elementos. Espacio extra: .
Pregunta 6 — Max-Heap: insercion y representacion en arreglo
Inserte los siguientes valores uno por uno en un max-heap inicialmente vacio:
Para cada insercion, muestre el arreglo resultante. Indique claramente cuando ocurre un percolate up (swap con el padre).
Ver respuesta
Recordar: en un max-heap, el padre siempre es que sus hijos. Al insertar, se coloca al final y se hace percolate up.
Insert 15:
arr = [15]
15No hay padre. Fin.
Insert 40:
arr = [15, 40] → 40 > 15 (padre) → swap → arr = [40, 15]
40
/
15Insert 30:
arr = [40, 15, 30] → 30 < 40 (padre) → stop
40
/ \
15 30Insert 50:
arr = [40, 15, 30, 50]
50 en indice 3, padre = indice 1 (valor 15). 50 > 15 → swap → arr = [40, 50, 30, 15]
50 en indice 1, padre = indice 0 (valor 40). 50 > 40 → swap → arr = [50, 40, 30, 15]
50
/ \
40 30
/
15Insert 10:
arr = [50, 40, 30, 15, 10]
10 en indice 4, padre = indice 1 (valor 40). 10 < 40 → stop
50
/ \
40 30
/ \
15 10Insert 45:
arr = [50, 40, 30, 15, 10, 45]
45 en indice 5, padre = indice 2 (valor 30). 45 > 30 → swap → arr = [50, 40, 45, 15, 10, 30]
45 en indice 2, padre = indice 0 (valor 50). 45 < 50 → stop
50
/ \
40 45
/ \ /
15 10 30Insert 20:
arr = [50, 40, 45, 15, 10, 30, 20]
20 en indice 6, padre = indice 2 (valor 45). 20 < 45 → stop
50
/ \
40 45
/ \ / \
15 10 30 20Arreglo final:
Verificacion de la propiedad max-heap:
- y (raiz)
- y
- y
Todos los padres son mayores o iguales que sus hijos.
Pregunta 7 — Multiplicacion de matrices
Dadas las matrices:
a) Calcule mostrando cada elemento .
b) Calcule .
c) ¿Se cumple que ? ¿Que propiedad de la multiplicacion de matrices demuestra esto?
d) Si tuvieramos una matriz de dimension y una de dimension , ¿cual seria la dimension de ? ¿Y la complejidad de calcularla?
Ver respuesta
a) :
b) :
c) . Esto demuestra que la multiplicacion de matrices no es conmutativa: en general.
d) .
Las dimensiones internas () coinciden, asi que la multiplicacion esta definida. La complejidad es , o en general .
Pregunta 8 — Complejidad de listas enlazadas y pilas
Responda las siguientes preguntas justificando brevemente:
a) En una lista doblemente enlazada con puntero a tail, ¿cual es la complejidad de eliminar el ultimo elemento? ¿Y en una lista simplemente enlazada sin puntero a tail?
b) Una pila se implementa sobre un arreglo de tamano fijo. ¿Cual es la complejidad de push, pop y top? ¿Que pasa cuando la pila esta llena y se hace push?
c) Explique por que una cola NO se puede implementar eficientemente con una lista simplemente enlazada sin puntero a tail.
Ver respuesta
a)
-
Doubly linked con tail: . Se accede al ultimo nodo via
tail, se actualizatail = tail->prev, y se elimina el nodo. Gracias al punteroprev, no es necesario recorrer la lista. -
Singly linked sin tail: . Para eliminar el ultimo, se necesita actualizar el puntero
nextdel penultimo nodo, pero no hay forma de encontrarlo sin recorrer toda la lista desdehead.
b)
push: — incrementar el indicetopy escribir el valor.pop: — leer el valor entopy decrementar.top(peek): — leer el valor en el indicetopsin modificar.
Cuando la pila esta llena y se hace push:
- Tamano fijo: se produce un stack overflow (error). Se debe verificar antes de insertar.
- Tamano dinamico (como
std::vector): se redimensiona el arreglo (tipicamente al doble), copiando los elementos. Elpushindividual es en ese caso, pero es amortizado porque las redimensiones son infrecuentes.
c) Una cola necesita enqueue al final y dequeue del frente:
- Dequeue del frente: con singly linked (avanzar
head). - Enqueue al final: Sin puntero a
tail, hay que recorrer toda la lista para encontrar el ultimo nodo, lo cual es .
Con puntero a tail, enqueue tambien es , haciendo la implementacion eficiente. Por eso las colas con listas enlazadas siempre usan puntero a tail.
Pregunta 9 — BST: eliminacion con dos hijos
Dado el siguiente BST:
40
/ \
25 60
/ \ / \
15 30 50 75
/ /
28 70
Elimine el nodo 40 (la raiz). Muestre el proceso completo:
a) ¿Cual es el sucesor inorden de 40?
b) Muestre el arbol paso a paso despues de la eliminacion.
c) Verifique que el arbol resultante sigue cumpliendo la propiedad BST escribiendo el recorrido inorden.
Ver respuesta
a) Sucesor inorden de 40:
El sucesor inorden es el menor valor del subarbol derecho. Partiendo de 40:
- Ir al hijo derecho: 60
- Ir todo a la izquierda: 50 (no tiene hijo izquierdo)
Sucesor inorden = 50.
b) Proceso de eliminacion:
Paso 1: Nodo 40 tiene dos hijos → caso 3 (reemplazar con sucesor inorden).
Paso 2: Copiar el valor del sucesor (50) al nodo raiz.
Paso 3: Eliminar el nodo 50 del subarbol derecho. El nodo 50 es una hoja (no tiene hijos), asi que simplemente se borra.
Arbol original: Despues de reemplazar 40→50 Despues de borrar 50 original:
40 50 50
/ \ / \ / \
25 60 25 60 25 60
/ \ / \ / \ / \ / \ \
15 30 50 75 15 30 50 75 15 30 75
/ / / / / /
28 70 28 70 28 70Arbol final:
50
/ \
25 60
/ \ \
15 30 75
/ /
28 70c) Recorrido inorden del arbol resultante:
Verificacion: la secuencia esta en orden ascendente, lo que confirma que la propiedad BST se mantiene.
(Nota: en el arbol original, el inorden era . Al eliminar 40, desaparece de la secuencia y todo lo demas se mantiene.)
Pregunta 10 — Verdadero o Falso
Para cada afirmacion, indique si es Verdadera (V) o Falsa (F) y justifique brevemente.
a) “El recorrido inorden de un arbol AVL siempre produce los datos en orden ascendente.”
b) “En un Red-Black tree, todo camino desde la raiz hasta una hoja NIL tiene el mismo numero total de nodos.”
c) “Quadratic probing con tabla de tamano primo y factor de carga garantiza encontrar un slot libre.”
d) “La complejidad de Heap Sort es en el peor caso, y el algoritmo es estable.”
e) “Para reconstruir de forma unica un arbol binario, basta con conocer el recorrido preorden y el recorrido postorden.”
Ver respuesta
a) VERDADERO.
Un arbol AVL es un BST auto-balanceado. Todo AVL cumple la propiedad BST (izquierdo < nodo < derecho), y el recorrido inorden de cualquier BST produce los datos en orden ascendente. El balanceo AVL no afecta esta propiedad, solo garantiza que la altura sea .
b) FALSO.
En un Red-Black tree, todo camino raiz-hoja NIL tiene el mismo numero de nodos negros (propiedad 5: black-height), NO el mismo numero total de nodos. Los caminos pueden tener diferente cantidad de nodos rojos intercalados.
c) VERDADERO.
Se puede demostrar matematicamente que con primo y , los sondeos cuadraticos para generan posiciones distintas, garantizando encontrar un slot libre. Si o no es primo, esta garantia se pierde.
d) FALSO (parcialmente).
La complejidad de Heap Sort si es en el peor caso — eso es correcto. Sin embargo, Heap Sort NO es estable. Durante el proceso de percolateDown, los elementos pueden saltar niveles del arbol, desordenando elementos con la misma clave. La afirmacion es falsa porque dice que es estable.
e) FALSO.
Con preorden + postorden, el arbol binario NO queda determinado de forma unica (es ambiguo cuando un nodo tiene un solo hijo, porque no se puede distinguir si es hijo izquierdo o derecho). Para reconstruir de forma unica se necesita:
- Preorden + inorden, o
- Postorden + inorden.
El inorden es la clave porque permite determinar que nodos van a la izquierda y cuales a la derecha de cada raiz.