Hub / EDA / Parciales / Quiz de practica — Parcial 2

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:

  1. O(nlogn)O(n \log n)
  2. O(n2)O(n^2)
  3. O(n)O(n)
  4. O(logn)O(\log n)

b) ¿Cual de los siguientes algoritmos de ordenamiento tiene el mejor caso en O(n)O(n)?

  1. Selection sort
  2. Merge sort
  3. Insertion sort
  4. Heap sort

c) ¿Cual de las siguientes afirmaciones sobre algoritmos de ordenamiento es correcta?

  1. Quick sort siempre es O(nlogn)O(n \log n)
  2. Merge sort usa O(1)O(1) de memoria extra
  3. Heap sort es estable
  4. Bubble sort es estable
Ver respuesta

a) Respuesta: 3 — O(n)O(n)

buildHeap con sift-down es O(n)O(n), NO O(nlogn)O(n \log n). La intuicion es que la mayoria de nodos estan cerca del fondo del arbol y hacen poco trabajo. Formalmente, la suma k=0lognn2k+1k\sum_{k=0}^{\log n} \frac{n}{2^{k+1}} \cdot k converge a O(n)O(n) por serie geometrica.

b) Respuesta: 3 — Insertion sort

Insertion sort tiene mejor caso O(n)O(n) cuando el arreglo ya esta ordenado (solo hace n1n-1 comparaciones, cero swaps). Selection sort siempre es O(n2)O(n^2) porque busca el minimo en toda la parte no ordenada. Merge sort siempre es O(nlogn)O(n \log n). Heap sort siempre es O(nlogn)O(n \log n).

c) Respuesta: 4 — Bubble sort es estable

  • Quick sort tiene peor caso O(n2)O(n^2) (datos ya ordenados con mal pivote) — falso.
  • Merge sort usa O(n)O(n) 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:

35,20,45,10,25,40,55,5,3035, 20, 45, 10, 25, 40, 55, 5, 30

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      30

Arbol final:

              35
            /    \
          20      45
         / \     /  \
       10   25  40   55
      /      \
     5       30

b) 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:

50,30,70,20,40,1050, 30, 70, 20, 40, 10

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   40

Hasta aqui todo esta balanceado. Todos los BF estan en 1.

Insert 10:    50 (BF=+2)  ← ¡DESBALANCEADO!
             / \
           30   70 (BF=0)
          / \
        20   40
       /
     10

a) El desbalanceo ocurre al insertar 10. El nodo 50 tiene BF=h(izq)h(der)=31=+2BF = h(izq) - h(der) = 3 - 1 = +2.

b) Caso LL: BF(50)=+2BF(50) = +2 y BF(30)=+10BF(30) = +1 \geq 0. 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
  /
10

Despues de la rotacion simple derecha en 50:

         30
        /  \
      20    50
     /     / \
   10    40   70

d) 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: h(izq)=2,h(der)=2BF=0h(izq)=2, h(der)=2 \Rightarrow BF=0
  • Nodo 20: h(izq)=1,h(der)=0BF=+1h(izq)=1, h(der)=0 \Rightarrow BF=+1
  • Nodo 50: h(izq)=1,h(der)=1BF=0h(izq)=1, h(der)=1 \Rightarrow BF=0
  • Nodos 10, 40, 70: hojas, BF=0BF=0

Todos los BF estan en {1,0,+1}\{-1, 0, +1\} — el arbol esta balanceado.


Pregunta 4 — Hash table con linear probing

Dada una tabla hash de tamano m=11m = 11 con funcion hash h(k)=kmod11h(k) = k \mod 11 y resolucion de colisiones por linear probing, inserte las siguientes claves en orden:

22,1,13,11,24,33,4622, 1, 13, 11, 24, 33, 46

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:

Claveh(k)=kmod11h(k) = k \mod 11SondeosPosicion final
2222mod11=022 \mod 11 = 0slot 0 libre0
11mod11=11 \mod 11 = 1slot 1 libre1
1313mod11=213 \mod 11 = 2slot 2 libre2
1111mod11=011 \mod 11 = 0slot 0 (22), slot 1 (1), slot 2 (13), slot 3 libre3
2424mod11=224 \mod 11 = 2slot 2 (13), slot 3 (11), slot 4 libre4
3333mod11=033 \mod 11 = 0slot 0 (22), slot 1 (1), slot 2 (13), slot 3 (11), slot 4 (24), slot 5 libre5
4646mod11=246 \mod 11 = 2slot 2 (13), slot 3 (11), slot 4 (24), slot 5 (33), slot 6 libre6

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: h(46)=2h(46) = 2. Sondear posiciones: 2 (13 \neq 46), 3 (11 \neq 46), 4 (24 \neq 46), 5 (33 \neq 46), 6 (46 = 46). 5 sondeos.

c) Buscar 35: h(35)=2h(35) = 2. Sondear posiciones: 2 (13 \neq 35), 3 (11 \neq 35), 4 (24 \neq 35), 5 (33 \neq 35), 6 (46 \neq 35), 7 (vacio \Rightarrow 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:

[42,15,63,8,31,27,50][42, 15, 63, 8, 31, 27, 50]

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:

  • [42]+[15][42] + [15]: comparar 4242 vs 1515 \Rightarrow tomar 1515, luego 4242. Resultado: [15,42][15, 42]
  • [63][63] queda solo: [63][63]
  • [8]+[31][8] + [31]: comparar 88 vs 3131 \Rightarrow tomar 88, luego 3131. Resultado: [8,31][8, 31]
  • [27]+[50][27] + [50]: comparar 2727 vs 5050 \Rightarrow tomar 2727, luego 5050. Resultado: [27,50][27, 50]

Nivel 2 — merge de sublistas:

  • [15,42]+[63][15, 42] + [63]: comparar 1515 vs 631563 \Rightarrow 15; comparar 4242 vs 634263 \Rightarrow 42; copiar 6363. Resultado: [15,42,63][15, 42, 63]
  • [8,31]+[27,50][8, 31] + [27, 50]: comparar 88 vs 27827 \Rightarrow 8; comparar 3131 vs 272727 \Rightarrow 27; comparar 3131 vs 503150 \Rightarrow 31; copiar 5050. Resultado: [8,27,31,50][8, 27, 31, 50]

Nivel 3 — merge final:

[15,42,63]+[8,27,31,50][15, 42, 63] + [8, 27, 31, 50]:

PasoComparacionSe tomaResultado parcial
11515 vs 8888[8][8]
21515 vs 27271515[8,15][8, 15]
34242 vs 27272727[8,15,27][8, 15, 27]
44242 vs 31313131[8,15,27,31][8, 15, 27, 31]
54242 vs 50504242[8,15,27,31,42][8, 15, 27, 31, 42]
66363 vs 50505050[8,15,27,31,42,50][8, 15, 27, 31, 42, 50]
7copiar 63636363[8,15,27,31,42,50,63][8, 15, 27, 31, 42, 50, 63]

Arreglo final: [8,15,27,31,42,50,63][8, 15, 27, 31, 42, 50, 63]

Complejidad: O(nlogn)O(n \log n). Se necesitan log27=3\lceil \log_2 7 \rceil = 3 niveles de merge, y cada nivel procesa n=7n = 7 elementos. Espacio extra: O(n)O(n).


Pregunta 6 — Max-Heap: insercion y representacion en arreglo

Inserte los siguientes valores uno por uno en un max-heap inicialmente vacio:

15,40,30,50,10,45,2015, 40, 30, 50, 10, 45, 20

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 \geq que sus hijos. Al insertar, se coloca al final y se hace percolate up.

Insert 15:

arr = [15]

  15

No hay padre. Fin.

Insert 40:

arr = [15, 40]  →  40 > 15 (padre) → swap  →  arr = [40, 15]

  40
 /
15

Insert 30:

arr = [40, 15, 30]  →  30 < 40 (padre) → stop

    40
   /  \
 15    30

Insert 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
/
15

Insert 10:

arr = [50, 40, 30, 15, 10]
10 en indice 4, padre = indice 1 (valor 40). 10 < 40 → stop

      50
     /  \
   40    30
  / \
15   10

Insert 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  30

Insert 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  20

Arreglo final: [50,40,45,15,10,30,20][50, 40, 45, 15, 10, 30, 20]

Verificacion de la propiedad max-heap:

  • 504050 \geq 40 y 504550 \geq 45 (raiz)
  • 401540 \geq 15 y 401040 \geq 10
  • 453045 \geq 30 y 452045 \geq 20

Todos los padres son mayores o iguales que sus hijos.


Pregunta 7 — Multiplicacion de matrices

Dadas las matrices:

A=(3124),B=(5012)A = \begin{pmatrix} 3 & 1 \\ 2 & 4 \end{pmatrix}, \quad B = \begin{pmatrix} 5 & 0 \\ 1 & 2 \end{pmatrix}

a) Calcule C=A×BC = A \times B mostrando cada elemento cij=kaikbkjc_{ij} = \sum_k a_{ik} \cdot b_{kj}.

b) Calcule D=B×AD = B \times A.

c) ¿Se cumple que C=DC = D? ¿Que propiedad de la multiplicacion de matrices demuestra esto?

d) Si tuvieramos una matriz EE de dimension 3×23 \times 2 y una FF de dimension 2×52 \times 5, ¿cual seria la dimension de E×FE \times F? ¿Y la complejidad de calcularla?

Ver respuesta

a) C=A×BC = A \times B:

c11=a11b11+a12b21=35+11=15+1=16c_{11} = a_{11} \cdot b_{11} + a_{12} \cdot b_{21} = 3 \cdot 5 + 1 \cdot 1 = 15 + 1 = 16

c12=a11b12+a12b22=30+12=0+2=2c_{12} = a_{11} \cdot b_{12} + a_{12} \cdot b_{22} = 3 \cdot 0 + 1 \cdot 2 = 0 + 2 = 2

c21=a21b11+a22b21=25+41=10+4=14c_{21} = a_{21} \cdot b_{11} + a_{22} \cdot b_{21} = 2 \cdot 5 + 4 \cdot 1 = 10 + 4 = 14

c22=a21b12+a22b22=20+42=0+8=8c_{22} = a_{21} \cdot b_{12} + a_{22} \cdot b_{22} = 2 \cdot 0 + 4 \cdot 2 = 0 + 8 = 8

C=A×B=(162148)C = A \times B = \begin{pmatrix} 16 & 2 \\ 14 & 8 \end{pmatrix}

b) D=B×AD = B \times A:

d11=53+02=15d_{11} = 5 \cdot 3 + 0 \cdot 2 = 15

d12=51+04=5d_{12} = 5 \cdot 1 + 0 \cdot 4 = 5

d21=13+22=7d_{21} = 1 \cdot 3 + 2 \cdot 2 = 7

d22=11+24=9d_{22} = 1 \cdot 1 + 2 \cdot 4 = 9

D=B×A=(15579)D = B \times A = \begin{pmatrix} 15 & 5 \\ 7 & 9 \end{pmatrix}

c) CDC \neq D. Esto demuestra que la multiplicacion de matrices no es conmutativa: ABBAAB \neq BA en general.

d) E3×2×F2×5=G3×5E_{3 \times 2} \times F_{2 \times 5} = G_{3 \times 5}.

Las dimensiones internas (22) coinciden, asi que la multiplicacion esta definida. La complejidad es O(mnp)=O(325)=O(30)O(m \cdot n \cdot p) = O(3 \cdot 2 \cdot 5) = O(30), o en general O(mnp)O(mnp).


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: O(1)O(1). Se accede al ultimo nodo via tail, se actualiza tail = tail->prev, y se elimina el nodo. Gracias al puntero prev, no es necesario recorrer la lista.

  • Singly linked sin tail: O(n)O(n). Para eliminar el ultimo, se necesita actualizar el puntero next del penultimo nodo, pero no hay forma de encontrarlo sin recorrer toda la lista desde head.

b)

  • push: O(1)O(1) — incrementar el indice top y escribir el valor.
  • pop: O(1)O(1) — leer el valor en top y decrementar.
  • top (peek): O(1)O(1) — leer el valor en el indice top sin 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. El push individual es O(n)O(n) en ese caso, pero es O(1)O(1) amortizado porque las redimensiones son infrecuentes.

c) Una cola necesita enqueue al final y dequeue del frente:

  • Dequeue del frente: O(1)O(1) 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 O(n)O(n).

Con puntero a tail, enqueue tambien es O(1)O(1), 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      70

Arbol final:

          50
        /    \
      25      60
     / \       \
   15   30      75
        /       /
      28      70

c) Recorrido inorden del arbol resultante:

15,25,28,30,50,60,70,7515, 25, 28, 30, 50, 60, 70, 75

Verificacion: la secuencia esta en orden ascendente, lo que confirma que la propiedad BST se mantiene.

(Nota: en el arbol original, el inorden era 15,25,28,30,40,50,60,70,7515, 25, 28, 30, 40, 50, 60, 70, 75. 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 λ<0.5\lambda < 0.5 garantiza encontrar un slot libre.”

d) “La complejidad de Heap Sort es O(nlogn)O(n \log n) 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 O(logn)O(\log n).

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 mm primo y λ<0.5\lambda < 0.5, los sondeos cuadraticos (h(k)+i2)modm(h(k) + i^2) \mod m para i=0,1,,m/2i = 0, 1, \ldots, \lfloor m/2 \rfloor generan posiciones distintas, garantizando encontrar un slot libre. Si λ0.5\lambda \geq 0.5 o mm no es primo, esta garantia se pierde.

d) FALSO (parcialmente).

La complejidad de Heap Sort si es O(nlogn)O(n \log n) 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.